Donnez vie à vos documents numériques !
 

Verrouillage de plusieurs champs sauf certains suite à action sur bouton

abracadabraPDF Forums PDF – Général Verrouillage de plusieurs champs sauf certains suite à action sur bouton

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45291
    stefan13
    Participant

    Bonjour,

    J’ai un formulaire avec un certain nombre de champs (Texte, liste, case à cocher,…).
    Je souhaiterai avec un champ bouton faire un peu comme une signature numérique, à savoir, verrouiller tous les champs en amont (avant) de ce bouton et laisser déverrouiller les champs en aval (après) de ce bouton.
    J’utilise ce code qui fonctionne avec 1 critère :

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if  (f.substring(0,12) != “Notification”)
    this.getField(f).readonly = true;

    Mais dès que je rajoute un autre critère soit 2 au total, cela ne fonctionne plus

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if  ((f.substring(0,12) != “Notification”) || (f.substring(0,4) != “Visa”))
    this.getField(f).readonly = true;

    Je ne sais comment faire et je souhaiterai avoir de l’aide.

    Je vous en remercie par avance.

    Stéphan

Affichage de 34 réponses de 1 à 34 (sur un total de 34)
  • Auteur
    Réponses
  • #59887
    Merlin
    Maître des clés

    Bonjour et bienvenue.

    Il manque 3 accolades dans ce script, 2 ne sont pas indispensables mais la dernière si.

    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if  ((f.substring(0,12) != “Notification”) || (f.substring(0,4) != “Visa”))
    {this.getField(f).readonly = true;}
    }

    #59888
    stefan13
    Participant

    Merlin bonjour,

    Je te remercie pour la réponse mais cela ne fonctionne toujours pas.
    Je travaille sur Adobe Acrobat X Pro. Je ne sais pas si la version peut y faire.
    Je continue à chercher.

    #59889
    bebarth
    Maître des clés

    bonjour,
    avez-vous essayé avec :

    if  ((f.name != “Notification”) || (f.name != “Visa”))

    sinon, est-il possible d’avoir un fichier d’essai pour voir à quoi cela ressemble ?
    @+
    :bonjour:

    #59890
    Merlin
    Maître des clés

    Adobe Acrobat X Pro

    Sur Mac OS ou sur Windows ?
    Parce-que concernant le JavaScript Acrobat X pour Mac est une version maudite, buggée jusqu’à la moelle.
    :idee:

    D’ailleurs Acrobat X va arriver en fin de vie commerciale dans quelques jours, le 15 novembre.

    #59891
    stefan13
    Participant

    oups désolé j’ai oublié.
    je suis sur Windows 7

    #59892
    Merlin
    Maître des clés

    Non, RAS du coté Windows.

    #59893
    stefan13
    Participant

    Je ne comprend pas moi-même.
    Pour adobe acrobat X Pro, je n’ai pas tellement le choix, c’est mon boulot qui me l’impose.
    Merci quand même.

    #59894
    Merlin
    Maître des clés

    Je plussoie.

    sinon, est-il possible d’avoir un fichier d’essai pour voir à quoi cela ressemble ?

    #59895
    stefan13
    Participant

    bonjour,
    avez-vous essayé avec :

    if  ((f.name != “Notification”) || (f.name != “Visa”))

    sinon, est-il possible d’avoir un fichier d’essai pour voir à quoi cela ressemble ?
    @+
    :bonjour:

    Comment te l’envoyer sans le mettre en ligne ? C’est un document du travail.

    #59896
    Merlin
    Maître des clés

    Tu extrais la page, tu la découpes, tu copie-colles les champs (et les libellés) sur une page vierge…

    Ceci dit, pour répondre sur le fond, je crois que tu gagnerais un temps fou en utilisant la Convention de dénomination des champs de formulaire.
    Une seule ligne de script adressée au “champ (virtuel) parent” et c’est réglé.
    Voir : http://abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/
    (chapitre 2)

    :Smiley03:

    #59897
    stefan13
    Participant

    Désolé mais je n’y avais pas pensé. Merci Merlin.
    Cela concerne la page 11/13 (1ère page donc) et le bouton où se trouve le code se nomme : Validation signature N+1 (Appréciation_générale_bouton_visa_N+1)
    je me sers du bouton caché pour supprimer la lecture seule de tous les champs : il se nomme Appréciation_générale_bouton_déval_visa_N+1. Il se trouve juste en dessous du bouton de validation signature n+1.
    Le code était avant de tester et après l’aide de Merlin :

    Code:

    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if ((f.substring(0,12) != “Notification”) || (f.substring(0,4) != “Visa”) || (f.name != “Appréciation_générale_bouton_déval_visa_N+1”))
    {this.getField(f).readonly = true;}
    }

    #59898
    bebarth
    Maître des clés

    …si j’ai bien compris, il faut que le bouton verrouille uniquement les champs “Appréciation” (en amont) et pas les autres (en aval).
    si c’est le cas, une seule ligne suffit en utilisant la Convention de dénomination des champs de formulaire :
    this.getField(“Appréciation”).readonly = true;

    ai-je bien compris ?
    @+
    :bonjour:

    #59899
    stefan13
    Participant

    oui c’est effectivement ça : mise en lecture seule de tous les champs du formulaire (ceux en amont) sauf ceux commençant par “Visa” ou “Notification” ainsi que le bouton que l’on voit pas dans le pdf “Appréciation_générale_bouton_déval_visa_N+1″ (ceux en aval).
    L’utilisation de la convention de dénomination va me poser des problèmes lors de l’extraction de ces données sous excel.

    #59900
    bebarth
    Maître des clés

    je regarde !
    …et sinon, le fichier joint correspondait-il ?
    @+
    :bonjour:

    #59901
    stefan13
    Participant

    oui c’est bien ça. ça marche nickel et je te remercie mais il faut que je garde la dénomination des champs en entier.
    le code fonctionne bien avec un critère mais dès que l’on en rajoute un en faisant un “OU”, cela ne fonctionne pas.
    Je te redonne le code utilisé initialement avec l’aide de Merlin :

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);if ((f.substring(0,12) != “Notification”) || (f.substring(0,4) != “Visa”) || (f.name != “Appréciation_générale_bouton_dév al_visa_N+1”))
    {this.getField(f).readonly = true;}
    }
    #59902
    bebarth
    Maître des clés

    Bonjour,
    si l’on doit garder le nom des champs pour l’extraction des données, je présume qu’on peut modifier le nom des boutons validation/dévalidation ! on a plus qu’à s’occuper des champs dont le nom commence par “Appréciation” (pourquoi s’occuper des autre champs ???).
    2 solutions : si l’on a peu de champs on peut les traiter un par un (ici 4 champs), sinon on fait une recherche uniquement sur les champs dont le nom commence par “Appréciation”.
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if (f.substring(0,12) == “Appréciation”)
    {this.getField(f).readonly = true;}
    }
    Pour la dévalidation, on peut traiter tous les champs.
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    this.getField(f).readonly = false;}

    Correct ???
    @+
    :bonjour:

    #59903
    Merlin
    Maître des clés

    if (f.substring(0,12) == “Appréciation”)

    Attention aux accents et aux caractères spéciaux dans les noms de champs.
    Quand ça se met à déconner on a parfois du mal à comprendre d’où ça vient, et la correction impose beaucoup de changements.

    Le plus sage est de respecter la syntaxe web : que de l’Ascii sans les espaces ni les caractères spéciaux.

    Je n’ai jamais compris pourquoi Acrobat autorise les fantaisies dans les noms des champs alors que ça peut être très pénalisant.
    Même si 90% des utilisateurs font des formulaires “basiques” pour lesquels ça n’a pas vraiment d’importance.
    :doute:

    #59904
    stefan13
    Participant

    Salut,

    Désolé de ne pas avoir répondu plus tôt.
    Merci bebarth et Merlin pour votre aide. Cela m’a grandement aidé.
    Voici le code initial :

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);if ((f.substring(0,12) != “Notification”) || (f.substring(0,4) != “Visa”) || (f.name != “Appréciation_générale_bouton_dév al_visa_N+1”))
    {this.getField(f).readonly = true;}
    }

    Si on veut utiliser le nom du champ en entier, cela ne fonctionne pas. Ne me demandez pas pourquoi, je n’en sais rien. J’ai essayé avec les accents, sans les accents, avec la convention de dénomination mais cela ne fonctionne pas.

    Code:
    (f.name != “Appréciation_générale_bouton_dév al_visa_N+1”)

    Par contre, le code fonctionne très bien avec la fonction substring.

    Code:
    (f.substring(0,34) == “Appréciation_générale_bouton_dév al”)

    J’ai pu tester mes différents champs avec le OU et cela marche nickel.
    Le code final devient donc le suivant :

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if ((f.substring(0,12) == “Notification”) || (f.substring(0,4) == “Visa”) || (f.substring(0,34) == “Appréciation_générale_bouton_dév al”))
    {this.getField(f).readonly = false;}
    else
    {this.getField(f).readonly = true;}
    }

    Peut être est-ce lié à ma version d’Acrobat (Version X Pro) ?

    En tout cas un grand merci à vous.

    Stéphan

    #59905
    Merlin
    Maître des clés

    :bonjour:

    #59906
    o.vernay
    Membre

    Bonjour,
    Nouveau sur le forum, je suis à la recherche d’une solution similaire.
    Au passage, bravo pour le boulot, c’est a peu près le seul endroit valable pour trouver des réponses.

    Dans mon PDF, j’ai 6 champs de formulaire. Trois sont à remplir par un opérateur et 3 autres par le client.
    J’aimerais qu’une fois que l’opérateur ait rempli ses champs, ces derniers soient verrouillés et que les 3 champs du client soit toujours disponibles…

    J’ai essayé de construire un JS à partir de vos commentaires, mais ça me verrouille tous les champs !

    Code:
    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if ((f.substring(0,12) != “montant”) || (f.substring(0,12) != “coupon”) || (f.substring(0,12) != “date”))
    {this.getField(f).readonly = true;}
    }

    Merci pour votre aide
    Oliv

    #59907
    Merlin
    Maître des clés

    Bonjour et bienvenue.

    Tu te casses la tête pour pas grand-chose puisqu’il n’y a que 3 champs, ça fait moinsde lignes :  :Smiley03:

    Code:
    this.getField(“CHAMP1”).readonly = true;
    this.getField(“CHAMP2”).readonly = true;
    this.getField(“CHAMP3”).readonly = true;

    Sinon dans l’esprit il faudrait modifier ton code ainsi :

    for (var i = 0; i < this.numFields; i++) {
    var f = this.getNthFieldName(i);
    if ((f.substring(0,8) != “montant”) || (f.substring(0,7) != “coupon”) || (f.substring(0,5) != “date”))
    {this.getField(f).readonly = true;}
    }

    Voir : https://www.w3schools.com/jsref/jsref_substring.asp

    #59908
    o.vernay
    Membre

    Salut @Merlin
    Yes c’est plus court mais ça ne fonctionne pas. Par contre, j’ai tenté ce code qui fonctionne plutôt bien…

    Code:
    for (var i = 0; i < this.numFields; i++) {
      var f = this.getNthFieldName(i);
      this.getField(“montant”).readonly = true;
      this.getField(“coupon”).readonly = true;
      this.getField(“date”).readonly = true;
    }

    Maintenant, il ne me reste plus qu’à tester la visibilité de tout ça à l’enregistrement et à l’impression.

    Many thanks (et bien vu pour le W3Schools -> parfait pour les noobs comme moi ^^)

    #59909
    bebarth
    Maître des clés

    bonsoir,

    Code:
    for (var i = 0; i < this.numFields; i++) {
      var f = this.getNthFieldName(i);

    }

    Cette boucle “for” ne sert à rien !!!

    Ici, que l’on utilise substring (2 positions) ou substr (position + longueur) c’est la même chose, mais il y a une petite erreur :
    if ((f.substring(0,7) != “montant”) || (f.substring(0,6) != “coupon”) || (f.substring(0,4) != “date”))
    ou (comme c’est le nom complet)
    if ((f.substring(0) != “montant”) || (f.substring(0) != “coupon”) || (f.substring(0) != “date”))
    ou
    if ((f.substr(0,7) != “montant”) || (f.substr(0,6) != “coupon”) || (f.substr(0,4) != “date”))
    ou (comme c’est le nom complet)
    if ((f.substr(0) != “montant”) || (f.substr(0) != “coupon”) || (f.substr(0) != “date”))
    @+
    :bonjour:

    #59910
    Merlin
    Maître des clés

    Par contre, j’ai tenté ce code qui fonctionne plutôt bien…

    Je te confirme que la boucle ne sert à rien, tu as surtout de la chance qu’elle ne parte pas en boucle infinie…
    Pourquoi ne pas plutôt utiliser juste les 3 lignes que j’ai donné ci-dessus ?

    Code:
    this.getField(“montant”).readonly = true;
    this.getField(“coupon”).readonly = true;
    this.getField(“date”).readonly = true;
    #59911
    o.vernay
    Membre

    Hello à tous,
    Merci pour vos réponses. Comme je n’y connais pas grand chose, ça m’aide à avancer =)

    Alors plutôt qu’un long discours, je vous transmets le fichier ^_^

    @Merlin, en fait l’intégration des 3 lignes me bloque tout le formulaire alors que j’aimerais avoir les 3 champs “client” disponibles tout le temps…
    Dans l’idée, les 3 champs de gauche sont tout le temps libre et les 3 champs de droite doivent être verrouillés une fois que le champ “date” est renseigné.

    A plus

    #59912
    bebarth
    Maître des clés

    bonjour,
    Voici ce que je te propose en script de calcul du champ “date” :

    Code:
    if (this.getField(“montant”).value!=0 && this.getField(“coupon”).value!=”CODE” && event.target.value!=”31/12/2019″) {
        this.getField(“montant”).readonly=true;
        this.getField(“coupon”).readonly=true;
        event.target.readonly=true;
    } else {
        this.getField(“montant”).readonly=false;
        this.getField(“coupon”).readonly=false;
        event.target.readonly=false;
    }

    Par contre, il ne faut pas se tromper, sinon impossible de modifier. Il faudrait peut-être mettre une fenêtre d’alerte qui récapitule les données afin de valider.
    Si quelqu’un à Acrobat Pro, il peut facilement  modifier le montant… Il faudrait peut-être mieux aplatir ces champs, mais si tu débutes ça devient un peut plus compliqué pour juste aplatir ces 3 champs.
    @+
    :bonjour:

    #59913
    Merlin
    Maître des clés

    Oui, que se passe-t-il si on se trompe de date ou si on change d’avis ?

    #59914
    o.vernay
    Membre

    Super, ce nouveau code fonctionne nickel. Et pour la fenêtre de validation c’est une super idée. Tu aurais une piste pour savoir comment je peux faire ça ?

    Le but pour le technicien va être de faire une copie du fichier “maître” et de le remplir avec le conditions du coupon qu’il aura créé dans notre back office (montant, nom du coupon et date de validité).
    Ensuite il l’envoie au client par mail et c’est le client qui se débrouille pour faire l’impression etc, etc…

    1/ les données sont créés dans le BO et figées, on ne peut plus les modifier
    2/ l’opérateur saisit ces données sur le chèque cadeau puis l’envoie par mail au client
    3/ le client remplit les infos qui l’intéresse puis l’offre à son destinataire (s’il sait comment modifier un PDF, il pourrait modifier le montant ou la date ou autre, mais ces infos ne pourraient pas être “rapprochées” des infos de notre back office).

    Mon but ici est simplement d’aider nos opérateurs dans la saisie de leur données en ayant un fichier un peu “sexy” et de limiter au maximum la possibilité de modification après coup (surtout côté client).

    Encore merci pour le coup de main !

    #59915
    Merlin
    Maître des clés

    pour la fenêtre de validation c’est une super idée. Tu aurais une piste pour savoir comment je peux faire ça ?

    if (app.alert({cMsg: “Texte du message“, cTitle: “Titre du message“, nIcon: 2, nType: 2}) == 4) {
    this.getField(“montant“).readonly = true;
    this.getField(“coupon“).readonly = true;
    this.getField(“date“).readonly = true;
    }

    Remplace le 2 par un 1 pour changer les boutons Oui/Non en boutons OK/Annuler.

    Quel logiciel utilisent les techniciens ?
    Acrobat Pro/Standard, Acrobat Reader ou autre ?

    #59916
    Merlin
    Maître des clés

    PS : si c’est le même opérateur qui fait ça toute la journée on peut ajouter dans l’alerte une coche “Ne plus afficher” pour lui épargner le plaisir de devoir faire 100+ fois la même chose.
    :Smiley03:

    #59917
    o.vernay
    Membre

    GÉNIAL, merci pour ce petit ajout !

    PS : si c’est le même opérateur qui fait ça toute la journée on peut ajouter dans l’alerte une coche “Ne plus afficher” pour lui épargner le plaisir de devoir faire 100+ fois la même chose.
    :Smiley03:

    Et je veux bien cette petite option de case à cocher.
    Même s’il ne font pas ça toute la journée, ça pourrait être sympa pour eux en effet !

    #59918
    bebarth
    Maître des clés

    Voici pour moi :

    Code:
    var texteMessage=”Vous avez indiqué :n• Un montant de “+this.getField(“montant”).value+” €n• Le code “+this.getField(“coupon”).value+”n• La validité jusqu’au “+event.target.value+”nnConfirmez-vous ces informations ?”;
    if (this.getField(“montant”).value!=0 && this.getField(“coupon”).value!=”CODE” && event.target.value!=”31/12/2019″ && app.alert({cMsg: texteMessage, cTitle: “Informations pour Chèque Cadeau”, nIcon: 2, nType: 2}) == 4) {
        this.getField(“montant”).readonly=true;
        this.getField(“coupon”).readonly=true;
        event.target.readonly=true;
    }

    …Et je veux bien cette petite option de case à cocher.

    C’est un peu plus compliqué donc un peu plus long…
    @+
    :bonjour:

    #59919
    o.vernay
    Membre

    Bonsoir Merlin et bebarth,
    Un énorme merci pour l’aide apportée, ce nouveau fichier plaît beaucoup aux opérateurs. Mission accomplie
    :extra:

    Oliv

    #59920
    Merlin
    Maître des clés

    :bonjour:

Affichage de 34 réponses de 1 à 34 (sur un total de 34)
  • Vous devez être connecté pour répondre à ce sujet.