Saisies

Introduction

Créer un formulaire est une tâche toujours un peu répétitive : les champs ont souvent les mêmes propriétés, le même accompagnement (message d’erreur, explication, ...) et la même structure HTML. Ce plugin est un outil pour les développeur⋅euses ayant pour but de faciliter et d’accélérer l’écriture des formulaires.

Pour cela, Saisies propose plusieurs mécanismes (balises, API PHP) pour générer et manipuler plus facilement les champs des formulaires. De cette manière, les squelettes de formulaires sont :

  • plus lisibles : il n’y a que le strict nécessaire dedans, pas de répétition ;
  • intégrés au fonctionnement CVT de SPIP, notamment pour la gestion des erreurs sur les champs ;
  • automatiquement compatibles avec les recommandations HTML/CSS de SPIP.

La balise #SAISIE

Cette balise permet de générer une seule saisie en lui donnant directement les paramètres désirés. Chaque saisie va générer une ligne dans un formulaire, c’est-à-dire soit :

La balise a deux arguments obligatoires : le type du champ, et son nom HTML (attribut “name”). Toutes les autres options sont facultatives et servent à configurer le champ ; de ce fait, elles sont de la formes option=valeur.

La forme complète est donc la suivante :
#SAISIE{type, name, option=valeur, option2=valeur2, etc=etc}

Voici quelques exemples d’utilisation, pour comprendre l’approche.

Génère un simple champ texte, indiqué comme étant obligatoire :
#SAISIE{input, email, label=Votre courriel, obligatoire=oui}
 
Génère des boutons radios avec un choix "oui ou non" :
#SAISIE{oui_non, zanini, label=Tu veux ou tu veux pas ?}
 
Génère un choix multiple parmi les utilisateurs du SPIP :
#SAISIE{auteurs, destinataires,
    label=Destinataires du message,
    explication=Choisissez une ou plusieurs personnes à qui sera envoyé le message.,
    multiple=oui}

Comme vous le voyez, des champs qui peuvent être complexes, et fastidieux à écrire de manière complète, s’écrivent ici en quelques lignes.

Consultez également :

-  La référence des options de chaque saisie

-  Un complément de doc avancée sur les saisies

Multilinguisme

#SAISIE supporte le multilinguisme. Dans ce cas, attention de bien utiliser la syntaxe complète avec les crochets :

  • #SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui} ne fonctionne pas ;
  • [(#SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui})] fonctionne.

Afficher les erreurs

Saisie gère nativement l’affichage des erreurs.

Si la fonction CVT verifier() retourne une erreur du même nom celle ci sera affichée entre le label et le champ.

  • Pour la saisie [(#SAISIE{input, annee, label=<:monplugin:annee:>})]
  • si verifier() retourne : $erreurs['annee'] = "Une erreur"
  • alors <span class="erreur_message">Une erreur</span> sera affichée juste avant l’input.

Enregistrer des tableaux

La norme HTML permet de gérer des réponses de formulaire sous la forme de tableau. Il est recommandé d’utiliser alors le formalisme suivant : tableau/variable.

  1. [(#SAISIE{input, annee/debut, label=<:monplugin:annee:>})]

Permettra de récupérer en PHP

_request('annee');
// array('debut' => 'valeur')

La forme HTML classique [(#SAISIE{input, annee\[debut\], label=<:monplugin:annee:>})] fonctionne aussi.


Attention, pour utiliser tout ce qui suit, vous devez installer aussi le plugin YAML.


Déclarer un formulaire CVT complet en PHP

Saisies augmente l’API CVT de SPIP avec une fonction …_saisies() afin de déclarer l’ensemble des champs d’un formulaire et leur vérification dans une unique syntaxe.

Grace à ce mécanisme, pour les cas les plus courants, les fonctions charger() et verifier() deviennent facultatives. Saisies s’occupera de tout suivant votre déclaration. Seule la fonction traiter() restera toujours de votre ressort.

De même, par défaut, vous n’avez plus à vous occuper du squelette. Il doit toujours être présent, avec le même nom que votre fichier PHP dans le dossier formulaires/, mais vous pouvez le laisser totalement vide. Saisies s’occupera de générer le bon HTML complet.

Dans le PHP, au côté des autres fonctions, vous devez alors déclarer les saisies :

formulaires_monformulaire_saisies_dist() {
    $saisies = array();
 
    return $saisies;
}

Cette fonction doit retourner un tableau PHP contenant la liste de toutes vos saisies suivant un formalisme attendu.

Le tableau doit respecter les points suivant :

  • Chaque ligne du tableau d’ensemble est une saisie, elle-même étant décrite dans un tableau. L’ordre des éléments sera l’ordre des saisies.
    $saisies = array(
    	array(), // une saisie
    	array(), // une saisie
    	array(), // une saisie
    );
  • Chaque saisie individuelle est un tableau de la forme :
    array(
    	'saisie' => 'input',
    	'options' => array(
    		'nom' => 'nom',
    		'label' => 'Votre nom',
    		'size' => 50
    	),
    );
  • Les saisies qui acceptent des enfants (comme les fieldsets) les placent dans une clé “saisies” qui contiendra un tableau ayant la même structure que le tableau global :
    $un_fieldset = array(
    	'saisie' => 'fieldset',
    	'options' => array(
    		'nom' => 'mon_groupe',
    		'label' => 'Mon groupe de champ'
    	),
    	'saisies' => array(
    		array(), // une autre saisie
    		array(), // une autre saisie
    		array(), // etc
    	)
    );

Appliquer une vérification

Pour des vérifications simples et uniques, avec le plugin API de Vérification vous pouvez en plus déclarer une vérification à appliquer sur chacune de vos saisies.

Il faut alors ajouter une clé “verifier” selon ce formalisme :

array(
	'saisie' => 'input',
	'options' => array(
		'nom' => 'nom',
		'label' => 'Un nombre entre 100 et 500',
		'obligatoire' => 'oui',
	),
	'verifier' => array(
		'type' => 'entier',
		'options' => array(
			'min' => 100,
			'max' => 500
		),
	),
);

Options globales

Il est possible aussi de déclarer quelques options d’affichage qui sont globales à l’ensemble du formulaire. Elles sont alors placées dans une clé “options” à la racine du tableau.

$saisies = array(
	'options' => array(
		// Changer l'intitulé du bouton final de validation
		'texte_submit' => 'Valider c’est gagné',
 
		// Transformer votre formulaire en multi-étapes
		// Chaque fieldset racine sera reconnu comme étant une étape !
		'etapes_activer' => true,
 
		// Changer l'intitulé du bouton suivant
		'etapes_suivant' => 'Suivantissime',
 
		// Changer l'intitulé du bouton précédent
		'etapes_precedent' => 'Previously on Lost',
	),
	array(), // une saisie
	array(), // une saisie
	array(), // une saisie
);

La balise #GENERER_SAISIES

Dans la plupart des cas vous n’avez pas à l’utiliser vous-même. Il se peut cependant que vous désiriez gérer malgré tout le squelette de votre formulaire.

Cette balise permet de générer toutes les saisies d’un formulaire, en une seule fois. Pour cela on lui passe en paramètre le tableau de description.

Exemple d’utilisation :

<div>
	#GENERER_SAISIES{#ENV{_saisies}}
</div>

On notera l’emploi d’un _ en préfixe de la variable d’environnement. Cela permet que les guillemets présents dans les options ne soient pas transformés en entités HTML [1].

La balise #VOIR_SAISIES

Cette balise permet d’afficher toutes les valeurs saisies après validation d’un formulaire. On lui passe en paramètre deux arguments :

  1. le tableau de description des saisies (au même format que pour #GENERER_SAISIES)
  2. un tableau des valeurs saisies

Exemple d’utilisation, dans le squelette d’un formulaire :

[(#EDITABLE|non)
	#VOIR_SAISIES{#ENV{mes_saisies}, #ENV}
]

Problème avec Xdebug

Si vous êtes développeur et que vous utilisez le logiciel Xdebug, il existe un problème connu : par défaut celui-ci affiche une erreur à partir d’un certain niveau d’imbrication de fonctions PHP (“nesting level” dirait Shakespeare).

Le niveau d’imbrication autorisé par défaut est relativement bas, mais on peut le modifier avec une variable. Vous devez donc ajouter cela dans votre configuration PHP/Xdebug :

[xdebug]
xdebug.max_nesting_level = 200 ou 500 ou plus…

Et hop, ça remarche.

updated on 2 October 2019

Discussion

142 discussions

  • 5

    bonjour,
    je télécharge saisie depuis cette page
    Version 3.8.3
    (ZIP – 193.5 ko) SPIP 3.0, SPIP 3.1, SPIP 3.2
    quand j’active le plugin il me met dans la page des plugins actif :
    Saisies pour formulaires 2.28.0 - stable
    Écrire facilement des champs de formulaires
    Est ce normal ? quelle est vraiment la version
    merci

    • je suis étonné. La version marqué “saisies_v3” contient bien la version 3.x de saisies

    • Bonjour,
      merci de me répondre., entre temps, pressé par une démo à faire, j’ai posé la question sur la liste et j’ai eu cette réponse de Frank
      « ce qui c’est passé, c’est que au moment de la création de la 3eme branche, il y a eu oubli de faire l’ajout du zip dans l’article puisque ce n’est pas automatique (contrairement à plugin.spip). Je viens de mettre à jour les zips dans l’article de contrib😊»

      Si j’ai bien compris les différentes réponses, il est préférable :
      -  En manuel de prendre en priorité sur plugin.spip
      -  En automatique suivre la procédure expliqué sur https://www.spip.net/fr_article3396.html

    • A oui, c’est bien possible (même si normalement c’est censé être automatique, ca bug)

    • Oui normalement c’est bien automatique (mais pas immédiat) : d’abord ça génère les ZIP, ça se met à jour sur plugins.spip (après déjà un délai) et ensuite un autre robot reporte ces ZIP sur Contrib (deuxième délai).

      Je sais pas si des trucs ont pu sauter avec la mise à jour des squelettes de Contrib…

    • Rasta: c’est surtout que le robot qui met à jour sur contrib le fait de la mnière aléatoire (il prend x plugin au hasard) et pas de manière linéaire...

      LA sortie de la version 3 de saisies date de bien avant la nouvelle version de contrib

    Reply to this message

  • 2

    Bonjour,
    Dans la descriptions des saisies, au niveau des styles de l’espace privé des formulaires, l’option d’avertissement (attention) n’est pas stylisée:

    code généré entre “explication” et “la saisie”

    <em class="attention">ça pique</em>

    Est ce possible d’ajouter les styles de saisie qui vont bien? (attention = notice?)
    J’oublie peut être quelque chose?

    Reply to this message

  • 2

    Bonjour,
    j’utilise saisie avec un formulaire yaml.
    est-il possible d’avoir un champ <input type=’color’ avec la derniere version de saisie ? si oui comment ?
    merci

    Reply to this message

  • 6

    Je note ici pour ne pas oublier : l’option afficher_si ne fonctionne pas pour les saisies enfants d’une saisie fieldset

    • Je m’en sert régulièrement sur un formulaire formidable sans souci.

    • Ah oui, je confirme, ça fonctionne dans formidable.
      Moi c’est dans le contexte de saisies générées à partir d’un yaml, pour une noisette.
      Le JS n’est pas présent dans le squelette compilé (mais il y a bien le data-afficher_si sur le .editer).

      parametres:
        -
          saisie: 'fieldset'
          options:
            nom: 'fieldset_affichage'
            label: 'Options d’affichage'
            saisies:
              -
                saisie: 'radio'
                options:
                  nom: 'choix_titre'
                  label: 'Choix du titre'
                  datas:
                    defaut: 'Par défaut'
                    perso: 'Titre personnalisé'
              -
                saisie: 'input'
                options:
                  nom: 'titre'
                  label: 'Titre personnalisé'
                  afficher_si: "@choix_titre@=='perso'"
    • Ça fonctionne très bien tout compte fait, je n’avais pas indenté le yaml correctement, cf https://contrib.spip.net/noiZetier-v2#forum494678

    • Salut!

      Lorsque j’utilise un fichier yaml pour générer mes saisies j’ai un gros bug avec la syntaxe des critères afficher_si

      1. afficher_si: "@choix_titre@ IN 'perso'"

      Avec une condition de type == ou != pas de problème

      PHP Parse error:  syntax error, unexpected ’IN’ (T_STRING) in /var/www/spip3.2/sites/dist/plugins/auto/saisies/v2.26.9/inc/saisies_afficher.php(550) : eval()’d code on line 1, referer: http://dist.loc/spip.php?article1&id_article=1&var_mode=recalcul
    • Salut,

      je n’ai jamais utilisé YAML pour des saises. Pas impossible qu’il y ait des soucis dans le parseur. Mais sinon, je suis même pas certains que IN soit acceptés en tant que tel (je me rappelle plus).
      Dans tous les cas, il me faudrait un YAML complet mais minimum pour résoudre le problème.

    • chez moi dans les options ceci fonctionne :

         label: "titre du bloc"
          afficher_si: '@afficher@=="inclusdans"'

      regarde si tu n’as pas un problème d’indentation

    Reply to this message

  • Bonjour,
    Je teste le générateur de formulaire qui utilise ceplugin, et il m’a l’air très bien, sauf qu’il me manque des champs importants, la possibilité de saisir des coordonnées gps, et surtout d’afficher des cartes (google map ou open street) avec ses coordonnées et des infos sous forme de bulles sur la carte.
    Des idées pour pouvoir le faire ?
    Merci de votre travail partagé à la communauté.

    Reply to this message

  • 6

    Bonjour,

    Pour éviter à d’autres d’avoir le problème.

    Avec formidable, j’ai un formulaire qui a des cases à cocher.
    Il est donc possible de sélectionner plusieurs items dans la liste.

    Mais dans le mail envoyé, et dans ecrire/?exec=formulaires_reponses&id_formulaire=1 quand je vais voir le détail, je n’ai que la première option de mémorisée, alors que j’ai mis d’autres valeurs.

    Raison : je faisais :
    165/Hotelvendredi|Hôtel vendredi 9 novembre<br />165 €

    En remplaçant le / par &, plus de problème !

    • Précision : ce qui marche, c’est donc :
      165&Hotelvendredi|Hôtel vendredi 9 novembre<br />165 €

    • A oui, le / est utilisé pour des sous entrées. Du coup je ne sais pas si on peut résoudre ce bug facilement sans casser le reste. Il faudrait pouvoir échapper le / mais je ne suis pas sûr que cela vaille la peine....

    • Non, je ne crois pas que ça vaille la peine.

      Par contre, où est la doc de ce “/” ?

    • Je sais pas s’il y une doc. J’ai vu passer cela récemment en lisant le code pour améliorer un point.

    • Des sous entrées de quoi ?

      Moi je me rappelais juste du truc ajouté par Maieul qui ajoute de la syntaxes pour faire des groupes dans les textarea libres pour les valeurs de select. Mais pour les radios et cases là je me souviens pas d’ajouts.

    • j’ai du confondre avec autre chose, je retrouve pas.

    Reply to this message

  • 5

    Bonjour,

    Suite à une mise à jour, j’observe un problème très spécifique avec le plugin Champs_extra_interface. Cela concerne concerne l’affichage d’erreur si la condition de champs extra sont activé à la fois dans le champ “Afficher si remplissage” et dans le champ “Afficher si”.

    Il me semble qu’il faille une condition “AND” entre le traitement de ces 2 champs. Si c’est le cas, je propose d’ajouter ligne 498 de “saisie_afficher.php” :

    if ( $condition != " ") {
    	$condition .= "&& ";
    }
    • Mmm je ne connais pas assez le afficher si (pas du tout même) pour avoir un avis :(
      Maieul ?

    • Les dernières versions du plugins suppriment ce double système d’afficher_si pour avoir juste une option qui conditionne le même où afficher_si s’applique.

    • Il n’est donc pas possible d’avoir plusieurs valeurs ?

      @radio_3@=="toto1"
      @radio_3@=="toto2"

      Parce que, comme je le note ci-dessus, ça ne fonctionne pas...
      Ni comme ça d’ailleurs :

      1. @radio_3@=="toto1,toto2"

      Il faut faire un array ?

    • Si tu veux faire un test “ou”, tu fais

      radio_3@=="toto1" || radio_3@=="toto2"

    Reply to this message

  • 1

    Bonsoir,

    d’abord désolé pour les accents, je n’ai pas de clavier azerty.

    Dans un soucis de mise a jour de mon site de spip 3.0 -> spip 3.2, je viens de tester la zone de saisie de date utilisant le dateur de Bonus sur le squelette-dist du dernier spip 3.2 avec un Saisie compatible version 2.19.8 SVN [107777]. Avec un Bonus compatible version 3.4.6 SVN [107681] active, le Datepicker de Bonus n’apparait malheureusement pas.

    Je l’avais auparavant sur mon propre squelette en spip 3.0 (je l’ai aussi teste sur le squelette-dist de spip 3.0) avec un plugin Saisie moins recent version 2.5.16 SVN [91819] et Bonus version 3.2.1 SVN [90054]. C’était impeccable.

    Y-a-t-il un bug de la zone de saisie de date utilisant le dateur de Bonus avec le nouveau spip 3.2?

    C’est le seul bug de ma mise-a-jour, pas de bol ;-(

    Merci pour votre attention!

    • Sorry, fausse alerte: je pense que mon squelette était responsable du Bug. J’ai bidouille de sorte a mettre a jour quelques scripts de mon squelette et les choses sont rentrées dans l’ordre.
      Spipement,

    Reply to this message

  • 1

    Bonjour

    Je rencontre un problème avec ce plugin lors l’activation de la compression JS (dans l’admin > Fonction avancées > Optimisations et compression > Activer la compression des scripts)

    J’ai une erreur JS dans la console :

    Uncaught TypeError: $(...).parents is not a function

    Ce qui correspond a cette ligne inclus automatiquement dans ma page au niveau du formulaire :

    $(“#afficher_si_1385088934”).parents(“form”).change(function()verifier_saisies_1385088934(this););

    Qui est généré par le fichier saisies_afficher.php L.411 (plugins/saisies/inc/saisies_afficher.php) :

    code .= ’$(“#afficher_si_’.$id_form.’”).parents(“form”).each(function()verifier_saisies_’.$id_form.’(this););’;

    Sans compression, aucun problème
    Avec compression, l’erreur apparaît

    Quelqu’un peut m’aider ?
    Merci.

    • Ça sent le javascript de jQuery mais qui n’est pas inclus dans un entourage standard qui permet de le lancer seulement quand on est sûr que tout est chargé avant. Ce qui fait que ce serait lancé avant jQuery et que donc ça planterait puisque ça ne trouverait pas $.parents etc.

    Reply to this message

  • 1

    Bonjour à tous

    Juste pour signaler que sur un site 3,1 j’ai une petite erreur dans la console de mon navigateur :

    ReferenceError: Can't find variable: jQuery sur le fichier saisies.js

    avec mon formulaire (formidable)

    Pourquoi ?
    (le site fonctionne et je n’ai pas de conflit jQuery )

    Merci de votre aide

    • Re,

      Je réponds, j’ai effectué un nettoyage dans mon html ( notamment balise

      en doublon)

      et tout est rentré dans l’ordre.

      Merci encore aux personnes présentes sur irc #spip qui sont là entre autres à veiller au grain du Core, mais aussi à dépatouiller les âmes en détresse ;)

      Cordialement.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom