Avertissements
Cet article est
- un « retour d’expérience » sur l’utilisation du plugin Saisies pour la mise en place d’un formulaire ;
- un partage de réponses aux questions qui se sont posées à moi lors de ma découverte du plugin.
Cet article n’est pas
- exhaustif : les descriptions qui suivent partent seulement d’un point de vue particulier (un des intérêts de Saisies étant sa pluralité d’approche en terme de développement) ;
- une documentation développeur.
Le formulaire
Pour cet exemple, le formulaire à réaliser contient 4 champs et 1 fieldset :
- Fieldset Le film :
- titre,
- année,
- genre
- Avis : c’est bien ?
Comme tous les formulaires C.V.T, créer un couple de fichiers HTML/PHP dans le dossier squelettes/formulaires :
-
film.htmlqui accueillera les balises gérées par SPIP et Saisies -
film.phpoù sera paramétré le formulaire avec les fonctions C, V et T
Première étape : déclarer ces champs comme des saisies à l’aide d’un tableau PHP [1], dans film.php :
- 'saisie' => 'fieldset',
- 'nom' => 'le_film',
- 'label' => 'Le film'
- ),
- 'saisie' => 'input',
- 'nom' => 'titre',
- 'label' => 'Son titre',
- 'obligatoire' => 'oui'
- )
- ),
- 'saisie' => 'input',
- 'nom' => 'annee',
- 'label' => 'Année de réalisation',
- 'size' => 4,
- 'maxlength' => 4
- )
- ),
- 'saisie' => 'selection',
- 'nom' => 'genre',
- 'label' => 'Son genre',
- 'datas' => array( // apparté : penser à ranger les choix par ordre alphabétique (ou numérique), c'est plus facile à trouver pour ceux qui utilisent le formulaire
- 'animation' => 'Animation',
- 'comedie' => 'Comédie',
- 'docu' => 'Documentaire',
- 'drame' => 'Drame',
- 'sf' => 'Science-fiction'
- )
- )
- ),
- )
- ),
- 'saisie' => 'oui_non',
- 'nom' => 'c_bien',
- 'label' => 'C\'est bien ?'
- )
- ),
- )
- );
Tous les éléments de saisie du formulaire sont définis. Il reste cependant le bouton d’envoi du formulaire (submit) à créer.
Ici (et à l’heure actuelle), deux possibilités :
- écrire le bouton en HTML dans
film.html:<input type="submit" value="envoyer" /> - créer son propre type de saisie pour cet élément
Créer son propre type de saisie
Créer un sous-répertoire saisies dans /squelettes, y placer un nouveau fichier qui prendra pour nom le type de la saisie : mon_submit.html et y écrire le code HTML/SPIP du bouton :
- [(#REM)
- Parametres :
- -* nom (obligatoire) : attributs name et id du bouton
- -* texte (optionnel) : attribut value, par défaut Envoyer
- -* class (optionnel) : attribut class, par défaut submit
- Exemple d'appel :
- [(#SAISIE{mon_submit, envoyer,
- texte=Ok
- })]
- ][
- <input type="submit" name="(#ENV{nom})" class="#ENV{class, submit}" id="bouton_#ENV{nom}" value="#ENV{texte,Envoyer}" />]
(prendre pour exemple un des fichiers de saisie du plugin dans /plugins/saisies/saisies/)
Ajouter la déclaration du bouton à la fin du tableau $mes_saisies (l’ordre de déclaration définit l’ordre d’affichage) :
Générer et Charger le formulaire
Les saisies sont prêtes, on peut les appeler avec #GENERER_SAISIES{#ENV{mes_saisies}} dans film.html
Cette balise ne produit que les éléments contenus dans le formulaire. Il reste donc un peu de travail pour terminer ce formulaire :
- [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
- [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
- [(#EDITABLE|oui)
- <form id="film_form" name="film_form" action="#ENV{action}" method="post">
- #ACTION_FORMULAIRE{#ENV{action}}
- <ul>
- #GENERER_SAISIES{#ENV{mes_saisies}}
- </ul>
- </form>]
Maintenant, le formulaire peut être appelé avec la balise #FORMULAIRE_FILM dans un squelette ou avec le raccourci typographique <formulaire|film> à l’intérieur d’un article par exemple.
En prenant ce dernier exemple et en affichant l’article dans la partie publique, rien ne se passe ...c’est normal.
#ENV{mes_saisies} « n’existe pas » encore dans le contexte de la page affichée. Pour ce faire, il faut d’abord mettre en œuvre les fonctions C, V et T qui vont gérer toutes les variables :
- Charger les données de Saisies et les champs à manipuler par ces fonctions
- Vérifier les valeurs envoyées par le formulaire
- Traiter ces données vérifiées
- Ainsi qu’une fonction qui permettra d’envoyer à ce trio la structure des saisies (tableau
$mes_saisies). Appelons-lames_saisies_film().
- function mes_saisies_film() {
- ...
- );
- return $mes_saisies;
- }
- function formulaires_film_charger_dist() {
- // on charge les saisies et les champs qui nécessitent un accès par les fonctions
- 'titre' => '',
- 'genre' => '',
- 'annee' => '',
- 'c_bien' => '',
- 'mes_saisies' => mes_saisies_film()
- );
- return $valeurs;
- }
En recalculant l’article contenant le formulaire, il doit maintenant s’afficher.
Vérifier les saisies
Le plugin Verifier entre en scène. Saisies utilise un pipeline pour s’y « brancher ». Il est toutefois nécessaire de déclarer dans la structure des saisies les vérifications souhaitées : ajouter un tableau verifier dans le tableau de la saisie à... vérifier.
Ici, le champ annee doit être un nombre (type entier) compris entre 1895 et l’année en cours + 1 (on pourrait anticiper une sortie) :
Le tableau verifier peut prendre plusieurs options, selon son type
[2]. Se reporter aux fichiers de vérification du plugin dans /plugins/verifier/verifier/.
Il suffit ensuite de compléter la fonction formulaires_film_verifier dans film.php :
- function formulaires_film_verifier_dist() {
- // on va chercher le pipeline saisies_verifier() dans son fichier
- include_spip('inc/saisies');
- // on charge les saisies
- $mes_saisies = mes_saisies_film();
- // saisies_verifier retourne un tableau des erreurs s'il y en a, sinon traiter() prend le relais
- return saisies_verifier($mes_saisies);
- }
Traiter le formulaire
La fonction « T » dans film.php est appelée après la fonction « V », si celle-ci ne retourne pas d’erreurs.
- function formulaires_film_traiter_dist() {
- // on charge les saisies, si besoin
- $mes_saisies = mes_saisies_film();
- // Traitement des données reçues du formulaire,
- // par mail par ex ou insertion dans une base
- ...
- // S'il y a des erreurs, elles sont retournées au formulaire
- // Sinon, le message de confirmation est envoyé
- }



Les fichiers du formulaire « film »
Vos commentaires
# Le 11 mai 2011 à 15:38, par rburton
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Bonjour,
après validation du formulaire et insertion en bdd, comment récupérer dans la page publique l’id de l’enregistrement créé ?
Merci,
RB
# Le 11 mai 2011 à 17:45, par stefdn
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Bonjour,
Pour l’insertion des valeurs dans la BDD, j’utilise cette fonction : http://doc.spip.org/@sql_insertq
comme ça :
# Le 12 mai 2011 à 17:04, par rburton
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Bonjour,
merci, j’avais trouvé ça aussi. Ce que je sais pas c’est comment utiliser cette valeur pour la retourner dans ma page web après validation du formulaire .... j’arrive à retourner message_ok mais pas ça .... ????
Merci d’avance.
RB
# Le 12 mai 2011 à 18:13, par stefdn
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
as-tu essayé
set_request('champ','valeur')?à définir avant le retour de Traiter, avec :
sql_insertqRépondre à ce message
# Le 14 mars 2011 à 21:03, par Matthieu Marcillaud
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Autre chose, sachant que tu peux passer une valeur par défaut dans une saisie, tu pourrais lister tous les champs à utiliser et leurs valeurs par défaut également dans le charger(). Je me demande si Rastapopoulos a fait une fonction pour cela dans saisies.
# Le 15 mars 2011 à 00:32, par RastaPopoulos
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Il y a déjà une fonction pour ça dans Saisies. :)
Mais surtout je rappelle que depuis la version 1.9 Saisies permets même de faire un CVT sans ni la fonction charger() ni la fonction verifier() !
Uniquement en déclarant une fonction « formulaires_montruc_saisies() » cf la doc et l’exemple.
# Le 16 avril 2011 à 15:04, par Yffic
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Pour compléter le message de Rastapopoulos et pour ceux qui cherchent, la doc, c’est par là pour l’instant : http://www.spip-contrib.net/Doc-Saisies-complementaire
Répondre à ce message
# Le 15 mars 2011 à 01:03, par Joseph
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
On peut encore améliorer les choses pour la partie charger du formulaire. En effet, saisies fournit une fonction
saisies_charger_champs(). Dès lors, la fonction charger peut devenir :$mes_saisies = array (
...
);
return $mes_saisies;
}
function formulaires_film_charger_dist() {
// on charge les saisies et les champs
include_spip('inc/saisies');
$mes_saisies = mes_saisies_film();
$contexte = saisies_charger_champs($mes_saisies);
$contexte['mes_saisies'] = $mes_saisies;
return $contexte;
}
# Le 15 mars 2011 à 21:47, par RastaPopoulos
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Nan nan :
Ça c’est LA bonne méthode propre depuis la 1.9.0. :)
À tester/améliorer si besoin, mais normalement ça fait tout charger() et tout verfier() tout seul. En tout cas les besoins de base. Et à documenter ensuite... :)
Répondre à ce message
# Le 15 mars 2011 à 19:37, par charles
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Salut et merci pour cette note.
Je suis super embêter j’ai fait un peu la même chose mais je n’arrive pas à insérer en bdd.
Tout est bon sauf ma fonction _traiter, pourriez vous m’aider ? Auriez vous une idée ?
Répondre à ce message
# Le 14 mars 2011 à 20:56, par Matthieu Marcillaud
En réponse à : Un formulaire C.V.T avec Saisies par l’exemple
Sympa. D’autant plus que je ne connaissais pas
saisies_verifier($mes_saisies);Je pense par contre qu’il vaudrait mieux passer dans charger() « _saisies » ou « _mes_saisies » plutôt que « saisies » ou « mes_saisies » : le souligné en premier indique à SPIP de ne pas effectuer de traitements automatiques sur les données (http://programmer.spip.org/Charger-les-valeurs-du-formulaire).
Répondre à ce message