Version 6 — Décembre 2021 — b_b
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 cochées
- faire passer la liste des valeurs cochées à une boucle SPIP
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 :
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 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 :
La liste = (1, 2, 7, 12)
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 $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ébarrasser...
Sinon, le principe est là !
Merci canal IRC !
- 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 pas su passer une variable #ENV dans 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 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 ? 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 !