Carnet Wiki

’Carnet champs de formulaire’

Version 4 — Avril 2008 — biniasz

L’exemple ’L\’exemple ci-dessous consiste à pouvoir sélectionner des valeurs provenant d’une d\’une liste de mots-clé SPIP, puis à passer ces valeurs à une boucle permettant d’afficher 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 d\’une table SPIP
-  récupérer la liste des valeurs cochées 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 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 "  name=\"choix_pays \"  action=""  method="post ">
 =\"\"  method=\"post \">
 <BOUCLE_choix_pays(MOTS){id_groupe = 2}{par titre}>
&lt;input type="checkbox "  name="pays type=\"checkbox \"  name=\"pays []"  \"  />&lt;label for="pays for=\"pays []">(&#91;#TITRE|supprimer_numero \">(&#91;#TITRE|supprimer_numero )]</label></br />
</BOUCLE_choix_pays>
&lt;input type="submit "  name="OK "  value="OK "  type=\"submit \"  name=\"OK \"  value=\"OK \"  />
</form>

Qui donnerait un formulaire de ce type :
<form name=« choix_pays  » name=\« choix_pays  » action » method=« post  » style=« border:1px = »\«  method= »post   style= »border:1px solid gray ; background :#efefef">
\">
<input type=« checkbox  » name=« pays type= »checkbox   name= »pays []«   » /><label for=« pays for= »pays []">Belgique<br \">Belgique<br />
<input type=« checkbox  » name=« pays type= »checkbox   name= »pays []«   » /><label for=« pays for= »pays []">Canada<br \">Canada<br />
<input type=« checkbox  » name=« pays type= »checkbox   name= »pays []«   » /><label for=« pays for= »pays []">France<br \">France<br />
<input type=« checkbox  » name=« pays type= »checkbox   name= »pays []«   » /><label for=« pays for= »pays []">Suisse<br \">Suisse<br />
<input type=« submit  » name=« OK  » value=« OK  » type=\« submit  » name=\« OK  » value=\« OK  » />

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 qu\’est-ce qu\’on en fait ? On les met dans une variable de type texte et on la passe par l’url l\’url en get, pour en disposer dans une variable #ENV ?

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

		<ul>&lt;?php 
			$mes_pays = "";  \"\"; 
			$tab = $_GET&#91;'pays '] GET&#91;\'pays \'] ;
			foreach ($tab as $k => $v) {
				// je construis la liste séparée par des virgules
				if ($k !== 'spip_recursions ')  \'spip_recursions \')  {
					$mes_pays .= (($mes_pays=='')? ==\'\')? '':','). \'\':\',\'). $v;
					echo "&lt;  \"&lt; li>$v&lt;/li>";
				 >\";
				 }
			}
			echo("La  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 bien une variable php qui s’appelle s\’appelle $mes_pays... Comment la passer à la boucle SPIP ?

J’ai J\’ai découvert (gràce à Rastapopoulos) un bout de code (créé par Piif) qui permet d’ajouter 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ébarrasser débarasser ...

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

Quelques problèmes qu’il reste à résoudre :


-  ligne « spip_recursions » à ne pas afficher ; comme cette valeur arrive toujours en premier, j’ai essayé de mettre un critère 0,1 sur la boucle mais cela semble sans influence...)  :
- je n’ai n\’ai pas su passer une variable #ENV dans l’url l\’url si elle contient des virgules, car les virgules sont codées ( méthode de passer par # ENV abandonnée , résolu grâce au plugin )
- je n’ai n\’ai pas pu créer une variable #ENV qui contienne une liste ( idem , résolu grâce au plugin )
- il faudrait que le tableau soit une variable globale ... Comment faire  ? Problèmes ( résolus ... Dans mes_fonctions j’ai ajouté la ligne

$_GLOBALS['pays']; 

mais cela ne semble pas suffire...
- il faudrait pouvoir passer ce #TABLEAU à une autre boucle. J’ai fait :

<BOUCLE_nom_pays(MOTS){id_mot==#VALEUR}>[(#TITRE|supprimer_numero)]</BOUCLE_nom_pays>

mais la boucle reste désespérément vide...

Si vous avez des idées, elles sont les bienvenues !

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)

’’