De indeling in meerdere pagina’s

Omdat sommige lussen tientallen resultaten kunnen geven (zoals alle artikelen in een rubriek, of alle onderschrijvingen van een petitie), is het niet altijd gewenst om alle resultaten op één pagina weer te geven.

De voorkeur kan in zo’n geval zijn om het resultaat over meerdere pagina’s te verdelen met een systeem dat navigatie tussen die pagina’s mogelijk maakt. Hoewel dit in SPIP binnen gewone lussen is uit te voeren, is het systeem toch redelijk complex.

SPIP heeft een vereenvoudigd pagineringssysteem voor de resultaten van een lus.

Voorbeeld

In zijn eenvoudigste vorm is het systeem uitgevoerd met slechts één criterium en één baken:

  • het criterium {pagination} wordt aan de pagineren lus toegevoegd;
  • het baken #PAGINATION wordt in het optionele deel boven de lus gezet.
<B_art>
    #PAGINATION
    <ul>
<BOUCLE_art(ARTICLES) {par date} {pagination}>
    <li>#TITRE</li>
</BOUCLE_art>
    </ul>
</B_art>

Wanneer de site 90 gepubliceerde artikelen bevat, zal deze lus de 10 oudste artikelen weergeven en aangeven dat er nog meer bladzijdes met gegevens beschikbaar zijn. Dat gebeurt standaard met de volgende indicatie:

0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | ...

Het nummer van waaraf de resultaten worden weergegeven staat als een parameter in de URL van de webpagina: {debut_art=x}. Het bestaat uit dezelfde naam (hier « art ») als de lus waarop hij betrekking heeft. (Je kunt deze informatie ook zelf op de volgende manier als voorwaarde opnemen in een andere lus {debut_art,10}.)

Let op: het aantal weer te geven links is beperkt. Gedachtenpuntjes (puntje puntje puntje) zullen indien nodig aan de onderbroken lijst worden toegevoegd.

Anker

Het baken #PAGINATION plaatst een HTML-anker die de browser het gedeelte van de bladzijde aanwijst waarin de paginering plaats vindt en bepaalt ook de plaats van de pagina-navigatie. Wil je deze echter onderaan de lijst plaatsen, dan moet je gebruik maken van een anker in het optionele gedeelte onder de lus.

Hiervoor zorgt het baken #ANCRE_PAGINATION, dat de taak van het plaatsen van het HTML-anker overneemt en er mede voor zorgt dat het baken #PAGINATION dat niet doet!

<B_art>
#ANCRE_PAGINATION
  <ul>
<BOUCLE_art(ARTICLES) {par date} {pagination}>
   <li>#TITRE</li>
</BOUCLE_art>
   </ul>
#PAGINATION
</B_art>

Stel je geen prijs op zo’n anker, dan vermeld je [(#ANCRE_PAGINATION|vide)]. De browser zal dan wel de bovenzijde van de gehele pagina laten zien en de weergegeven pagina niet positioneren op het HTML-anker.

Directe toegang tot een bepaald element

Om een permanente URL naar een specifiek element uit de in pagina’s verdeelde lijst te maken gebruik je &debut_abc=@xxx waar «abc» de naam is van de lus mat de paginering en «xxx» de object id(entificatie) uit de tabel van die lus is.

Voorbeeld :
In een lus

<B_pagi>
[<p class="pagination">(#PAGINATION)</p>]
<ul>
<BOUCLE_pagi(ARTICLES) {par titre} {pagination}>
<li>#ID_ARTICLE : #TITRE</li>
</BOUCLE_pagi>
</ul>
</B_pagi>

zal &debut_pagi=10 de tweede pagina tonen (vanaf het tiende element uit de lijst);
&debut_pagi=@231 toont de pagina waarop het artikel met id_article «231» staat.

Het totaal aantal resultaten

In een lus met de voorwaarde {pagination} geeft #TOTAL_BOUCLE het op dat moment weergegeven aantal elementen, dat wil dus zeggen 10 voor een volle pagina en maximaal 10 op de laatste pagina met resultaten.

Om het aantal elementen te vermelden dat zou worden weergegeven als de voorwaarde {pagination} niet werd gebruikt, gebruik je het baken #GRAND_TOTAL.

<B_pagi>
#ANCRE_PAGINATION
<BOUCLE_pagi (ARTICLES) {pagination}>
#TITRE <br />
</BOUCLE_pagi>
Er zijn in totaal #GRAND_TOTAL artikelen, deze pagina toont er #TOTAL_BOUCLE
</B_pagi>

Je krijgt dan: « Er zijn in totaal 1578 artikelen, deze pagina toont er 10 »

De stappen van {pagination} wijzigen

Het standaard aantal van 10 elementen per pagina, kan worden aangepast met een aanvullende parameter in de voorwaarde.

Zo geeft

<BOUCLE_page (ARTICLES) {pagination 5}>
#TITRE <br />
</BOUCLE_page>

de titels van 5 artikelen vanaf debut_page.

Deze extra parameter mag zijn opgebouwd uit andere bakens, zoals #ENV{aantal}, wat tot uitgebreide mogelijkheden leidt.

Wat als de paginering moet gebeuren in een opgeroepen skelet?

Moet de verdeling in pagina’s functioneren in een skelet dat door het skelet van de pagina wordt opgeroepen (met de opdracht INCLURE), dan moet je als parameter van de opdracht INCLURE de formulering {self=#SELF} meegeven. Dit geeft het skelet de mogelijkheid de juiste waarde van de parameter debut_xxx te bepalen. Bovendien biedt het een extra veiligheid (het baken #PAGINATION wordt feitelijk berekend aan de hand van de volledige URL van de pagina).

Vanaf SPIP 1.9 kan de voorwaarde {self=#SELF} worden vervangen ten gunste van het duo {env} {ajax} [1].

De paginering benoemen

Wanneer in hetzelfde skelet meerdere keren een lus in pagina’s wordt opgedeeld, zoals in:

<BOUCLE_incluse(ARTICLES) {id_rubrique} {par titre}>
  <INCLURE{fond=motsgroupe5} {id_article} {ajax} {env}>
</BOUCLE_incluse>

waar de INCLURE dat in een lus ligt een paginering bevat (vandaar het gebruik van de voorwaarde {env}). Als je op de pagina-navigatie klikt, zullen alle pagina-indelingen ter zelfde tijd worden aangepast.
Om dit te vermijden, volstaat het om de voorwaarde pagination te benoemen in het door de INCLURE opgeroepen bestand op een zodanige wijze dat het telkens in een unieke naam resulteert:

<B_groupe5>
  #ANCRE_PAGINATION
<BOUCLE_groupe5(MOTS) {id_groupe=5} {pagination 15 #ID_ARTICLE}>
  #TITRE
</BOUCLE_groupe5>
  <p class="pagination">#PAGINATION</p>
</B_groupe5>

Mogelijk moet je ook de naam dit je aan de voorwaarde wilt geven vermelden bij het uitvoeren van de INCLURE. Je krijgt dan:

<INCLURE{fond=page_paginee, env, nom_p=_abc}>
<INCLURE{fond=page_paginee, env, nom_p=_def}>

n page_paginee.html vinden we:

<B_a>
  #ANCRE_PAGINATION
<BOUCLE_a(ARTICLES) {pagination 25 #ENV{nom_p}}>
  #TITRE<br />
</BOUCLE_a>
  #PAGINATION
</B_a>

De stijl van de navigatiebalk

De navigatie is opgebouwd uit een serie links en een paginanummer dat als huidige pagina een CSS class « .on » krijgt. Voor een aanpassing van de weergave moet je dus in de stylesheet a en .on naar jouw wensen aanpassen.

Het model van de navigatiebalk

Het baken #PAGINATION accepteert een parameter {model} die het resultaat van het baken aanpast.

Zo geeft #PAGINATION{precedent_suivant} links naar de vorige en volgende pagina. Deze links zullen er ongeveer zo uit zien

vorige pagina | volgende pagina

#PAGINATION{page} toont iets in de volgende vorm

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ...

#PAGINATION{page_precedent_suivant} geeft een navigatiebalk in deze trand

< 1 | 2 | 3 | 4 | 5 | 6 | >

#PAGINATION{prive} resulteert in

0 | 10 | 20 | 30 | Alles tonen

Je kunt ook je eigen modellen maken, die een naam moeten hebben in het formaat pagination_model. Je kunt je laten inspireren door de in SPIP meegeleverde modellen die zich bevinden in de map prive/modeles/. Waar je jouw aangepaste model moet plaatsen en andere aanvullende informatie, lees je in de modellen.

Voetnoot

[1Let wel: om te zorgen dat de voorwaarde {ajax} wordt herkend door het baken #PAGINATION, moet deze laatste de CSS class pagination bevatten.

Let op: veel eenvoudiger, maar niet compatibel is die in SPIP-Contrib’. Wil je deze gebruiken, dan zul je ook de bijbehorende skeletten moeten gebruiken.

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

Vertalingen: català, English, Español, français, italiano, Nederlands