abracadabraPDF › Forums › PDF – Général › Besoin d’aide script PDF affichage/masquage de champ
- Ce sujet est vide.
-
CréateurSujet
-
6 octobre 2018 à 20:51 #45929
extrapitou
MembreBonjour à tous,
Je suis nouveau sur le forum et merci à tous les intervenants de partager leurs connaissances
Je suis novice, je n’ai (n’avais) jamais fait de javascript (ni aucun autre codage informatique d’ailleurs) avant le projet professionnel que je vais vous présenter. Vous allez surement me dire que pour un débutant je ne commence pas par le plus simple mais tant pis
1/ Dans le PDF ci joint, sur la page 2 “descriptif des pièces” j’ai mis dans la case “piece1” un script super long qui permet d’afficher/masquer certains champs en fonction de la pièce sélectionnée. Après avoir fouiller partout dans le forum j’ai trouvé des bouts de script et j’ai adapté à mon pdf, et cool ça marche au poil. Le script est cependant super long, y a t’il des limites techniques à l’utilisation de ce genre de script ? (genre des PDF reader qui buggent ou qui affichent mal) faut-il l’améliorer/simplifier ?
2/ dans le champ “casepiece1” j’ai mis 2 actions, la première qui affiche le champ “casepiece2” lors de la coche -> ça fonctionne, et l’autre qui masque ce champ “casepiece2” -> ça ne fonctionne pas
je ne vois pas le problème
3/ j’ai copié le script inclus dans “piece1” (vu qu’il est fonctionnel), et je l’ai dupliqué dans le champ “piece2” en prenant soin d’adapter le nom des champs concerné par le script, mais malheureusement et bizarrement ça ne fonctionne pas, c’est surement un problème simple mais je ne le vois pas dans le script
Si vous pouviez m’aiguiller un peu car j’avoue que la je sèche, j’espère que vous n’avez pas trop saigné des yeux car je le répète c’est la première fois que je fais du javascript.
Merci d’avance.Julian
-
CréateurSujet
-
AuteurRéponses
-
6 octobre 2018 à 21:07 #64625
extrapitou
MembreEDIT :
Pour le point 2, je vient de voir que c’est l’evenement “actif” ou “non actif” qui fait apparaitre/disparaitre la “casepiece2” donc effectivement ca ne marchera pas. Du coup comment faire car on ne peut pas mettre de script dans une case à cocher vu qu’il n’y a pas d’onglet “calcul”?7 octobre 2018 à 10:56 #64626Merlin
Maître des clésBonjour et bienvenue.
2. Quel est l’intérêt de faire apparaitre un élément pour le masquer juste après lors de l’action suivante ?
1. et 3. On peut écrire des kilomètres de script, ce n’est pas pour la machine que c’est gênant, c’est pour l’humain qui doit débugger, modifier ou maintenir le script. Au bout d’un moment ça devient un vrai casse-tête.
Il faut absolument que tu t’intéresses à la Convention de dénomination des champs de formulaire, ça va te faire supprimer beaucoup de lignes de script et gagner un temps fou : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/duplication-rapide-de-champs-de-formulaire/
:Smiley15:
7 octobre 2018 à 17:15 #64627extrapitou
MembrePour le point 2 effectivement le comportement n’est pas celui voulu. En fait le but était de faire apparaître une case sur la ligne suivante pour permettre d’ajouter une pièce si voulu (et ainsi de suite jusqu’à la ligne 12). Cela permet de ne pas polluer le pdf en n’ayant que des lignes nécessaires au descriptif.
Donc je voulais mettre ceci :if (this.getField(“casepiece1”).isBoxChecked(0))
{
event.target.display = display.visible;
event.target.display = display.hidden;
}
}Mais je ne trouve pas où je pourrait mettre ca dans une case a cocher
Pour le reste merci je vais de ce pas me documenter
7 octobre 2018 à 20:44 #64628bebarth
Maître des clésbonsoir,
Mais je ne trouve pas où je pourrait mettre ca dans une case a cocher
Ce n’est pas un script de calcul sur la case 2 qu’il faut mais un script d’action lorsque tu coche la case 1…
Je n’ai pas eu le temps d’étudier ton script et de voir les cases à montrer ou cacher mais il est certain que pour le simplifier il faudra revoir le nom des champs…
@+
:bonjour:8 octobre 2018 à 09:56 #64629extrapitou
Membrebonsoir,Ce n’est pas un script de calcul sur la case 2 qu’il faut mais un script d’action lorsque tu coche la case 1…
Je n’ai pas eu le temps d’étudier ton script et de voir les cases à montrer ou cacher mais il est certain que pour le simplifier il faudra revoir le nom des champs…
@+
:bonjour:Ok merci effectivement j’essayais pas de la bonne façon
j’ai mis ceci, et ca fait le job :
Code:if (this.getField(“casepiece1”).isBoxChecked(0))
{
this.getField(“casepiece2”).display = display.visible;
}
else
{
this.getField(“casepiece2”).display = display.hidden;
}maintenant il faut que je comprenne cette histoire de denomination de champs
8 octobre 2018 à 10:05 #64630Merlin
Maître des clésQue tu peux simplifier ainsi :
if (event.target.isBoxChecked(0))
{
this.getField(“casepiece2”).display = display.visible;
}
else
{
this.getField(“casepiece2”).display = display.hidden;
}:idee: event.target (cible de l’évènement utilisateur) c’est le champ actif, celui qui est cliqué. Du coup il n’y a pas besoin de préciser son nom.
:Smiley03:maintenant il faut que je comprenne cette histoire de denomination de champs
Dans ton formulaire tu pourrais par exemple nommer tes champs par rangée :
– “rangee1.casePiece”, “rangee1.cuisine”, “rangee1.nbDePiece”, etc.
– “rangee2.casePiece”, “rangee2.cuisine”, “rangee2.nbDePiece”, etc.
– “rangee3.casePiece”, “rangee3.cuisine”, “rangee3.nbDePiece”, etc.Ensuite pour afficher toutes les champs d’une rangée : this.getField(“rangee2“).display = display.visible;
Ce qui affiche tous les champs enfants.Même chose pour masquer, colorer, activer, etc.
8 octobre 2018 à 10:25 #64631bebarth
Maître des clésbonjour,
Attention, diplay and hidden ne signifient pas coché et décoché !!!
La case casepiece2 peut être cochée tout en n’étant pas visible… Que faut-il faire des champs liés à cette case ?
Tu parles de 12 lignes, si ces 12 lignes sont actives et que tu décoches pour rendre invisible une ligne, que doit-il se passer pour les lignes suivantes ??? Elles sont rendues invisibles également ???
@+
:bonjour:9 octobre 2018 à 08:21 #64632extrapitou
MembreQue tu peux simplifier ainsi :
if (event.target.isBoxChecked(0))
{
this.getField(“casepiece2”).display = display.visible;
}
else
{
this.getField(“casepiece2”).display = display.hidden;
}:idee: event.target (cible de l’évènement utilisateur) c’est le champ actif, celui qui est cliqué. Du coup il n’y a pas besoin de préciser son nom.
:Smiley03:Ok oui j’avais cru comprendre la subtilité, merci pour cette confirmation
Dans ton formulaire tu pourrais par exemple nommer tes champs par rangée :
– “rangee1.casePiece”, “rangee1.cuisine”, “rangee1.nbDePiece”, etc.
– “rangee2.casePiece”, “rangee2.cuisine”, “rangee2.nbDePiece”, etc.
– “rangee3.casePiece”, “rangee3.cuisine”, “rangee3.nbDePiece”, etc.Ensuite pour afficher toutes les champs d’une rangée : this.getField(“rangee2“).display = display.visible;
Ce qui affiche tous les champs enfants.Même chose pour masquer, colorer, activer, etc.
Ok je vois le principe, je vais tester merci
9 octobre 2018 à 08:55 #64633extrapitou
Membrebonjour,
Attention, diplay and hidden ne signifient pas coché et décoché !!!
La case casepiece2 peut être cochée tout en n’étant pas visible… Que faut-il faire des champs liés à cette case ?
Tu parles de 12 lignes, si ces 12 lignes sont actives et que tu décoches pour rendre invisible une ligne, que doit-il se passer pour les lignes suivantes ??? Elles sont rendues invisibles également ???
@+
:bonjour:Oui j’ai bien noté que les display sont des critères de visibilité à l’écran.
En fait je vais essayé d’expliquer. Le pdf a l’ouverture est vide, il y a seulement une case à coché pour ajouter une pièce au descriptif (salon, cuisine etc…). Lorsque que l’on coche cette case des champ supplémentaires s’affichent pour que l’utilisateur puisse préciser les caractéristiques de la pièce (surface, revêtement sol, type de baignoire etc…). si c’est une pièce “simple” a droite il n’y aura qu’un champ commentaire, s’il s’agit d’une pièce spécifique il y aura des champs spécifiques (électroménager pour une cuisine, ou type de baignoire pour une salle de bain par exemple).
C’est une fiche technique d’agent immobilier si vous voulez tout savoir
Effectivement en décochant, il faut que ça reset les champs des lignes (c’était en place), et je viens de rajouter un reset de la case a cocher de la ligne2 si la case à cocher de la ligne1 a aussi été décoché, merci pour ta remarque.
je vous remet le fichier actualisé et fonctionnel en PJ. maintenant il faut que je m’occupe de renommer et dupliquer les champs pour faire mes 12 lignes.
9 octobre 2018 à 09:52 #64634bebarth
Maître des clésbonjour,
Dans ton fichier, j’ai coché la case “Valider la valeur…” de la liste déroulante et ajouté un léger fond aux champ, cela permet de voir ce qu’il y a à remplir.
Si tu pouvais faire un tableau qui indique les champs visibles en fonction de la pièce sélectionnée, ça avancerait pour voir comment nommer les champ d’une manière pratique !
@+
:bonjour:9 octobre 2018 à 10:46 #64635extrapitou
Membre:soleil: :soleil: :soleil: :soleil:
Ahh super tu illumine ma journée !!! ça commençait à m’énervé de devoir cliquer dans le vide pour valider la sélection
Voici en PJ un tableau excel avec l’attribution des champs par pièce.
J’ai ajouté une colonne pour proposer une nouvelle dénomination des champs, dites moi si ca convient
9 octobre 2018 à 12:10 #64636bebarth
Maître des clésLa colonne “Autre” de ton fichier excel s’applique à TOUTES les autres pièces, (salon, chambres, cellier, wc…) ???
@+
:bonjour:9 octobre 2018 à 15:03 #64637extrapitou
MembreLa colonne “Autre” de ton fichier excel s’applique à TOUTES les autres pièces, (salon, chambres, cellier, wc…) ???
@+
:bonjour:tout a fait
10 octobre 2018 à 13:09 #64638extrapitou
MembreCoucou,
Bon j’ai pu avance un peu sur le sujet. J’ai renommé tout les champs sur le principe “R.cuisine.evier_liste” (décliné selon les pieces et les champs).
J’ai modifié le script en plaçant les champs parents et ça fonctionne, j’ai pu diviser par 4 le nombre de lignes c’est cool merci a vous
Par contre à la fin du script j’ai une partie qui permet de reset les valeurs des champs lorsque l’on décoche la case de début de ligne. Et a priori ça ne marche pas et je ne vois pas ce qui cloche, la liste se remet bien en valeur “sélectionnez” (en vert ça fonctionne) mais les autres champs ne se vident pas (en rouge ça ne fonctionne pas)
……
//pour reset des valeurs lorsque que l’on decoche la case maitre
event.value = “Sélectionnez”
this.getField(“R.autre”).value = “”;
this.getField(“R.cuisine”).value = “”;
this.getField(“R.salle_bain”).value = “”;
this.getField(“R.salle_eau”).value = “”;
this.getField(“R.buanderie”).value = “”;
this.getField(“R.cave”).value = “”;
this.getField(“R.commun”).value = “”;
}¨Par contre lorsque que l’on fait “créer plusieurs copies”, le script ne suit pas car mes champs s’appellent maintenant “R.cuisine.evier_liste.0” mais dans le script c’est toujours “R.cuisine.evier_liste”. Est ce un comportement normal ?
10 octobre 2018 à 13:23 #64639bebarth
Maître des clésbonjour,
Moi j’ai pas mal avancé sur le sujet, mais je bloque depuis un moment !
Ci-joint un fichier avec 5 lignes que je croyais terminé jusqu’à ce que je duplique la fonction du champ liste déroulante…
Juste avec la première ligne ça fonctionne parfaitement, dès que j’applique la fonction aux ligne suivantes, ça ne fonctionne plus.
Je pense que c’est parce que la fonction est en script de calcul. Il faudrait la mettre en script d’action pour qu’elle ne s’applique qu’à la liste choisie, mais lorsque je la place en souris relâchée, la valeur de la liste n’est pas la bonne et le script se lance même avant qu’on ne relâche le bouton de la souris !!!
Je sais que j’ai toujours eu un problème de compréhension avec les événements (events). Peut-être que Merlin pourra nous éclairer…
@+
:bonjour:10 octobre 2018 à 13:45 #64640extrapitou
Membredans ton fichier je vois que tu as dupliqué les champs en blabla.0 blabla.1 etc….
par contre qd je vais voir les scripts c’est juste marqué piece(); et case();
je ne comprends pas comment avec ceci cela fonctionne, a moins que ce soit dans la fameuse “console javascript” ?10 octobre 2018 à 13:48 #64641bebarth
Maître des clésCe sont des fonctions qui appellent un script de document. Tu devrais ne pas avoir de mal à les trouver !
Ça évite à devoir modifier x fois un script…
@+
:bonjour:10 octobre 2018 à 13:52 #64642extrapitou
Membreyes trouvé
la vache ya un sacré charabia :Smiley11: :Smiley11: :Smiley11: c’est bcp moins simple à comprendre que en direct dans les formulaires lol. je suppose que ca donne plus de liberté dans la création des scripts
10 octobre 2018 à 15:48 #64643Merlin
Maître des clésJe sais que j’ai toujours eu un problème de compréhension avec les événements (events). Peut-être que Merlin pourra nous éclairer…
Le script de calcul n’est peut être pas ce qu’il a de plus pertinent dans une liste déroulante mais ton document fonctionne bien… Si on place la fonction “pieces();” dans chaque liste déroulante et pas seulement dans la première.
:geek:10 octobre 2018 à 16:20 #64644bebarth
Maître des clésMerci Merlin,
Si on place la fonction “pieces();” dans chaque liste déroulante et pas seulement dans la première.
Tu penses bien que j’ai essayé x fois avant de partager le fichier… et ce n’est pas que ça fonctionne pas du tout, mais ça ne fonctionne pas correctement.
Dans la copie d’écran, il devrait y avoir des cases sur la droite de la ligne Salle d’Eau.
Dans ce que j’ai pu observer, après l’ouverture du document, la première ligne où l’on choisi la pièce fonctionne bien, ce sont les lignes suivantes qui ne fonctionnent pas très bien.Pourquoi lorsque l’on place le script en action souris relâchée, il se lance alors que le bouton de souris est toujours appuyé ???
N’y aurait-il pas une commande “event” (willCommit, change, rc…) qui pourrait pallier ça ??? Comme je l’ai dit, je ne comprend pas grand chose à ces événements ! D’ailleurs, si tu connais un site qui pourrait m’éclairer, je suis preneur.
@+
:bonjour:10 octobre 2018 à 16:35 #64645extrapitou
Membrej’ai aussi des problème d’affichage avec le fichier de merlin, quand je decoche certaines cases de debut de ligne, j’ai le menu de salle d’eau qui s’affiche sur la ligne en dessous alors que normalement tout doit rester hidden.
Et qd je coche la premiere case la souris devient un sablier avec une calculatrice (ca reflechit)….. étrange
10 octobre 2018 à 16:53 #64646Merlin
Maître des clésPourquoi lorsque l’on place le script en action souris relâchée, il se lance alors que le bouton de souris est toujours appuyé ???
Parce-que dans l’onglet Options des Propriétés l’option “Sélectionner la valeur immédiatement” est cochée.
:Smiley03:Dans le script function pieces(), à la ligne 5, remplace :
Code:var laTable = this.event.target.value;Par :
Code:var laTable = event.value;(avec ou sans this, ça n’y change rien)
Et place la fonction pieces(); en script de validation.
:Smiley15:10 octobre 2018 à 17:07 #64647Merlin
Maître des clésDans vos exemples la Convention de dénomination des champs de formulaires est sous-utilisée. :siffle:
Je partirai sur quelque chose comme :rangee1.cuisine.robinet
rangee1.cuisine.evier
rangee1.cuisine.frigo
rangee1.salle2bain.douche
rangee1.salle2bain.lavabo
rangee1.salle2bain.baignoire
etc.rangee2.cuisine.robinet
rangee2.cuisine.evier
rangee2.cuisine.frigo
rangee2.salle2bain.douche
rangee2.salle2bain.lavabo
rangee2.salle2bain.baignoire
etc.rangee3.cuisine.robinet
rangee3.cuisine.evier
rangee3.cuisine.frigo
rangee3.salle2bain.douche
rangee3.salle2bain.lavabo
rangee3.salle2bain.baignoire
etc.Ce qui permet de s’adresser facilement à une rangée ou un de ses sous ensembles :
(pour afficher toute une rangée)
this.getField(“rangee2”).display = display.visible;ou (pour afficher les champs salle2bain de la rangée 3)
this.getField(“rangee3.salle2bain.”).display = display.visible;ou (pour afficher toute une rangée sauf les champs salle2bain)
this.getField(“rangee5”).display = display.visible;
this.getField(“rangee5.salle2bain.”).display = display.hidden;Etc.
Ainsi il n’y a plus besoin de boucles ni d’array,etc.
Par-contre ça impose de dupliquer les champs et de les renommer à la main car la duplication automatique ajoute forcément un suffixe à la fin, pas avant le premier point. S’il n’y en a pas des centaines, comme c’est le cas, c’est toujours plus simple.
:extra:10 octobre 2018 à 17:43 #64648bebarth
Maître des clésil y a environ 50 champs par ligne multipliés par 12 lignes, ça fait 600 champs à renommer manuellement…
Lorsque je remplace “var laTable = this.event.target.value;” par “var laTable = event.value;”, ça me donne l’intitulé et non la valeur d’exportation, donc ça ne fonctionne pas non plus !
Je vais regarder ça !
@+
:bonjour:10 octobre 2018 à 20:03 #64649extrapitou
Membreok merlin c’est bien ce que j’avais déduit mes champs “R.cuisine.baignoire_case” sont structurés comme tu le préconise hormis qu’il faut que je précise le numéro de la rangée.
je vais avancé dans ce sens, merci.
Par contre concernant mon commentaire ci-dessous, auriez vous une idée du pourquoi ?
Par contre à la fin du script j’ai une partie qui permet de reset les valeurs des champs lorsque l’on décoche la case de début de ligne. Et a priori ça ne marche pas et je ne vois pas ce qui cloche, la liste se remet bien en valeur “sélectionnez” (en vert ça fonctionne) mais les autres champs ne se vident pas (en rouge ça ne fonctionne pas)
……
//pour reset des valeurs lorsque que l’on decoche la case maitre
event.value = “Sélectionnez”
this.getField(“R.autre”).value = “”;
this.getField(“R.cuisine”).value = “”;
this.getField(“R.salle_bain”).value = “”;
this.getField(“R.salle_eau”).value = “”;
this.getField(“R.buanderie”).value = “”;
this.getField(“R.cave”).value = “”;
this.getField(“R.commun”).value = “”;
}10 octobre 2018 à 22:11 #64650Merlin
Maître des clésil y a environ 50 champs par ligne multipliés par 12 lignes, ça fait 600 champs à renommer manuellement…
Ah oui quand même… :mur: :tutut: :joker:
Vivent les boucles et les array !10 octobre 2018 à 22:14 #64651Merlin
Maître des clésLorsque je remplace “var laTable = this.event.target.value;” par “var laTable = event.value;”
Oui c’était trop simple, les listes déroulantes ont des particularités parfois un peu pénibles…
Je vais regarder ça :priere:11 octobre 2018 à 08:53 #64652bebarth
Maître des clésbonjour,
il y a environ 50 champs par ligne multipliés par 12 lignes, ça fait 600 champs à renommer manuellement…
Il y a même 58 champs par ligne… on est plus près des 700 champs à remplir manuellement !
Lorsque je remplace “var laTable = this.event.target.value;” par “var laTable = event.value;”, ça me donne l’intitulé et non la valeur d’exportation, donc ça ne fonctionne pas non plus !
Il faut donc aller relire la valeur correspondant à l’intitulé, ce qui donne :
Code:…
var designation = event.value;
for (var i=0; i < f.numItems; i++) {
if (designation==f.getItemAt(i,false)) {
var laTable=f.getItemAt(i,true);
break;
} else {
var laTable=”Autre”;//si l’utilisateur rentre une pièce manuellement
}
}
…Normalement tout fonctionne correctement maintenant (une petite vérif quand même…).
Je joins les fichiers que j’ai utilisé. Le fichier _BB0 correspond à une seule ligne (qu’il faut réaligner) avec le nom des champs sans indice, ce qui permet à ne pas avoir à renommer tous les champs si on veut un fichier avec plus ou moins de 12 lignes (il faudra indiquer la valeur exacte dans le script de document “lesTables”).
@+
:bonjour:11 octobre 2018 à 08:55 #64653bebarth
Maître des clés…voici le fichier _BB0, car ça ne passait pas en une seule fois !
@+
:bonjour:11 octobre 2018 à 10:19 #64654extrapitou
MembreEffectivement ça fonctionne merci :bravo: . par contre il va falloir que je potasse des cours de script car la si je dois reproduire ou debug je suis mort
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.