El sistema de paginació

Quan un bucle reenvia diverses desenes d’articles (o, per una petició, diversos milers de signatures), no és desitjable, fins i tot impossible, mostrar-ho tot en una única pàgina.

Preferirem llavors repartir els resultats en diverses pàgines, amb un sistema de navegació pàgina a pàgina. Si bé és possible fer-ho amb bucles SPIP normals, és no obstant relativament complicat.

També SPIP 1.9 introdueix un sistema simplificat de paginació dels resultats d’un bucle.

Exemple

De forma simple, aquest sistema es compon d’un criteri i d’una etiqueta:

  • el criteri {pagination} s’afegeix en el bucle per paginar;
  • l’etiqueta #PAGINATION, situada enuna de les parts opcionals («abans» o « després») del bucle, mostra la «paginació»..
<B_page>
    #PAGINATION
    <ul>
<BOUCLE_page(ARTICLES) {par date} {pagination}>
    <li>#TITRE</li>
</BOUCLE_page>
    </ul>
</B_page>

Si el lloc té 90 articles publicats, aquest bucle mostrarà la llista dels deu articles més antics, amb enllaços que condueixen cap a la pàgina que mostra els deu següents, els altres deu, etc. Aquests enllaços estan enumerats tal i com segueix:

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

El número a partir del que els resultats es mostren es passa a l’url per mitjà d’un paràmetre {debut_page=x} portant el mateix nom (aquí, «page») que el bucle al que fa referència. (Aquest paràmetre és utilitzable en un altre bucle per mitjà del criteri clàssic {debut_page,10}.)

A tenir en compte: el número total d’enllaços mostrats és limitat; uns punts supensius permeten, si s’escau, anar directament al final de la llista, ou de retornar al començament.

Àncores de paginació

L’etiqueta #PAGINATION comporta una àncora html que permet al navegador mostrar directament la part de la pàgina que està paginada; no obstant, si volem posar els enllaços de paginació a sota de la llista d’articles, és necessari poder situar l’àncora a sobre de la llista.

És per això que serveix l’etiqueta #ANCRE_PAGINATION, que retorna l’àncora en qüestió, i impedeix a la següent etiqueta #PAGINATION mostrar la seva àncora.

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

El número total de resultats

A dins d’un bucle amb el criteri {pagination}, #TOTAL_BOUCLE mostra el número d’elements retornats efectivament, és a dir 10 a les pàgines plenes, i 10 o menys a la darrere pàgina de resultats.

Per mostrar el número d’elements que haurien de ser retornats si el criteri {pagination} no estigués allà, utilitzeu l’etiqueta #GRAND_TOTAL.

<B_pagination>
#ANCRE_PAGINATION
<BOUCLE_pagination (ARTICLES) {pagination}>
#TITRE <br />
</BOUCLE_pagination>
Il y a au total #GRAND_TOTAL articles, cette page en affiche #TOTAL_BOUCLE
</B_pagination>

indicarà: «Hi ha un total de 1578 articles, aquesta pàgina en mostra 10.»

Canviar el pas de la {pagination}

El número estàndard de 10 elements per pàgina es pot modificar mitjançant un paràmetre suplementari a dins del criteri.

D’aquesta manera

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

retornarà els títols de cinc articles a partir de debut_page.

El paràmetre en qüestió pot estar compost ell mateix tal i com ho desitgem a partir d’altres etiquetes, sobretot #ENV{xx}, el que permet fer una presentació a la carta molt complerta.

La paginació a dins dels esquelets inclosos

Si la vostra paginació ha de funcionar en un esquelet inclós, heu de passar en paràmetre de l’ordre INCLURE la formulació {self=#SELF} ; això permet a l’esquelet inclós calcular-se amb el valor correcte del paràmetre debut_xxx, i es justifica el que a més és per una necessitat de seguretat (l’etiqueta #PAGINATION és en efecte calculada a partir del URL complet de la pàgina).

A partir d’SPIP 1.9 el criteri {self=#SELF} serà avantatjosament substituït per la parella {env} {ajax}. [1].

Nnomenar el criteri de paginació

Quan s’utilitza esquelets inclus diverses vegades a dins la mateixa pàgina com:

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

i aquest INCLURE posseeix una paginació (d’aquí l’ús del criteri {env}), quan fareu clic damunt d’una paginació, veureu que es modifiquen totes les paginacions al mateix temps.
Per evitar això, n’hi ha prou en nomenar el criteri pagination a l’interior del fitxer inclu per un nom que serà diferent a cada inclusió:

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

També podem voler especificar des de la crida l’INCLURE el nom que volem donar al criteri paginació:

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

a dins de page_paginee.html :

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

Estils de la paginació

La paginació està formada per una sèrie d’enllaços, i el número de pàgina corresponent a la pàgina actual dotada de la class «.on»: es definirà per tant els estils per a i .on si es vol personalitzar l’aparença.

Escollir el model de paginació

A partir d’SPIP 1.9, l’etiqueta #PAGINATION accepta un paràmetre {modele}, que ens permet modificar el resultat de l’etiqueta.

D’aquesta manera #PAGINATION{precedent_suivant} mostrarà enllaços cap a les pàgines anteriors i següents. Els enllaços seran els següents

page précédente | page suivante

#PAGINATION{page} mostrarà qualsevol cosa de la següent manera

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

#PAGINATION{page_precedent_suivant} mostrarà quelcom com

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

És possible definir altres models de paginació, que s’hauran d’anomenar pagination_modele. Podrem, per crear-los, inspirar-nos amb els que són lliurats de base amb SPIP i que es troben situats a dins del directori prive/modeles/ (fins a la versió 1.9.2 d’SPIP estaven situats a dist/modeles/) . Per a més informació, llegiu la documentació sobre els models.

Notes

[1Recordeu: per tal que el criteri {ajax} sigui reconegut per l’etiqueta #PAGINATION, cal que aquesta última estigui a dins d’un element de class pagination.

Alerta: molt més simple, aquest mecanisme de paginació és també incompatible amb el d’ SPIP-Contrib’, que li ha servit de base. Si utilitzeu la contrib haureu de revisar els esquelets en qüestió.

Autor merce Publié le : Mis à jour : 21/03/23

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