Donnez vie à vos documents numériques !
 

Besoin d’aide script PDF affichage/masquage de champ

abracadabraPDF Forums PDF – Général Besoin d’aide script PDF affichage/masquage de champ

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45929
    extrapitou
    Membre

    Bonjour à 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 :D

    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

Affichage de 30 réponses de 1 à 30 (sur un total de 30)
  • Auteur
    Réponses
  • #64625
    extrapitou
    Membre

    EDIT :
    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”?

    #64626
    Merlin
    Maître des clés

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

    #64627
    extrapitou
    Membre

    Pour 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 :D

    #64628
    bebarth
    Maître des clés

    bonsoir,

    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:

    #64629
    extrapitou
    Membre

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

    #64630
    Merlin
    Maître des clés

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

    #64631
    bebarth
    Maître des clés

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

    #64632
    extrapitou
    Membre

    Que 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 :)

    #64633
    extrapitou
    Membre

    bonjour,
    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.

    #64634
    bebarth
    Maître des clés

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

    #64635
    extrapitou
    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 :)

    #64636
    bebarth
    Maître des clés

    La colonne “Autre” de ton fichier excel s’applique à TOUTES les autres pièces, (salon, chambres, cellier, wc…) ???
    @+
    :bonjour:

    #64637
    extrapitou
    Membre

    La colonne “Autre” de ton fichier excel s’applique à TOUTES les autres pièces, (salon, chambres, cellier, wc…) ???
    @+
    :bonjour:

    tout a fait :)

    #64638
    extrapitou
    Membre

    Coucou,

    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 ?

    #64639
    bebarth
    Maître des clés

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

    #64640
    extrapitou
    Membre

    dans 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” ?

    #64641
    bebarth
    Maître des clés

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

    #64642
    extrapitou
    Membre

    yes 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

    #64643
    Merlin
    Maître des clés

    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…

    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:

    #64644
    bebarth
    Maître des clés

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

    #64645
    extrapitou
    Membre

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

    #64646
    Merlin
    Maître des clés

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

    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:

    #64647
    Merlin
    Maître des clés

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

    #64648
    bebarth
    Maître des clés

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

    #64649
    extrapitou
    Membre

    ok 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 = “”;

    }

    #64650
    Merlin
    Maître des clés

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

    #64651
    Merlin
    Maître des clés

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

    #64652
    bebarth
    Maître des clés

    bonjour,

    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:

    #64653
    bebarth
    Maître des clés

    …voici le fichier _BB0, car ça ne passait pas en une seule fois !
    @+
    :bonjour:

    #64654
    extrapitou
    Membre

    Effectivement ç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 :)

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