Carnet Wiki

’Carnet champs de formulaire’

Version 3 — April 2008 Cyril Marion

’L\’exemple ci-dessous consiste à pouvoir sélectionner des valeurs provenant d\’une liste de mots-clé SPIP, puis à passer ces valeurs à une boucle permettant d\’afficher des articles SPIP liés aux mots clé sélectionnés... Version de SPIP : 1.8.3

-  construire un formulaire qui propose une liste de cases à cocher, dont les valeurs proviennent d\’une table SPIP
-  récupérer la liste des valeurs chochées
-  faire passer la liste des valeurs cochées à une boucle SPIP

1. créer le formulaire

Imaginons une liste de pays, stockée en tant que mots-clé SPIP. Ces mots clé \“pays\” font tous partie d\’un groupe de mots clé appelé \“pays\” et portant le id_groupe = 2.

Imaginons proposer un formulaire qui permette au visiteur de sélectionner des pays :

<form name=\"choix_pays\" action=\"\" method=\"post\">
<BOUCLE_choix_pays(MOTS){id_groupe = 2}{par titre}>
<input type=\"checkbox\" name=\"pays[]\" /><label for=\"pays[]\">([#TITRE|supprimer_numero)]</label></br />
</BOUCLE_choix_pays>
<input type=\"submit\" name=\"OK\" value=\"OK\" />
</form>

Qui donnerait un formulaire de ce type :





2. récupérer les données...

On peut récupérer les données provenant du formulaire dans un tableau de variables php appelé pays[]. Mais après qu\’est-ce qu\’on en fait ? On les met dans une variable de type texte et on la passe par l\’url en get, pour en disposer dans une variable #ENV ?

Voici ce que j\’avais j\’ai commencé à faire en php; je cherche à confectionner une variable TEXTE que je voudrais ensuite passer à la boucle SPIP :

                <ul><?php 
                        $mes_pays = \"\";
                        $tab = $_GET[\'pays\'];
                        foreach ($tab as $k => $v) {
                                // je construis la liste séparée par des virgules
                                if ($k !== \'spip_recursions\') {
                                        $mes_pays .= (($mes_pays==\'\')?\'\':\',\').$v;
                                        echo \"<li>$v</li>\";
                                }
                        }
                        echo(\"La liste = (\" .  $mes_pays . \").\"; ?>
                </ul>

Qui donnerait une liste comme ceci :

  • Belgique
  • Canada
  • France
  • Suisse

La liste = (1, 2, 7, 12)

3. transmettre les données à une boucle SPIP

On en est au stade où il faut afficher la liste des articles ayant les mots clé correspondant aux pays sélectionnés se trouvant dans la variable $_mes_pays... Le mieux serait de faire une boucle ARTICLES avec comme critère les mots-clé correspondant à la sélection :

<ul>
<BOUCLE_pays(ARTICLES){id_mot IN (1, 2, 7, 12)}>
<li><h2>#TITRE</h2>#TEXTE</li>
</BOUCLE_pays>
</ul>

On a donc Maintenant , j\’ai bien une variable php qui s\’appelle $mes_pays... Comment la passer à la boucle SPIP ?

J\’ai découvert (gràce à Rastapopoulos) un bout de code (créé par Piif) qui permet d\’ajouter une boucle de type \“TABLEAU\” dans un \“vieux\” SPIP. Tous les détails sont là : http://www.spip-contrib.net/Boucler-sur-un-tableau-un-compteur

Le code du squelette donne à peu près ceci :

<B_pays_tableau>
                <h2>Liste des pays cochés</h2>
                <ul>
                <BOUCLE_pays_tableau(TABLEAU){var=pays}{valeur>1}>
                        <li>Clé : #CLE | Valeur : #VALEUR | Nom : <BOUCLE_nom_pays(MOTS){id_mot=#VALEUR}>[(#TITRE|supprimer_numero)]</BOUCLE_nom_pays></li>
                </BOUCLE_pays_tableau>
                </ul>
                </B_pays_tableau>

Il reste juste une valeur clé = spip_recursions valeur = 1 dont je ne parviens pas à me débarasser...

Sinon, le principe est là !
Merci canal IRC !

Problèmes (résolus...) Problèmes :
-   je n\’ai pas su passer une variable #ENV dans l\’url si elle contient des virgules, car les virgules sont codées
-  je n\’ai pas pu créer une variable #ENV qui contienne une liste

Avez-vous des idées pour les 2 derniers points ?

PS. un plugin permettant de faire des boucles sans tables, puis d\’utiliser les balises SPIP #ARRAY existe, à tester (mais pour des versions de SPIP > 1.9)

’’