Verrouillage de plusieurs champs sauf certains suite à action sur bouton  (Lu 7271 fois) Partager ce sujet Imprimer

1 B


stefan13  03 novembre 2015 : 17:41

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 :

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

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

IP archivée


Merlin  03 novembre 2015 : 19:04

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

IP archivée


stefan13  05 novembre 2015 : 13:47

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.


IP archivée


bebarth  05 novembre 2015 : 14:43

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:

IP archivée


Merlin  05 novembre 2015 : 14:51

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.

IP archivée


stefan13  05 novembre 2015 : 14:52

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

IP archivée


Merlin  05 novembre 2015 : 14:53

Non, RAS du coté Windows.

IP archivée


stefan13  05 novembre 2015 : 14:55

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.

IP archivée


Merlin  05 novembre 2015 : 14:56

Je plussoie.

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

IP archivée


stefan13  05 novembre 2015 : 15:08

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.




IP archivée


Merlin  05 novembre 2015 : 15:12

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:

IP archivée


stefan13  05 novembre 2015 : 15:16

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 :


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

IP archivée


bebarth  05 novembre 2015 : 16:15

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

IP archivée


stefan13  05 novembre 2015 : 16:31

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.

IP archivée


bebarth  05 novembre 2015 : 16:40

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

IP archivée


stefan13  05 novembre 2015 : 16:50

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 :


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

IP archivée


bebarth  06 novembre 2015 : 08:38

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:

IP archivée


Merlin  06 novembre 2015 : 10:15

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:

IP archivée


stefan13  09 novembre 2015 : 11:59

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 :

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.
(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.
(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 :

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

IP archivée


Merlin  09 novembre 2015 : 12:05

 :bonjour:

IP archivée


o.vernay  04 décembre 2019 : 15:45


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 !


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

IP archivée


Merlin  04 décembre 2019 : 16:22

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:

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

IP archivée


o.vernay  04 décembre 2019 : 18:00

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

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

IP archivée


bebarth  04 décembre 2019 : 19:15

bonsoir,
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:

IP archivée


Merlin  04 décembre 2019 : 19:47

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 ?

this.getField("montant").readonly = true;
this.getField("coupon").readonly = true;
this.getField("date").readonly = true;

IP archivée


o.vernay  Hier à 08:14

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

IP archivée


bebarth  Hier à 09:15

bonjour,
Voici ce que je te propose en script de calcul du champ "date" :
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:

IP archivée


Merlin  Hier à 09:22

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

IP archivée


o.vernay  Hier à 11:02

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 !

IP archivée


Merlin  Hier à 14:29

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 ?

IP archivée


Merlin  Hier à 14:42

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:

IP archivée


o.vernay  Hier à 16:30

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 !

IP archivée


bebarth  Hier à 19:44

Voici pour moi :
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+"\n\nConfirmez-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:

IP archivée


o.vernay  Aujourd'hui à 16:44

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

IP archivée


Merlin  Aujourd'hui à 17:08

 :bonjour:

IP archivée