Table of contents
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.html
qui accueillera les balises gérées par SPIP et Saisies -
film.php
où 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
:
$mes_saisies = array(
array( // le fieldset
'saisie' => 'fieldset',
'options' => array(
'nom' => 'le_film',
'label' => 'Le film'
),
'saisies' => array( // les champs dans le fieldset
array( // champ titre : ligne de texte
'saisie' => 'input',
'options' => array(
'nom' => 'titre',
'label' => 'Son titre',
'obligatoire' => 'oui'
)
),
array( // champ annee : 4 chiffres
'saisie' => 'input',
'options' => array(
'nom' => 'annee',
'label' => 'Année de réalisation',
'size' => 4,
'maxlength' => 4
)
),
array( // champ genre : liste déroulante
'saisie' => 'selection',
'options' => array(
'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'
)
)
),
)
),
array( // hors fieldset : avis
'saisie' => 'radio',
'options' => array(
'nom' => 'c_bien',
'label' => 'C\'est bien ?',
'data' => array(
'oui' =>'Oui c\'est bien',
'non' =>'Non ce n\'est pas 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}}
<div class="editer-groupe">
#GENERER_SAISIES{#ENV{mes_saisies}}
</div>
</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() {
$mes_saisies = array (
...
);
return $mes_saisies;
}
function formulaires_film_charger_dist() {
// on charge les saisies et les champs qui nécessitent un accès par les fonctions
$valeurs = array(
'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) :
$mes_saisies = array(
...
array(
'saisie' => 'input',
'options' => array(
'nom' => 'annee',
'label' => 'Année de réalisation',
'size' => 4,
'maxlength' => 4
),
'verifier' => array(
'type' => 'entier',
'options' => array (min => 1895, max => (date('Y')+1))
)
),
...
);
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
return array('message_erreur'=>'Le film n\'a pas été enregistré');
// Sinon, le message de confirmation est envoyé
return array('message_ok'=>'Le film a été enregistré');
}
Discussions par date d’activité
11 discussions
Bonjour,
Je crois bien qu’il y a dans cet article une parenthèse de trop à la fin du premier script php
«Première étape : déclarer ces champs comme des saisies à l’aide d’un tableau PHP [1], dans film.php :»
Reply to this message
Bonjour. Je suis extrèmement malheureux, car je n’arrive pas depuis de nombreuses années à créer un formulaire tout simple avec SAISIES. Comme je ne suis pas du genre à me laisser faire, j’ai donc décidé de prendre le taureau par les cornes et de débuter le plus simplement du monde en recopiant le code de ce tutoriel (j’ai expurgé la section concernant le input) pour au moins réussir à afficher le formulaire (donc jusqu’à charger). Et comme il faut faire proprement les choses, je l’ai fait sur un spip tout neuf (3.2.5) avec la version SAISIES qui lui est contemporaine.
Mais même là, rien ne s’affiche après que la fonction chargée ait été enregistrée, que ce soit avec la balise #FORMULAIRE_FILM ou
<formulaire|film>
.J’ai donc une seule question qui me pose problème : comment puis-je réellement apprendre à utiliser ce rétif SAISIES ?
PS J’ai perdu tous mes cheveux, je ne risque donc plus grand chose. Donc merci pour vos aides.
PPS : La chose la plus surprenante est que les fichiers proposés n’ont aucune différente lorsqu’on les compare à ceux copié-collés, et pourtant ceux-ci fonctionnent.
peux tu nous envoyer ton code? on pourra voir s’il y a des choses qui clochent :)
Bonjour,
J’ai fini par reprendre le tableau de $mes_saisies tel quel et d’en faire une modification pour être sur que ça passe. Probablement une parenthèse en plus ou en moins, mes vieux yeux en sont surement la cause. Merci anyway.
Reply to this message
Bonjour,
je fais un plugin avec la fabrique. J’ai la saisie rubrique_article et j’ai une saisie avec une checkbox.
dans la fonction formulaires_editer_blocs_parametre_traiter_dist j’ai bien mis
set_request(’variante’ , implode(’,’, _request(’variante’))); pour la checkbox
set_request(’lesobjets’, implode(’,’, _request(’lesobjets’))); pour les objets rubrique et article
cela fonctionne bien si je sélectionne un ou plusieurs éléments mais j’ai une erreur à l’enregistrement si je n’en sélectionne aucun ...
avez vous une idée du pb.
merci
j’ai trouvé ... pour traiter le cas ou aucun choix n’est fait, ou un choix, ou plusieurs choix
il faut mettre dans la fonction traiter_dist dans le fichier formulaire/ editer....php
Reply to this message
Bonjour,
dans votre cours, vous avez créé un formulaire pour saisie de données
mais après, qu’est-ce qu’on fait des données
dans article y a pas de place pour ces types de données?
merci
Salut,
Le traitement des données n’est pas abordé ici, c’est juste un exemple pour essayer de comprendre comment fonctionnent les «saisies». Tu peux les enregistrer dans la base, les faire traiter par un plugin (pipeline) ou autre...
Pour le 2è point, je ne comprends pas la question
(o:
merci,
je voulais dire : les données titre, année, genre ne sont pas des colonnes de la table articles
je suppose qu’il faut créer une nouvelle table ...
là, c’est difficile, j’ai trouvé de la vielle doc (art de marcilla ...) avec une vieille version de spip
en v3, ca à changé ... si tu connais une bonne doc pour ajouter un champ dans la table articles (exemple no tél) alors merci d’avance
C’est tout l’intérêt des Saisies et le plugin Champs Extra devrait répondre à ta problématique
Reply to this message
Bonjour à vous
J’ai un soucis avec 2 champs de formulaire, checkbox et selection_multiple
Voici la réponse à l’enregistrement :
Warning: md5() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php on line 355
Warning: md5() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php on line 355
Warning: addslashes() expects parameter 1 to be string, array given in /Users/christophevandewalle/Sites/kisetou/ecrire/req/mysql.php on line 1186
Warning: Cannot modify header information - headers already sent by (output started at /Users/christophevandewalle/Sites/kisetou/ecrire/inc/editer.php:355) in /Users/christophevandewalle/Sites/kisetou/ecrire/inc/actions.php on line 89
Quelqu’un aurai une idée?
Merci
Spip 3.0.11
Saisies 1.35.0
Yaml 1.5.1
As-tu trouvé la réponse à ta question ? J’ai le même problème avec selecteur_article et la Fabrique
Une question vue ici aussi : La fabrique/forum469283
J’utilise aussi le selecteur d’article. Dans mon cas, l ’erreur md5 est générée par la fonction vérifier() de CVT.
La transformation :
set_request('champ', implode(",", _request('champ')));
doit donc être appliquée dans la fonction
formulaires_editer_Nom_de_l_Objet_vérifier()
avant l’appel à la fonction générique
formulaires_editer_objet_verifier()
cause :
controler_md5()
n’accepte pas de tableau pour la valeur d’un champ, il y a peut-être une autre fonction plus adaptée.Reply to this message
Bonjour à tous,
4 jours que moi et mon collègues essayons de faire quelque chose qui conceptuellement est basique mais en vain: afficher dans le .html les résultats d’un formulaire de choix après traitement par le .php associé.
En clair nous avons créé un formulaire de choix qui, après sélection des critères choisis par l’ utilisateur, va générer la requête SQL à notre banque de données.
les fonctions charger() et verifier() marchent (tests avec return() et autres messages d’erreurs qui s affichent aux moments attendus). traiter() fonctionne aussi (là aussi vérifié grâce a des return).
Ce que nous souhaiterions faire c’est retourner sur notre page de formulaire après traitement des données et afficher nos résultats qui sont tous stockés dans un tableau ’resultats’.
En bref il faudrait que depuis le html, SPIP recupère le tableau ’resultats’, le parcourt et affiche tous ses éléments.
Nous avons déjà tenté les pistes:
#ENV (sur le modèle de l’affichage des erreurs dans le formulaire tel que présenté dans le tuto (http://programmer3.spip.net/Gerer-le-retour-d-erreurs)
#SET et #GET mais on a un peu de mal avec la syntaxe pour que SPIP comprenne où sont les éléments de notre tableau ’resultats’.
Merci d’avance. Espérons que le problème soit réglé avant le week-end. :))
bonjour,
il faudrait voir un peu votre état actuel de cvt + html. Je vous conseille par ailleurs de passer sur l’irc de spip : il y aura sans doute des gens très compétence pour vous répondre.
heu question encore plus bête: c est quoi l’irc??
c’est une sorte de chat autour de spip. En général il y a tjr des gens pour répondre. http://webchat.freenode.net/?channels=%23spip
Reply to this message
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
Bonjour,
Pour l’insertion des valeurs dans la BDD, j’utilise cette fonction : http://doc.spip.org/@sql_insertq
comme ça :
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
as-tu essayé
set_request('champ','valeur')
?à définir avant le retour de Traiter, avec:
sql_insertq
Reply to this message
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.
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.
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
Reply to this message
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 :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... :)
Reply to this message
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?
Reply to this message
Ajouter un commentaire
Follow the comments:
|
