Classer selon la date ou selon un ordre imposé

Nous souhaitons trier les articles de façon différenciée, de cette façon :

-  dans certaines rubriques, les articles sont publiés les uns à la suite des autres ; on veut donc les présenter selon l’ordre chronologique : les plus récents en début de liste, les plus anciens en fin de liste ;
-  dans d’autres rubriques, on souhaite afficher les articles dans un ordre précis, en les numérotant ; sur le site public, on veut donc les présenter selon cet ordre indiqué par la numérotation ;
-  enfin, dans les autres rubriques, les articles doivent être classés dans l’ordre chronologique, sauf certains que l’on souhaite placer en tête de liste dans un ordre précis.

Il y a plusieurs méthodes pour réaliser ce classement. Notez bien que les deux méthodes présentées ci-après sont valables tant pour ordonner les articles que les autres objets de SPIP (rubriques, brèves, etc.).

Méthode simple

Rappel : Pour classer les articles selon un ordre imposé, on numérote leurs titres dans l’espace privé, avec un numéro suivi d’un point et d’un espace : « 1. Premier article », « 2. Deuxième article », etc.
Dans les squelettes, pour ne pas afficher ces numéros sur le site public, on passe le filtre |supprimer_numero sur la balise #TITRE, et on utilise le critère {par num titre} sur la boucle ARTICLES pour ordonner selon les numéros indiqués.

Pour classer selon un ordre imposé ET/OU selon la date, on écrira donc ceci (à l’intérieur d’une boucle RUBRIQUES) :

<BOUCLE_articles(ARTICLES){id_rubrique}{par num titre}{!par date}>
	[(#TITRE|supprimer_numero)]
</BOUCLE_articles>

Ainsi les articles de la rubrique seront tout d’abord classés par numéros, puis ceux portant un numéro identique seront classés par date inverse.

Remarque importante : Cela est tout à fait satisfaisant tant que, dans une rubrique donnée, tous les articles sont numérotés ou qu’aucun ne l’est. Par contre, si une rubrique contient des articles non numérotés, sauf un par exemple, celui-ci s’affichera en dernier. En effet, non numérotés, les articles sont considérés comme ayant zéro pour numéro. Pour éviter ce classement, on emploie alors la méthode suivante.

Méthode fine

À l’intérieur d’une boucle RUBRIQUES, nous allons effectuer le test suivant : est-ce qu’il existe, dans cette rubrique, au moins un article dont le titre commence par un numéro suivi d’un point ?

<BOUCLE_test_numero(ARTICLES){id_rubrique}{titre==^[0-9]+\.}{0,1}>
	Il existe un article numéroté dans cette rubrique
</BOUCLE_test_numero>
	Il n'y a pas d'article numéroté
<//B_test_numero>

Le critère intéressant ici est : {titre==^[0-9]+\.}

Il s’agit d’une sélection sur le titre, selon une expression régulière (« == » indique une sélection selon une expression régulière) dont la syntaxe est : au début du titre (« ^ » indique le début de la chaîne testée), il y a un ou plusieurs (« + » indique « au moins un des caractères précédents ») caractères compris entre 0 et 9 (« [0-9] » signifie « caractères compris entre 0 et 9 inclus »), suivis du caractère « point » (« \. »).

Notez enfin qu’on ne sélectionne qu’un seul article ainsi numéroté ({0,1}) ; de cette façon, l’intérieur de la boucle ne sera effectué qu’une seule fois. De plus, il suffit qu’il existe un seul article numéroté pour provoquer l’affichage d’une liste par ordre « numéroté ».

Cette boucle affiche ainsi « Il existe un article numéroté dans cette rubrique » s’il y a au moins un article dont le titre est précédé d’un numéro dans la rubrique, et « Il n’y a pas d’article numéroté » sinon.

Il suffit maintenant d’installer à la place de ces mentions des boucles d’affichage des articles selon l’ordre de présentation désiré :

<ul>
<BOUCLE_test_numero(ARTICLES){id_rubrique}{titre==^[0-9]+\.}{0,1}>
	<BOUCLE_ordre_numeros(ARTICLES){id_rubrique}{par num titre}>
		<li>[(#TITRE|supprimer_numero)]</li>
	</BOUCLE_ordre_numeros>
</BOUCLE_test_numero>
	<BOUCLE_ordre_date(ARTICLES){id_rubrique}{par date}{inverse}>
		<li>#TITRE<li>
	</BOUCLE_ordre_date>
<//B_test_numero>
</ul>

Ainsi les articles non numérotés de la rubrique sont affichés en premier, classés du plus récent au plus ancien, suivis des articles numérotés classés par numéros.

Il est possible de faire plus simple :

<BOUCLE_Classement(ARTICLES){par num titre, titre}>
<li>[(#TITRE|supprimer_numero)]</li>
</BOUCLE_Classement>

Classera les articles par ordre de titre puis par numéro.

Auteur ARNO*, tetue Publié le : Mis à jour : 01/07/23

Traductions : عربي, català, English, Español, français, italiano, Nederlands