abracadabraPDF › Forums › PDF – Général › Verrouillage de plusieurs champs sauf certains suite à action sur bouton
- Ce sujet est vide.
-
CréateurSujet
-
3 novembre 2015 à 16:41 #45291
stefan13
ParticipantBonjour,
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
-
CréateurSujet
-
AuteurRéponses
-
3 novembre 2015 à 18:04 #59887
Merlin
Maître des clésBonjour 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;}
}5 novembre 2015 à 12:47 #59888stefan13
ParticipantMerlin 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.5 novembre 2015 à 13:43 #59889bebarth
Maître des clésbonjour,
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:5 novembre 2015 à 13:51 #59890Merlin
Maître des clésAdobe 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.
5 novembre 2015 à 13:52 #59891stefan13
Participantoups désolé j’ai oublié.
je suis sur Windows 75 novembre 2015 à 13:53 #59892Merlin
Maître des clésNon, RAS du coté Windows.
5 novembre 2015 à 13:55 #59893stefan13
ParticipantJe 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.5 novembre 2015 à 13:56 #59894Merlin
Maître des clésJe plussoie.
sinon, est-il possible d’avoir un fichier d’essai pour voir à quoi cela ressemble ?
5 novembre 2015 à 14:08 #59895stefan13
Participantbonjour,
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.
5 novembre 2015 à 14:12 #59896Merlin
Maître des clésTu 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:
5 novembre 2015 à 14:16 #59897stefan13
ParticipantDé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;}
}5 novembre 2015 à 15:15 #59898bebarth
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:5 novembre 2015 à 15:31 #59899stefan13
Participantoui 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.5 novembre 2015 à 15:40 #59900bebarth
Maître des clésje regarde !
…et sinon, le fichier joint correspondait-il ?
@+
:bonjour:5 novembre 2015 à 15:50 #59901stefan13
Participantoui 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;}
}6 novembre 2015 à 07:38 #59902bebarth
Maître des clésBonjour,
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:6 novembre 2015 à 09:15 #59903Merlin
Maître des clésif (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:9 novembre 2015 à 10:59 #59904stefan13
ParticipantSalut,
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
9 novembre 2015 à 11:05 #59905Merlin
Maître des clés:bonjour:
4 décembre 2019 à 14:45 #59906o.vernay
MembreBonjour,
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
Oliv4 décembre 2019 à 15:22 #59907Merlin
Maître des clésBonjour 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;}
}4 décembre 2019 à 17:00 #59908o.vernay
MembreSalut @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 ^^)
4 décembre 2019 à 18:15 #59909bebarth
Maître des clésbonsoir,
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:4 décembre 2019 à 18:47 #59910Merlin
Maître des clésPar 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;5 décembre 2019 à 07:14 #59911o.vernay
MembreHello à tous,
Merci pour vos réponses. Comme je n’y connais pas grand chose, ça m’aide à avancerAlors 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
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.