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
    Membre

    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 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 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 25 réponses de 1 à 25 (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 {
    var f = this.getNthFieldName(i);
    if  ((f.substring(0,12) != « Notification ») || (f.substring(0,4) != « Visa »))
    {this.getField(f).readonly = true;}
    }

    #59888
    stefan13
    Membre

    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
    Membre

    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
    Membre

    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
    Membre

    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
    Membre

    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 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
    Membre

    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
    Membre

    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 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 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 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
    Membre

    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 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 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 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 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   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   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

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