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 #45291stefan13Participant
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
-
CréateurSujet
-
AuteurRéponses
-
3 novembre 2015 à 18:04 #59887MerlinMaî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;}
}5 novembre 2015 à 12:47 #59888stefan13ParticipantMerlin 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 #59889bebarthMaî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 #59890MerlinMaî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 #59891stefan13Participantoups désolé j’ai oublié.
je suis sur Windows 75 novembre 2015 à 13:53 #59892MerlinMaître des clésNon, RAS du coté Windows.
5 novembre 2015 à 13:55 #59893stefan13ParticipantJe 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 #59894MerlinMaî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 #59895stefan13Participantbonjour,
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 #59896MerlinMaî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 #59897stefan13ParticipantDé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;}
}5 novembre 2015 à 15:15 #59898bebarthMaî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 #59899stefan13Participantoui 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 #59900bebarthMaître des clésje regarde !
…et sinon, le fichier joint correspondait-il ?
@+
:bonjour:5 novembre 2015 à 15:50 #59901stefan13Participantoui 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;}
}6 novembre 2015 à 07:38 #59902bebarthMaî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 < 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:6 novembre 2015 à 09:15 #59903MerlinMaî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 #59904stefan13ParticipantSalut,
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
9 novembre 2015 à 11:05 #59905MerlinMaître des clés:bonjour:
4 décembre 2019 à 14:45 #59906o.vernayMembreBonjour,
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
Oliv4 décembre 2019 à 15:22 #59907MerlinMaî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 < 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;}
}4 décembre 2019 à 17:00 #59908o.vernayMembreSalut @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 ^^)
4 décembre 2019 à 18:15 #59909bebarthMaître des clésbonsoir,
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:4 décembre 2019 à 18:47 #59910MerlinMaî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.vernayMembreHello à 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
5 décembre 2019 à 08:15 #59912bebarthMaître des clésbonjour,
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:5 décembre 2019 à 08:22 #59913MerlinMaître des clésOui, que se passe-t-il si on se trompe de date ou si on change d’avis ?
5 décembre 2019 à 10:02 #59914o.vernayMembreSuper, 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 !
5 décembre 2019 à 13:29 #59915MerlinMaître des cléspour 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 ?5 décembre 2019 à 13:42 #59916MerlinMaître des clésPS : 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:5 décembre 2019 à 15:30 #59917o.vernayMembreGÉ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 !5 décembre 2019 à 18:44 #59918bebarthMaître des clésVoici 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:6 décembre 2019 à 15:44 #59919o.vernayMembreBonsoir Merlin et bebarth,
Un énorme merci pour l’aide apportée, ce nouveau fichier plaît beaucoup aux opérateurs. Mission accomplie :extra:Oliv
6 décembre 2019 à 16:08 #59920MerlinMaître des clés:bonjour:
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.