[SPIP 1.9.1] Voici une technique que j’ai développée pour notre site Flip-Zone ; dans les pages rubriques, je ne souhaitais pas afficher systématiquement, en grand, le dernier article publié, mais un article pris au hasard parmi les cinq derniers articles publiés.
Pour cela, j’utilise les balises #SET et #GET introduites dans SPIP 1.9.1.
La balise
#SET{variable,valeur}et son pendant#GET{variable}ont été introduites par SPIP 1.9.1. La balise#SET{xxx,yyy}affecte une valeuryyyà une variablexxxpropre au squelette calculé. Cette valeur peut être récupérée par la balise#GET{xxx}. Les variables créées ainsi ne sont pas transmises au squelette inclus.
Dans mon code, on trouvera :
Cette balise permet de stocker la valeur de la #DATE dans une variable nommée date_min. Dans la boucle suivante, j’utilise le code :
qui permet de récupérer la valeur de date_min.
Voici le code qui permet de récupérer un article pris au hasard parmi les cinq derniers publiés, dans une branche spécifique :
La première boucle (BOUCLE_5e) permet de récupérer le cinquième article publié dans cette branche (ce code s’appliquant dans n’importe quelle rubrique du site, j’utilise le critère branche, qui prend tous les articles d’une rubrique et de ses sous-rubriques).
Je stocke la date de publication de cet article avec la balise #SET.
C’est dans la seconde boucle que se situe l’astuce : je sélectionne un article, pris au hasard, dans cette « branche », dont la date de publication est supérieure ou égale à la date de publication récupérée dans la boucle précédente.
C’est typiquement le genre de boucle que j’aime dans SPIP : pas de bidouille compliquée, pas de grosse manipulation en PHP, code simple et lisible... et un peu de jus de cerveau pour trouver une jolie solution à un cas pratique.
Que se passe-t-ils s’il n’y a pas cinq articles dans la branche ? Cela fonctionne tout de même : la première boucle ne contient aucun résultat (puisqu’il n’y a pas de « cinquième article »), et donc on ne stocke pas de valeur date_min. Dans la seconde boucle, le critère {date>=#GET{date_min}} revient donc à demander un article dont la date de publication est... supérieure à zéro (ce qui est le cas, justement, de tout article publié).