Voorwaarden die op alle lussen kunnen worden toegepast

Bepaalde criteria zijn van toepassing op (bijna) alle soorten lussen. Het zijn voorwaarden die bedoeld zijn om het weergegeven aantal resultaten te beperken of hun volgorde aan te geven. Meerdere van deze criteria kunnen zonder probleem worden gecombineerd.

De resultaten ordenen

{par sortering} geeft de volgorde van presentatie van de resultaten aan. Het criterium voor die sortering kan overeenkomen met één van de bakens uit de database die bij die lus behoren. Zo kun je bijvoorbeeld artikelen {par date} (per publicatiedatum), {par date_redac} (per redactiedatum) of {par titre} (per titel) sorteren. (Merk op dat terwijl de bakens in hoofdletters geschreven staan, de criteria in kleine letters worden aangegeven.)

Speciaal geval: {par hasard} genereert een lijst die in willekeurige volgorde is samengesteld.

De volgorde omkeren. Aanvullend zorgt {inverse} voor een omgekeerde volgorde. Zo zal {par date} beginnen met de oudste artikelen, terwijl {par date}{inverse} de jongste artikelen als eerste laat zien.

Voorwaarde inverse accepteert elk willekeurige baken (uit die lus) om een dynamische sortering mogelijk te maken. Zo kun je schrijven: <BOUCLE_art(ARTICLES){par #ENV{sorteerop}}{inverse #ENV{omgekeerd}}>, waarmee je dus in de URL de parameters voor het sorteren kunt meegeven (&sorteerop=date &omgekeerd=1 of &omgekeerd=0).

Op nummer sorteren. Wanneer we willen sorteren op een tekstelement (bijvoorbeeld titre, de titel), zal de sortering dus alfabetisch gebeuren. Het is toch mogelijk zelf een sorteervolgorde te bepalen door een getal aan het begin van de titel te plaatsen, bijvoorbeeld: «1. Eerste artikel», «2. Tweede artikel», «3. Derde artikel, ...», enz. Met een alfabetische sortering zou dat een volgorde geven van «1, 10, 11, 2, 3...». Om toch een op basis van het nummer gesorteerde volgorde te verkrijgen, kun je gebruik maken van deze voorwaarde:

{par num argument}

Bijvoorbeeld:

<BOUCLE_art(ARTICLES){id_rubrique}{par date}{inverse}>

geeft de artikelen van een rubriek in omgekeerd chronologische volgorde weer (de nieuwste eerst, de oudste aan het eind), en:

<BOUCLE_art(ARTICLES){id_rubrique}{par titre}>

toont ze in alfabetische volgorde van hun titel; en tenslotte:

<BOUCLE_art(ARTICLES){id_rubrique}{par num titre}>

toont zo op basis van het getal waarmee hun title begint (let op: de optie {par num titre} werkt niet bij de oudste versies van MySQL, die van voor versie 3.23).

<BOUCLE_art(ARTICLES){id_rubrique}{par multi titre}>

In een website met meertalige gegevens laat de voorwaarde {par multi critère} toe te sorteren in de alfabetische volgorde van iedere taal. Zonder de toevoeging "multi" zal de lus dezelfde volgorde gebruiken voor iedere taal.

Meerdere sorteercriteria Vanaf SPIP 1.8 kun je meerdere sorteercriteria opgeven: {par voorwaarde1, voorwaarde2}. Je geeft zo achtereenvolgende sorteeropdrachten aan. Het resultaat van de lus wordt eerst gesorteerd volgens voorwaarde1, daarna volgens voorwaarde2 (voor resultaten die eenzelde critère1 hebben. Je kunt zoveel voorwaarden toepassen als nodig is.

In het voorbeeld {par date, titre} wordt eerst op datum (date) en daarna wordt alles met dezelfde datum nog eens op title (titre) gesorteerd.

Om hetzelfde resultaat te bereiken kun je ook meerdere sorteercriteria aangeven: {par ...}. Bijvoorbeeld: {par date} {par titre} is hetzelfde als wat we in een eerder voorbeeld zagen.

Let op: Wanneer je meerdere criteria voor de sortering gebruikt, zal de voorwaarde {inverse} uitsluitend op het er direct vóór geplaatste sorteercriterium betrekking hebben.

Dit is één van de redenen waarom de notatie {!par ...} werd ingevoerd die het omgekeerd sorteren aanduidt. Bijvoorbeeld: {!par date} {par num titre} sorteert van jong naar oud en de titels met dezelfde datum worden in numerieke volgorde gesorteerd.

In SPIP 3.0 werd een nieuwe dynamische sorteermogelijkheid geïntroduceerd met de voorwaarde tri en het baken #TRI. Je leest er alles over in het artikel tri en #TRI in lussen.

Vergelijkingen, gelijkwaardigheden

{voorwaarde < waarde} Een vergelijking met een vaste waarde, waarbij je gebruik mag maken van >, <, =, >= en <=.

De waarde aan de rechterzijde kan zijn:

-  Een vastgelegde ("hardcoded") waarde in het skelet. Bijvoorbeeld:

<BOUCLE_art(ARTICLES){id_article=5}>

toont het artikel met nummer 5 (bijvoorbeeld om de leveringsvoorwaarden weer te geven).

<BOUCLE_art(ARTICLES){id_rubrique=2}>

toont de artikelen in rubriek 2.

-  Er mag ook een baken worden gebruikt dat beschikbaar is in de context van de lus. Bijvoorbeeld:

<BOUCLE_art(ARTICLES){id_article=5}>
<BOUCLE_titel(ARTICLES) {titre=#TITRE}>
...
</BOUCLE_titel>
</BOUCLE_art>

is een opdracht om de artikelen te vinden met dezelfde titel als die van artikel 5.

Ler op: Je mag slechts een kaal baken gebruiken. Er mag geen filter of optionele code aan worden toegevoegd.

Wanneer je gebruik wilt maken van het baken #ENV — of enig ander baken dat parameters heeft —, moet je gebruik maken van de notatie: {titre = #ENV{titre}} en niet: {titre = [(#ENV{titre})]}.

Een regexp:

Zeer krachtig (maar wat moeilijker te handelen) is het vergelijkingsteken == dat een vergelijking volgens een regexp, een regular expression mogelijk maakt. Bijvoorbeeld:

<BOUCLE_art(ARTICLES){titre==^[aA]}>

selecteert de artikelen waarvan de titel begint met een «a» of een «A».

Ontkenning:

Je mag de notatie {xxx != yyy} en {xxx !== yyy} gebruiken, waarbij ! overeen komt met de logische operator NOT.

<BOUCLE_art(ARTICLES){id_rubrique != 2}>

selecteert de artikelen die NIET tot rubriek 2 behoren.

<BOUCLE_art(ARTICLES){titre!==^[aA]}>

sslecteert artikelen die NIET met een «a» of «A» beginnen.

Weergave in functie van de datum

Om het vergelijken van data mogelijk te maken, zijn deze criteria toegevoegd:
-  age en age_redac die respectievelijk corresponderen met de leeftijd in dagen van de publicatie en van de eerste redactie van een artikel: {age<30} selecteert elementen die de afgelopen 30 dagen werden gepubliceerd;
-  mois, mois_redac, annee en annee_redac laten een vergelijking toe met vaste waardes: ({annee<2000} voor elementen gepubliceerd in de vorige eeuw).

Je mag meerdere van deze criteria combineren voor een preciese selectie. Bijvoorbeeld:

<BOUCLE_art(ARTICLES){id_secteur=2}{id_rubrique!=3}{age<30}>

toont de artikelen uit hoofdrubriek 2 (en zijn subrubrieken), behalve uit rubriek 3 die minder dan 30 dagen geleden werden gepubliceerd.

Tip. Het criterium age is heel handig voor de selectie van artikelen en nieuwsberichten die een publicatiedatum "in de toekomst" hebben (op sites waar de optie «Publiceren van gepostdateerde items» van toepassing is). Je gebruikt dan negatieve waardes ({age<0}).

Leeftijd ten opzichte van een vaste datum. Het criterium age wordt berekend ten opzichte van de huidige datum (dus {age<30} correspondeert met artikelen die minder dan 30 dagen geleden werden gepubliceerd). Het criterium age_relatif vergelijkt de datum van een artikel of van een nieuwsbericht met een "courante" datum; bijvoorbeeld in een lus ARTICLES weet je al een datum voor ieder resultaat in de lus en kan je dus selecteren ten opzichte van deze datum (en niet ten opzichte van vandaag).

Bijvoorbeeld:

<BOUCLE_hoofdartikel(ARTICLES){id_article}>

	<h1>#TITRE</h1>
         .......
	<BOUCLE_volgend(ARTICLES){id_rubrique}{age_relatif<=0}{exclus}{par date}{0,1}>
  	        Volgend artikel: <a href="#URL_ARTICLE" title="Het volgende artikel">#TITRE</a>
	</BOUCLE_volgend>

</BOUCLE_hoofdartikel>

De lus BOUCLE_volgend geeft één enkel artikel in dezelfde rubriek weer, gesorteerd op datum, waarvan de publicatiedatum groter is dan of gelijk is aan de datum van het "hoofdartikel"; dus het artikel dat erna in deze rubriek werd gepubliceerd.

Veel meer informatie over het gebruik van de datum lees je in «Datumbeheer».

Weergave van een deel van de resultaten


-  {branche} beperkt het aantal resultaten — voor lussen met een #ID_RUBRIQUE — die aan de huidige toebehoort (dus de huidige rubriek en zijn subrubrieken). Bijvoorbeeld:
<BOUCLE_articles(ARTICLES) {branche}> retourneert alle artikelen van de rubriek zelf en van zijn subrubrieken,
<BOUCLE_articles(ARTICLES) {!branche}> retourneert alle artikelen die NIET in de rubriek zelf of in zijn subrubrieken staan,

Je mag gebruik maken van de voorwaarde {branche?} om aan te geven dat de voorwaarde uitsluitend moet worden toegepast wanneer er daadwerkelijk een id_rubrique in de context is opgenomen (door een bovenliggende lus of geleverd via de URL). Bijvoorbeeld:
<BOUCLE_articles(ARTICLES) {branche?}> retourneert alle artikelen uit de huidige rubriek en zijn subrubrieken, maar als er geen id_rubrique in de context staat, toont hij alle artikelen van de site.


-  {doublons} of {unique} (deze twee criteria zijn volledig aan elkaar gelijk) geven aan dat een al eerder weergegeven resultaat uit een lus met dit criterium niet nogmaals mag worden weergegeven.


-  {doublons xxxx} biedt de mogelijkheid meerdere onafhankelijke sets van de voorwaarde {doublons} te hebben. De lussen met {doublons een} trekken zich niets aan van de lussen met {doublons twee}.


-  {exclus} laat toe een element waarin men zich al bevindt (artikel, nieuwsbericht, rubriek, enz.) uit te sluiten. Zo wil je bijvoorbeeld bij een rubriek alleen de overige rubrieken laten zien en niet de rubriek waarin de bezoeker zich bevindt.


-  {xxxx IN a,b,c,d} beperkt de weergave van resultaten tot die welke voldoen aan de voorwaarde xxxx gelijk aan a, b, c of d. De resultaten worden in de aangegeven volgorde weergegeven (tenzij een andere sorteervolgorde wordt vermeld). Het is ook mogelijk letterreeksen te selecteren, zoals met {titre IN 'China', 'Japan'}.

Je kunt ook bakens achter het argument IN plaatsen, en met name het baken #ENV waarop analysefilters worden toegepast voor een juiste schrijfwijze van de SQL opdracht. SPIP zal testen of het argument van ENV een tabel aanwijst (bijvoorbeeld wanneer het afkomstig is uit een formulierveld met attribuut name eindigend op []). Is dit het geval en zijn de analysefilters gedesactiveerd dat volstaat het toevoegen van een dubbele ster om te zorgen dat elk element van deze tabel wordt beschouwd als argument van IN waarbij SPIP veiligheidsfilters op elk van hen zal toepassen.

Het standaard skelet formulaire_forum_previsu toont een praktisch voorbeeld bij een lus MOTS met de voorwaarde {id_mot IN #ENV**{ajouter_mot}}: deze lus selecteert uitsluitend de dynamisch toegewezen trefwoorden. Die zijn opgebouwd in het formulier van het standaard skelet choix_mots, dat het attribuut name=ajouter_mot[] gebruikt.


-  {a, b} waarbija en b getallen zijn. Met deze voorwaarde kan het aantal resultaten worden beperkt. a geeft aan vanaf welk resultaat met de weergave moet worden begonnen (waarbij het eerste resultaat nummer 0 is); b geeft het aantal weer te geven resultaten.

Bijvoorbeeld: {0, 10} toont de eerste tien resultaten; {4, 2} toont twee resultaten vanaf het vijfde resultaat.

-  {debut_xxx,b} is een uitgewerkte variant van het voorafgaande. Het laat toe de beperking van resultaten af te laten hangen van een in de URL doorgegeven variabele (deze variabele vervangt dus de a die we hierboven zagen). Het ie een ietwat complexe functie die gelukkig niet al te vaak hoeft te worden gebruikt.

De met debut_xxx in de URL doorgegeven variabele (waar xxx een woord is) wordt door de webmaster bepaald. Dus bij een pagina met URL:

spip.php?page=petition&id_article=13&debut_signatures=200

bevat een skelet (petition.html) bijvoorbeeld:

<BOUCLE_signatures(SIGNATURES){id_article}{debut_signatures,100}>

en geeft hij het deze URL dus 100 ondertekeningen door beginnend bij de 201e [1].


-  {a, n-b} is een variant van {a, b} dat de weergave beperkt in functie van het aantal resultaten in de lus. a is het resultaat vanaf waar moet worden weergegeven; b geeft het aantal resultaten dat niet moet worden weergegeven aan het einde van de lus.

{0, n-10} toont alle resultaten behalve de laatste 10.

{5, n} toont alle resultaten vanaf het 6e resultaat.

Let op:
waar «a» en «b» door getallen worden vervangen, is «n» daadwerkelijk de letter die moet worden gebruikt.


-  {n-a, b} is een afgeleide van {a, n-b}. Je begrenst de weergave tot b resultaten, te beginnen met het ae resultaat voor het einde van de lus.

Bijvoorbeeld: {n-20,10} toont 10 resultaten vanaf het 20e resultaat vóór het einde van de lus.

Let op:
de voorwaarden {a, n}, {a, n-b} en {n-a, b} werken niet als ze worden gebruikt samen met de voorwaarde {pagination} en kan in onjuiste weergave resulteren!

-  {a/b} waar a en b getallen zijn. Deze voorwaarde maakt de weergave van een deel a (proportioneel) van de resultaten in functie van het aantal «delen» b mogelijk.

Bijvoorbeeld: {1/3} toont het eerste derde deel van de resultaten. Deze voorwaarde is vooral nuttig bij de weergave van resultaten in meerdere kolommen: in de eerste kolom met de voorwaarde {1/3}s, in de tweede met {2/3} en in de laatste met {3/3}.

Let op: Het gebruik van de voorwaarde {doublons} samen met deze voorwaarde is gevaarlijk. Bijvoorbeeld:

<BOUCLE_een(ARTICLES){id_rubrique}{1/2}{doublons}>
	<li> #TITRE
</BOUCLE_een>
<BOUCLE_twee(ARTICLES){id_rubrique}{2/2}{doublons}>
	<li> #TITRE
</BOUCLE_twee>

zal niet alle artikelen uit de rubriek weergeven! Stel voor dat er in totaal 20 artikelen zijn in de lus. BOUCLE_een geeft de eerste helft van de artikelen weer, dus de 10 eerste en verbiedt (vanwege {doublons}) ze nogmaals te gebruiken. BOUCLE_twee moet het tweede deel van de artikelen van de rubriek weergeven, maar de eerste 10 zijn uitgesloten door BOUCLE_een. Er worden dus 10 artikelen geselecteerd waarvan de tweede helft moet worden weergegeven, dus de laatste 5. De artikelen 11 tot 15 gaan dus "verloren"...

Weergave tussen resultaten

{"inter"} biedt de mogelijkheid om HTML-code (hier inter) in te voegen tussen de resultaten van de lus. Om bijvoorbeeld een lijst van auteurs met een komma te scheiden, geef je aan:

<BOUCLE_auteurs(AUTEURS){id_article}{", "}>

Diverse

{logo} beperkt de selectie tot artikelen (of rubrieken, enz.) die een logo hebben. Het werkt ook in de lus (HIERARCHIE). De omgekeerde voorwaarde {!logo} toont de objecten die geen logo hebben.

Voetnoot

[1het eerste resultaat is nummer 0, dus 200 geeft aan dat het om het resultaat 201 gaat

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

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