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.

Dernière modification de cette page le 17 mars 2019

Discussion

136 discussions

  • 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"
    • Super ! Merci !

    Répondre à ce 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,

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce message

  • Bonjour,

    Je trouve deux chaînes codées en dur dans le fichier saisies_doc.html

    Peut-être une petite modification pour une prochaine version de cet excellent plugin ?

    Cordialement,
    Hanjo

    Répondre à ce message

  • 1

    Bonjour,
    sans conséquences notables à ce moment, voici les messages (que je trouve alarmants inutilement) sur un mise à jour de quelques plugins :

    Erreurs survenues (donc en rouge)
    Impossible d’activer le plugin ../plugins/auto/saisies/v2.18.1
    Utilise le plugin VERIFIER en version ≥ 1.6.0.
    Impossible d’activer le plugin ../plugins/auto/ieconfig/v1.3.1
    Impossible d’activer le plugin ../plugins/auto/jeux/v3.4.1
    Impossible d’activer le plugin ../plugins/auto/menus/v1.6.5
    Nécessite le plugin ZPIP
    Nécessite le plugin SPIPR
    Nécessite le plugin SPIPR_BLOG
    Nécessite le plugin SPIPR_DIST
    Nécessite le plugin SPIPR_DOC
    Impossible d’activer le plugin ../plugins/auto/fbantispam/v1.2.3
    Impossible d’activer le plugin ../plugins/auto/noizetier/v2.5.0
    Impossible d’activer le plugin ../plugins/squelette_maparaan
    Nécessite le plugin TYPOENLUMINEE
    Nécessite le plugin GRAVATAR
    Nécessite le plugin SLOGAN
    Impossible d’activer le plugin ../plugins/auto/formidable/v3.0.1
    Utilise le plugin COLLECTIONJSON en version ≥ 1.5.0.
    Utilise le plugin CVTUPLOAD en version ≥ 1.9.4.
    Utilise le plugin CORBEILLE en version ≥ 3.1.0.
    Impossible d’activer le plugin ../plugins/auto/aveline/v2.5.7
    Utilise le plugin ZVIDE en version ≥ 2.0.0.
    Utilise le plugin SUIVANT_PRECEDENT en version ≥ 1.3.1.
    Utilise le plugin ANYTHINGSLIDER en version ≥ 2.0.0.

    Actions réalisées (en vert = OK)

    La mise à jour du plugin « Saisies pour formulaires » (de la version : 2.17.1 à 2.18.1) s’est correctement déroulée
    La mise à jour du plugin « NoSPAM » (de la version : 1.5.15 à 1.5.16) s’est correctement déroulée
    La mise à jour du plugin « Facteur » (de la version : 3.4.8 à 3.4.9) s’est correctement déroulée
    L’installation du plugin « Facteur » (version : 3.4.9) s’est correctement déroulée
    La mise à jour du plugin « API de vérification » (de la version : 1.4.2 à 1.6.0) s’est correctement déroulée

    • Ces problèmes (ordre pas toujours correct des plugins à activer) sont corrigés en version 3.2 de SPIP (actuellement en beta), ce qui enlève la plupart de ces fausses erreurs.

    Répondre à ce message

  • 3

    Bonjour,
    Pouvez-vous me dire s’il est possible d’associer à un champ input un élément « datalist » de manière à avoir non seulement la possibilité de saisir une valeur mais également une liste de valeurs possibles. La fonction autocomplete peut être une piste mais elle ne prend en compte que les valeurs déjà saisies par l’utilisateur alors que je voudrais m’appuyer sur une liste de choix déterminée. Merci pour votre retour

    Répondre à ce message

  • 4
    Chourak

    Bonjour,

    Est-il voulu que sur une saisie de type radio et obligatoire (en html5) il n’y ait pas de required="required" sur l’input correspondant ?

    • C’est peut-être un oubli oui, mais note quand même que normalement pour des radios, en ergonomie il *devrait* y avoir l’un des boutons déjà coché, car ce sont des radios et qu’on ne ensuite jamais revenir à l’état « pas coché ».

    • Pas d’accord avec toi. Car avec une option déjà coché, au cours le risque que la personne ne vérifie pas la valeur.

      Ex avec deux choix : « j’autorise à prendre des photos » / « je n’’autorise pas ». Si je coche par défaut l’un des deux je risque de ne pas réeellement recueillir le consentement

    • Il peut sûrement y avoir des exceptions mais c’est une mauvaise pratique la majorité du temps.

      Le W3C dit

      To avoid confusion as to whether a radio button group is required or not, authors are encouraged to specify the attribute on all the radio buttons in a group. Indeed, in general, authors are encouraged to avoid having radio button groups that do not have any initially checked controls in the first place, as this is a state that the user cannot return to, and is therefore generally considered a poor user interface.

    • Vos deux points de vue se valent !

      Dans mon cas c’est un simple choix de civilité Monsieur / Madame, mais qui est obligatoire.
      Je ne peux pas préjuger de la civilité de la personne qui remplit le formulaire, je préfère donc que rien ne soit coché par défaut et qu’en cas d’oubli le fait que ce soit obligatoire « force » les gens à choisir la bonne civilité.

      J’ai donc surchargé localement la saisie radio pour prendre en compte le required.

      merci :)

    Répondre à ce message

  • 1
    Alexandre

    Bonjour,
    J’ai rencontré un problème avec la fonction "afficher_si" sur des checkbox donc la valeur est composé de plusieurs mots. J’ai corriger ce problème dans le fichier "saisies_afficher.php" à la ligne 386 :

    $condition = preg_replace('#@'.preg_quote($nom).'@#U', '($(form).find(".checkbox[name=\''.$nom.'[]\'][value=\''.$value.'\']").is(":checked") ? $(form).find(".checkbox[name=\''.$nom.'[]\'][value=\''.$value.'\']").val() : "")', $condition);

    Ajout de « \’ » dans « [value=’.$value.’] »

    Cependant les valeurs contenant des espace et des «  » risque de poser problème non ? :)

    • j’avoue ne pas savoir. A tester non ? et puis il faut aussi du coup modifier un fichier qui effectue un test sur afficher_si lorsqu’on vérifie qu’un champ obligatoire est bien rempli

    Répondre à ce message

  • 2

    Amélioration ?
    Bonjour , je cherche à paramétrer et supprimer les 3 lignes envoyées dans l’email de confirmation à celui qui poste :
    « Envoi via le site MONSITE
    Vous pouvez voir cette réponse sur cette page.
    Vous pouvez gérer l’ensemble des réponses sur cette page. »

    Comment est-ce possible SVP ? Merci d’avance
    (MAJ de V2.18.1 vers 2.18.2 sans soucis au passage)

    • Salut, je ne vois pas de quoi tu parles ni le rapport avec Saisies, ce plugin n’envoyant aucun email. Repose sûrement la question sur le plugin qui fait cet envoi dont tu parles. :)

    • oui effectivement , c’était pour toi mais dans le plugin Formulaires.désolé

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom