Sorteren op datum of is er een voorgeschreven volgorde?

We willen de weergave van artikelen binnen een rubriek verschillend sorteren:
-  in bepaalde rubrieken mogen de artikelen in chronologische volgorde worden weergegeven: de nieuwste eerst;
-  in andere rubrieken hebben we door middel van een prefix in de titel van het artikel een sorteervolgorde vastgelegd;
-  en in nog weer andere rubrieken moeten enkele artikelen bovenaan geplaatst worden, waarna de overige de artikelen in chronologische volgorde worden weergegeven: de nieuwste eerst.

Om deze sortering te realiseren bestaan verschillende methodes. De twee hieronder vermelde methodes kunnen op artikelen, maar ook op andere SPIP objecten (rubrieken, nieuwsberichten, enz.) worden toegepast.

Eenvoudige methode

Ter herinnering: Om de artikelen een vastgestelde volgorde te geven, kan hun titel worden voorzien van een getal (de lengte is onbepaald), gevolgd door een punt en een spatie: « 01. Eerste artikel », « 02. Tweede artikel », enz.
In de skeletten willen we voorkomen dat deze prefix wordt weergegeven. Vanaf SPIP 3.0 gebeurt dit automatisch, anders passen we het filter |supprimer_prefix toe op het baken #TITRE en gebruiken we de voorwaarde {par num titre} in lus ARTICLES om deze volgorde aan te houden.

Om te sorteren volgens deze voorgeschreven volgorde EN/OF de datum, schrijven we dus (binnen een lus RUBRIQUES):

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

Zo worden de artikelen volgens de prefix gesorteerd en bij een gelijke prefix op omgekeerde datumvolgorde.

Belangrijke opmerking: Als een bepaalde rubriek zowel artikelen met een titel met prefix als zonder prefix bevat, zullen deze als eerste worden weergegeven, want geen prefix komt overeen met een nummer nul. Wil je dit voorkomen, dan moet je de volgende methode toepassen.

Verfijnde methode

Binnen een lus RUBRIQUES gaan we nu de volgende test uitvoeren: bestaat er in deze rubriek tenminste één artikel waarvan de titel van een prefix (getal-punt-spatie) is voorzien?

<BOUCLE_test_prefix(ARTICLES) {id_rubrique} {titre==^[0-9]+\.} {0,1}>
	Er bestaat een artikel met een titel met zo'n prefix
</BOUCLE_test_prefix>
	Er is geen titel met zo'n prefix
<//B_test_prefix>

De interessante voorwaarde in dit voorbeeld is: {titre==^[0-9]+\.}

Het gaat om een selector op titre, gebruikmakend van een regular expression (regexp) (wat aangegeven wordt door «==»), waarvan de syntax zich alsvolgt laat uitleggen: staan aan het begin van titre^» geeft het begin van de tekenreeks aan) één of meer («+» betekent «ten minste één van de ervoor aangegeven tekens») tekens tussen 0 en 9 («[0-9]» betekent «tekens tussen 0 en 9, beide inbegrepen»),gevolgd door een «punt» («\.»).

We hoeven deze voorwaarde maar één keer te selecteren ({0,1}); we hoeven immers niet alle artikelen te controleren, want de voorwaarde was dat tenminste één artikel een prefix had.

De weergegeven tekst hebben we niet nodig, maar daarvoor in de plaats zetten we gewoon de lussen die respectievelijk op de prefix ({par num titre}>) en op omgekeerde datum ({par date}{inverse} of {!par date}) gesorteerd worden:

<ul>
<BOUCLE_test_prefix(ARTICLES) {id_rubrique} {titre==^[0-9]+\.} {0,1}>
	<BOUCLE_art_prefixs(ARTICLES) {id_rubrique} {par num titre}>
		<li>[(#TITRE|supprimer_prefix)]</li>
	</BOUCLE_art_prefixs>
</BOUCLE_test_prefix>
	<BOUCLE_art_datum(ARTICLES) {id_rubrique} {par date}{inverse}>
		<li>#TITRE<li>
	</BOUCLE_art_datum>
<//B_test_prefix>
</ul>

Maar er bestaat een nog eenvoudigere manier:

<ul>
<BOUCLE_art(ARTICLES){par num titre, !date}>
<li>[(#TITRE|supprimer_prefix)]</li>
</BOUCLE_art>
</ul>

Sorteert de artikelen per prefix en vervolgens op omgekeerde datum.

Auteur Hanjo Gepubliceerd op: Aangepast: 21/03/23

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