Donnez vie à vos documents numériques !
 

Validation d’un formulaire avant impression

abracadabraPDF Forums PDF – Général Validation d’un formulaire avant impression

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #43673
    62
    Invité

    Bonjour à tous,
    Je découvre ce Forum en recherchant solution à mon problème et voudrais tirer mon chapeau à ceux qui y consacrent beaucoup de temps à partager leurs connaissances  :violon: (sincèrement).
    C’est mon premier post, voici ma question. Membre d’une association pour une course pédestre et ayant en charge le site en page perso s’y rapportant, J’ai édité un bulletin d’inscription dans designer 8 avec lequel je fais mes premiers pas. Ce formulaire comporte un bouton impression et suis assez satisfait du résultat concernant la présentation. Par contre, ne désirant pas recevoir de bulletin incomplet ou mal remplis, je souhaiterais valider la bonne saisie des champs (mail, non vide..).
    je ne viens pas ici vous demander de me faire le travail mais de m’épauler car je n’arrive pas à apréhender la fenêtre script qui doit être le point de départ pour la résolution de mon problème. J’ai parcouru ce forum et ai bien trouvé des bribes de réponses mais ne parviens pas à finaliser. Au final, ce que je souhaiterais c’ est que sur appuie sur le bouton impression je valide les champs et ouvre une fenêtre d’alerte si l’un d’entre-eux n’est pas conforme, alors que le laché bouton lancerais l’impression sous réserve des validations ok (si vous avez une autre suggestion…). Je ne suis pas un codeur né mais aime assez cet environnement. Je peux éventuellement joindre le fichier.tds ou, peut-être, un fichier note avec le code xml ? je remercie par avance tout ceux qui pourraient m’aider car j’aimerais vraiment finaliser ce que j’ai en tête. J’ai bien sûre parcouru le fichier d’aide mais le problème c’est les interactions (action sur bouton qui lance plusieurs validations et une impression), pas d’explication sur des combinaisons de scripts  :'(
    Encore Merci, bonne nuit

Affichage de 21 réponses de 1 à 21 (sur un total de 21)
  • Auteur
    Réponses
  • #49923
    Merlin
    Maître des clés

    La solution la plus simple c’est le retour des formulaires via l’envoi de données, ainsi il suffit de cocher certains champs comme “obligatoires” pour qu’il soit impossible d’envoyer avant que tous ne soient remplis.

    La procédure pour faire de même avant impression passe par l’utilisation de JavaScripts sur l’évènement “doc will print” (doc va être imprimé).

    Mais rien ne peut empêcher un utilisateur d’utiliser un autre logiciel que Adobe Reader (ou Acrobat), tel Apple-Aperçu ou Sumatra-PDF qui ne reconnaissent pas les scripts et qui permettront donc à l’utilisateur d’imprimer le formulaire vide ou partiellement rempli et/ou de le remplir à la main…

    Sachant cela, est-il besoin d’aller plus loin ?

    Si oui cela va s’organiser ainsi, un seul script suffit sur l’action mouse up/souris relevée du bouton d’impression :

    Si (valeur du champ obligatoire 1 = vide)
    Ou si (valeur du champ obligatoire 2 = vide)
    Ou si (valeur du champ obligatoire 3 = vide)
    Ou si (valeur du champ obligatoire 4 = vide)
    Alors {alerte utilisateur}

    Sinon {on imprime le doc}

    :soleil:

    #49924
    62
    Invité

    Bonjour,
    Je te remercies pour ta réponse rapide, Merlin.
    Je comprend la logique que tu proposes mais comment ce fonctionnement se traduit-il en terme de scripts et où les placer dans le code existant?
    faut-il t’ envoyer le fichier stp?
    merci de m’aider à la modification de mon code car je ne maitrise pas bien le sujet. :Euuuh:

    #49925
    Merlin
    Maître des clés

    Merlin connaît bien les formulaires fait avec Acrobat et le JavaScript, par contre il connaît beaucoup moins Designer et les subtilités du XFA, mais on peut toujours essayer…

    Envoie moi donc ton formulaire, mais dans tous les cas je communiquerai le script sur le forum, pour que tout le monde en bénéficie.

    Normalement il y a une icône d’eMail quelque part sur la gauche, sinon : forumsXXXXXXXXabracadabrapdf.net
    (Où il faut remplacer les X par @)

    :soleil: 😎

    #49926
    62
    Invité

    Bonsoir Merlin,
    As tu bien reçu mon fichier envoyé récemment stp ?
    en aucun cas il ne s’agit  là d’une relance mais simplement d’avoir la confirmation que tu ais bien reçu mon mail

    Cordialement.

    #49927
    Merlin
    Maître des clés

    Bien reçu mais je n’arrive pas bien à manier Designer, voici un script qui est fourni comme exemple dans le SDK d’Acrobat et que je t’ai personnalisé.
    Il te faut juste changer le nom des champs (en capitales) et franciser les deux messages d’alerte :

    Code:
    // Specify a list of required field names:
    var requiredField = [“CHAMP1”, “CHAMP2”,
    “CHAMP3”];
    // Loop through the array of field names:
    for (var i=0; ivar f = this.getField(requiredField);
    if (f.value == “”){
    app.alert(“The ” + requiredField + “
    field is required; please click OK on this
    message; enter data; and then click this
    button again until there are no error
    messages”)
    break;
    }
    else if(i == requiredField.length – 1) {
    app.alert(“Thank you, all required
    fields have been completed”);
    this.print();
    }
    }

    Pour les messages d’alerte je te conseille l’utilisation de Abra-Txt2Unicode : http://abracadabrapdf.net/articles.php?lng=fr&pg=440

    :soleil:  :contentdance:

    #49928
    62
    Invité

    Bonsoir Merlin, Bonsoir à tous,
    tout d’abord, merci de t’ attacher à mon problème. je suis entrain d’essayer de me familiariser avec adobe acrobat afin d’essayer d’y éditer mon bulletin car il me semble que ça soit plus convivial et les fenêtres de propriétés des champs, boutons etc.., me paraissent plus explicites (validation, calcul, action…).
    Je me fais donc la main sur le logiciel et assayerais d’ y incérer le script que tu m’a joins pour la validation (sympa). il faut que j’y parvienne et me permettrais de te recontacter au besoin :priere:.
    merci aussi pour le lien “unicode”, ça ce sera pour finioler.
    à bientôt

    62  ;)

    #49929
    Merlin
    Maître des clés

    Acrobat me parait effectivement plus simple mais c’est peut-être que j’y suis habitué…

    N’hésites pas à revenir pour toute question.

    :contentdance:

    #49930
    62
    Invité

    Bonjour Merlin, Bonjour à tous en vous souhaitant une excellente année 2009.
    Comme tu m’y a invité, je reviens avec quelques précisions à te soumettre concernant mon bulletin. Je l’ai, cette fois, travaillé sur “Acrobat” et suis parvenu à un résultat correct selon moi toutefois, il me reste quelques finalités à apporter aux scripts de validation et je ne parviens pas malgrés, mais divers essais, à les appliquer.

    groupe de champs “sexe”, je voudrais valider qu’au moins une option soit cochée (champ obligatoire)

    groupe de champs “course”, idem (champ obligatoire)

    champ e mail, ce champ n’est pas obligatoire mais j’aimerais appeler une fenêtre info si le champ n’est pas rempli pour inviter l’internaute à valider qu’il ne souhaite pas remplir ce champ et si il est rempli, valider la syntaxe de l’e mail (blabla@bla.bla)

    champ téléphone, ce champ n’est pas obligatoire et je voudrais une fenêtre info comme sur le champ e mail sans verification de syntaxe cette fois.

    champ club, idem que le champ téléphone

    pour le champ naissance, dans designer il était possible d’appeler un calendrier bien pratique, est-il possible de le faire depuis Acrobat?

    j’envoi en paralléle mon fichier actualisé à la même adresse que précédemment et te/vous remercie de m’aider à finaliser mon bulletin.

    Cordialement
    62  ;)

    #49931
    Merlin
    Maître des clés

    Je vais regarder ça…

    #49932
    62
    Invité

    Sympa Merlin, merci beaucoup, tu sais j’ai bien essayé d’incérer des lignes de code pour la syntaxe d’email du type:

    $verif=”!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}.[a-zA-Z]{2,4}$!”;
    if(!preg_match($verif,$mail))
    {echo “Voter email n’est pas valide”;}

    mais bon dés, qu’ il s’agit de modifs à apporter à un script existant, forcément, vue mon niveau en programmation, ça ne passe pas. :mur:

    #49933
    Merlin
    Maître des clés

    Inutile de réinventer la roue, tu trouveras la plupart des scripts dont tu as besoin (formatage eMail, tél, etc) dans les champs de ce bon de commande : http://abracadabrapdf.net/articles.php?lng=fr&pg=342

    Vive le copier-coller !

    :extra:

    #49934
    62
    Invité

    Bonsoir,
    j’ai visité ton lien, c’est une mine d’or pour moi et j’ai déjà fait la demande de mot de passe pour le dévérouillage, merci. Néanmoins je ne pense pas pouvoir solutionner la validation d’au moins une des options sur les champs course et sexe, si tu as une suggestion sur le sujet…(sinon je m’en abstiendrais).
    j’analyse le bon de commande magique et te rend compte dans tout les cas 
    merci encore;)

    #49935
    Merlin
    Maître des clés

    Peaufine ton formulaire en utilisant les scripts existant, quand tu aura fini je t’aiderai à y placer le script de validation qui figure plus haut dans ce sujet.

    :RoiReine:

    #49936
    62
    Invité

    Bonjour Merlin, Bonjour à tous,
    Mon bulletin avance doucement mais il avance. j’ai exploité le fichier “bon de commande” en copiant collant comme un fou et en m’imprègnant au passage du langage javascript passionnant mais tellement vaste  :contentdance:.
    est-il possible d’appeler une boite de message proposant deux alternatives (oui ou non) renvoyant sur 2 actions diffèrentes en fonction de la réponse, si oui, merci de m’expliquer la syntaxe. J’ai parcouru le net à la recherche de réponses mais les solutions javascript que j’ai pû trouver ne fonctionnent pas dans le pdf mais seulement dans une page web (pourquoi puisqu’ il s’agit de javascript? :Euuuh:)
    de la même maniére, existe t-il une fenêtre info plutôt que alerte.
    Comment puis-je controler que dans un groupe de boutons d’option, au moins une réponse (bien sûr) est donnée.
    Merci encore pour votre aide ;)

    #49937
    Merlin
    Maître des clés

    Je ne sais pas ce que tu entend par “fenêtre info” mais une alerte uniquement informative en devient une :

    Code:
    app.alert({cMsg: “Erreur !nnRecommencez encore.”, cTitle: “abracadabraPDF”});

    (A placer en action : souris relâchée, par ex)

    :)

    #49938
    Merlin
    Maître des clés

    En fait on peut donner plusieurs types différents à une fenêtre JavaScript, sachant que cela ne vaut que sous Windows (pas sur Mac, donc).

    Tous les détails sont ici :
    http://partners.adobe.com/public/developer/en/acrobat/sdk/AcroJS.pdf#page=88
    (en bas de la page : ALERT)

    Je conseille d’ailleurs le téléchargement intégral de ce fichier qui est une mine d’or pour tout JavaScripteur !

    :bravo:

    #49939
    62
    Invité

    merci Merlin,
    encore un nid d’informations exploitable en “copier coller” ;)
    quand je parlais de “fenêtre info” j’ entendais par là le type de message (tu m’a donné la réponse via le lien vers le fichier):

    (optional) An icon type. Values are associated with icons as follows:
    0: Error (default)
    1: Warning
    2: Question
    3: Status

    j’ai donc aussi trouvé la syntaxe pour ma fenêtre offrant l’option “oui ou non” mais je ne parviens pas à l’incérer dans le code existant (ci dessous simplifié pour l’occasion)pour que ça puisse fonctionner de cette manière:
    sur relachement du bouton imprimer,
    le champ “licence” est obligatoire et on impose sa saisie, là pas de problème
    le champ “téléphone” n’est pas obligatoire mais j’aimerais l’obtenir alors, si le champ est vide, j’ouvre une fenêtre oui/non pour confirmation avec la question voulez vous vraiment laisser le champ vide? Si la réponse est oui, je passe au champ Email, si la réponse est non, je sélectionne le champ “téléphone”.

    pour le champ Email, idem sauf qu’à la réponse oui j’ouvre une fenêtre de remerciements et lance l’impression

    voici mon bout de code qui ne fonctionne pas bien sûre parce que je ne trouve pas la syntaxe pour aiguiller
    si oui, je fais ceci
    si non, je fais cela

    si tu peux m’aider…., en tout cas je continu de chercher inlassablement.

    Bonsoir.

    // Spécifier une liste de noms de domaine requis:
    var requiredField = [“Licence”,];
    // Boucle à travers le tableau des noms de domaine::
    for (var i=0; ivar f = this.getField(requiredField);
    if (f.value == “”){
    app.alert(“Le champ ” + requiredField
    + ” est obligatoire, merci de cliquer OK et d’indiquer votre N° de licence”)
    break;
    }

    else if(i == requiredField.length – 1)
    var requiredField = [“Téléphone”,];
    // Loop through the array of field names:
    for (var i=0; ivar f = this.getField(requiredField);
    if (f.value == “”)
    // A MouseUp action
    var nButton = app.alert({
    cMsg: “il n’est pas obligatoire de remplir le champ Téléphone mais cette information pourrait nous être utile pour vous contacter en cas de problème (annulation, inscription incorrecte etc…)                                                                                                                                                                                                                                                        voulez vous vraiment laisser ce champ vide?”,
    cTitle: “Téléphone”,
    nIcon: 1, nType: 3
    });
    if ( nButton == 3 );

    (i == requiredField.length – 1)
    var requiredField = [“Email”,];
    // Loop through the array of field names:
    for (var i=0; ivar f = this.getField(requiredField);
    if (f.value == “”)
    // A MouseUp action
    var nButton = app.alert({
    cMsg: “il n’est pas obligatoire de remplir le champ Email mais cette information pourrait nous être utile pour vous contacter en cas de problème (annulation, inscription incorrecte etc…)                                                                                                                                                                                                                                                                          voulez vous vraiment laisser ce champ vide?”,
    cTitle: “Email”,
    nIcon: 1, nType: 3
    });
    if ( nButton == 3 );

    {
    app.alert(“Merci pour votre inscription aux 5èmes Foulées Campagnardes”);
    this.print();
    }}}}

    #49940
    Merlin
    Maître des clés

    Ce serait plus simple si le champ téléphone était obligatoire lui aussi…
    ;)

    Mais je ne peux m’empêcher de penser à tous ces braves utilisateurs qui voudront imprimer le formulaire d’inscription pour le remplir à la main… parce qu’ils préfèrent ou parce qu’ils ne savent pas faire autrement…
    :doute: :Euuuh:

    Je crois que dans tous les cas l’impression doit pouvoir se faire, que les champs soit vides ou remplis, il faudrait en fait juste envoyer une alerte à l’utilisateur systématiquement au moment de l’impression pour l’informer des champs obligatoires.
    Ainsi libre à lui des les remplir avant ou après l’impression, sachant que champ obligatoire non-rempli = pas d’inscription !

    :soleil:

    #49941
    62
    Invité

    Tu as en parti raison Merlin, effectivement certaines personnes préfèrent la solution manuscrite et c’est pourquoi un formulaire est déjà en ligne pour ces gens là. Par contre, pour ce qui est du formulaire interactif, je voudrais vraiment, d’une part, que la personne ne puisse pas imprimer si les champs obligatoires ne sont pas remplis (nous reçevons trop d’inscriptions incomplètes et ça complique l’organisation le jour de la course) et, d’autre part les inciter à remplir les infos non obligatoires que nous aimerions exploiter pour garder un contact avec les fidèles à nôtre manifestion.
    pourquoi faire simple quand on peut faire compliqué?  :extra:  :mur:

    si tu peux aussi me donner une petite info pour les groupes de boutons radio dont je parles un peu plus haut car ils sont obligatoires eux aussi (comment valider que au moins un d’entre eux est coché?)
    merci pour ta compréhension, ne me lache pas Merlin! parce qu’alors là, c’est sûr, ils remplierons à la main :priere:
    bonne journée et encore merci

    #49942
    Merlin
    Maître des clés

    Voilà un script qui teste les boutons-radio et les champs texte, il n’y a que les noms de champs et les messages à modifier :

    console.show();
    console.clear();

    // test for required radio buttons
    var bRadioTest = false; // assume test failed
    // radio button fields to test
    var aReqFields = new Array(“activity3”, “activity4”, “activity5”, “activity6”, “activity7”, “activity8”, “activity9”, “activity10”);

    var fld;
    var bActivity = true; // clear count
    for(var i = 0;i );
        console.println(aReqFields
    + “.value = ” + fld.value);
        // test for radio button to be Off or No
        if(fld.value == “Off” | fld.value == “No”)
           bActivity = false;
    }
    console.println(“bActivity: ” + (bActivity == true) );

    // test text fields
    var bTextTest = true; // assume passed
    aReqFields = new Array(“Text1”, “Text2”)
    for(var i = 0;i     fld = this.getField(aReqFields);
        console.println(aReqFields
    + “.value = ” + fld.value);
        // if field is empty string test fails
        if(fld.value.toString() == “” )
            bTextTest = false; // failed test
    } // end loop
    console.println(“bTextTest: ” + (bTextTest == true) );
    // see if both test were passed
    console.println(“(bActivity == true) & (bTextTest == true): ” + ((bActivity == true) & (bTextTest == true) == 1) );
    if((bActivity == true) & (bTextTest == true))
    Print(true);
    else
      app.alert({
        cMsg:”You have omitted one or more required fields. Click the CANCEL button to cancel printing. Complete all required fields and then click PRINT”});

    A placer en action souris relâchée !

    :bravo:

    #49943
    62
    Invité

    Bonsoir et merci pour ta promptitude Merlin,
    j’ ai exploité ton code en l’incèrant dans une action souris relachée de mon bouton imprimer aprés avoir saisi les noms de champs mais lorsque je lance l’action, une fenêtre nommée “débogueur de script” s’ouvre et m’indique ceci:
    TypeError: fld has no properties
    14:Field:Mouse Up

    et le code modifié:

    console.show();
    console.clear();

    // test for required radio buttons
    var bRadioTest = false; // assume test failed
    // radio button fields to test
    var aReqFields = new Array(“sexef”, “sexem”, “course1”, “course1p”, “course3”, “course5”, “course5h”, “course10”);

    var fld;
    var bActivity = true; // clear count
    for(var i = 0;i     console.println(aReqFields + “.value = ” + fld.value);
        // test for radio button to be Off or No
        if(fld.value == “Off” | fld.value == “No”)
           bActivity = false;
    }
    console.println(“bActivity: ” + (bActivity == true) );

    // test text fields
    var bTextTest = true; // assume passed
    aReqFields = new Array(“Téléphone”, “Club”)
    for(var i = 0;i     fld = this.getField(aReqFields);
        console.println(aReqFields + “.value = ” + fld.value);
        // if field is empty string test fails
        if(fld.value.toString() == “” )
            bTextTest = false; // failed test
    } // end loop
    console.println(“bTextTest: ” + (bTextTest == true) );
    // see if both test were passed
    console.println(“(bActivity == true) & (bTextTest == true): ” + ((bActivity == true) & (bTextTest == true) == 1) );
    if((bActivity == true) & (bTextTest == true))
    Print(true);
    else
      app.alert({
        cMsg:”Vous avez omis un ou plusieurs champs obligatoires. Cliquez sur le bouton Annuler pour annuler l’impression. Remplissez tous les champs obligatoires puis cliquez sur Imprimer”});

    Ais-je mal entré mes données? impossible à mon niveau de cibler le problème.
    au fait mon petit assemblage de codes avec la fenêtre oui/non ne te plaisait pas?
    car on était pas loin d’aboutir non? quand je dis on, je me doute bien que tu aurais déjà baclé la chose depuis longtemps mais, c’est bien d’y aller par étape, c’est enrichissant et puis ça me fait bosser un peu. Bon là 1h 05, je vais me coucher.
    Tchao et une nouvelle fois…….Merci ;)

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