A paginação permite distribuir resultados muito numerosos por várias páginas.
O SPIP fornece um sistema simplificado de paginação dos resultados de um loop.
Sintaxe básica
Na forma mais simples, este sistema compõe-se de um critério e de uma tag:
- o critério
{pagination}
inclui-se no loop a paginar; - a tag
#PAGINATION
, inserida numa das partes opcionais («anterior» ou « posterior») do loop, exibe a «paginação».
<B_pagina>
[<nav role="navigation" class="pagination">(#PAGINATION)</nav>]
<ul>
<BOUCLE_pagina(ARTICLES){par date}{pagination}>
<li>#TITRE</li>
</BOUCLE_pagina>
</ul>
</B_pagina>
Se o site tiver 90 matérias publicadas, este loop exibirá a lista das dez matérias mais antigas, adicionada de links que levam às dez matérias seguintes, anteriores etc. Estes links são numerados como a seguir:
O número a partir do qual os resultados são exibidos é passado no URL por um parâmetro {debut_page=x}
com o mesmo nome (aqui, «pagina») do loop a que diz respeito. (Este parâmetro pode ser utilizado noutro loop através do critério clássico {debut_page,10}
.)
Nota: o número total de links exibidos é limitado: reticências permitem, quando apropriado, saltar diretamente para o fim da lista, ou de voltar à página inicial.
Âncoras de paginação
A tag #PAGINATION
inclui uma Âncora HTML que permite ao navegador exibir diretamente a parte da página que está paginada; todavia, se desejar inserir os links de paginação abaixo da lista de matérias, é preciso colocar a âncora sobre a lista.
A tag #ANCRE_PAGINATION retorna precisamente a âncora em questão e impede a tag #PAGINATION
seguinte de exibir a sua âncora.
<B_pagina>
#ANCRE_PAGINATION
<ul>
<BOUCLE_pagina(ARTICLES){par date}{pagination}>
<li>#TITRE</li>
</BOUCLE_pagina>
</ul>
[<nav role="navigation" class="pagination">(#PAGINATION)</nav>]
</B_pagina>
Inversamente, para não ancorar, deve-se especificar [(#ANCRE_PAGINATION|vide)]
no loop.
Acesso direto a um elemento específico
Para permitir dar um URL permanente a um elemento específico de uma lista paginada, deve-se usar &debut_abc=@xxx
onde «abc
» é o nome do loop de paginação e «xxx
» o id do objeto na tabela que está a ser paginada.
Exemplo: Num loop
<B_pagi>
[<nav role="navigation" class="pagination">(#PAGINATION)</nav>]
<ul>
<BOUCLE_pagi(ARTICLES){par titre}{pagination}>
<li>#ID_ARTICLE : #TITRE</li>
</BOUCLE_pagi>
</ul>
</B_pagi>
&debut_pagi=10
posiciona a paginação na segunda página (a partir do décimo elemento da lista)&debut_pagi=@231
posiciona a paginação na página que contém o id_article «231».
O número total de resultados
Num loop com o critério {pagination}
, #TOTAL_BOUCLE exibe o número de elementos efetivamente retornados, ou seja, 10 nas páginas plenas, e 10 ou menos na última página de resultados.
Para exibir o número de elementos que seriam retornados se o critério {pagination}
não estivesse presente, usa-se a tag #GRAND_TOTAL
.
<B_paginacao>
#ANCRE_PAGINATION
<BOUCLE_paginacao (ARTICLES) {pagination}>
#TITRE <br>
</BOUCLE_paginacao>
Há um total de #GRAND_TOTAL matérias, esta página exibe #TOTAL_BOUCLE
</B_paginacao>
Indicará: «Há um total de 1578 matérias, esta página exibe 10.»
Alterar o passo da {pagination}
O número padrão de 10 elementos por página pode ser alterado por um parâmetro suplementar no critério.
Assim
<BOUCLE_pagina(ARTICLES){pagination 5}>
#TITRE<br>
</BOUCLE_pagina>
retornará os títulos de cinco matérias a partir de debut_page.
O parâmetro em questão pode ser composto como se quiser a partir de outras tags, especialmente #ENV{xx}
, o que permite criar uma exibição personalizada bem completa.
A paginação nos templates incluídos
Se a sua paginação precisa funcionar num template incluído, você deve passar como parâmetro do comando INCLURE
a instrução {ajax, env}
; isto permite ao template incluído calcular o valor correto do parâmetro debut_xxx
, e ainda justifica-se por uma questão de segurança (a tag #PAGINATION
é com efeito calcular a partir do URL completo da página).
Nomear o critério de paginação
Quando se usa templates incluídos várias vezes na mesma página, como:
<BOUCLE_incluso(ARTICLES){id_rubrique}{par titre}>
<INCLURE{fond=motsgroupe5,id_article,ajax,env}>
</BOUCLE_incluso>
e esse INCLURE possui uma paginação (daí o uso do critério {env}
), ao se clicar em uma paginação, todas as outras paginações alteram-se ao mesmo tempo.
Para evitar isso, basta nomear o critério de paginação no ficheiro incluído com um nome que será diferente a cada inclusão:
<B_grupo5>
#ANCRE_PAGINATION
<BOUCLE_grupo5(MOTS){id_groupe=5}{pagination 15, #ID_ARTICLE}>
#TITRE<br>
</BOUCLE_grupo5>
[<nav role="navigation" class="pagination">(#PAGINATION)</nav>]
</B_grupo5>
Pode-se também querer especificar o nome que se quer dar ao critério de paginação a partir da chamada do INCLURE:
<INCLURE{fond=pagina_paginada, env, nom_p=_abc}>
<INCLURE{fond=pagina_paginada, env, nom_p=_def}>
na pagina_paginada.html:
<B_a>
#ANCRE_PAGINATION
<BOUCLE_a(ARTICLES){pagination 25, #ENV{nom_p}}>
#TITRE<br>
</BOUCLE_a>
[<nav role="navigation" class="pagination">(#PAGINATION)</nav>]
</B_a>
Estilos da paginação
A paginação constitui-se de uma série de links e de um número de página correspondente à página atual associada à classe «.on»: define-se então os estilos para a
e .on
para personalizar a aparência.
Escolher o modelo de paginação
A tag #PAGINATION
aceita um parâmetro {modele}
, que permite alterar o resultado da tag.
#PAGINATION{precedent_suivant}
exibirá os links para as páginas precedentes e seguintes. Os links serão os seguintes
#PAGINATION{page}
exibirá algo como a seguir
#PAGINATION{page_precedent_suivant}
exibirá algo como
página precedente 1 | 2 | 3 | 4 | 5 | 6 | página seguinte
#PAGINATION{prive}
exibirá algo como
0 | 10 | 20 | 30 | Exibir tudo
É possível definir outros modelos de paginação no diretório modeles/
do seu conjunto de templates. Eles deverão chamar-se pagination_nomedomodelo
. Pode inspirar-se nos modelos fornecidos pelo SPIP, situados no diretório prive/modeles/
Personalizar o modelo de paginação
Cada modelo possui parâmetros que podem ser personalizados.
Por exemplo, #PAGINATION{page_precedent_suivant}
exibe por padrão:
página precedente 1 | 2 | 3 | 4 | 5 | 6 | página seguinte
#PAGINATION{page_precedent_suivant, label_precedent=<, label_suivant=>}
exibe:
Configurar o endereço dos links de #PAGINATION
É possível especificar que URL deve servir de base para os links gerados pela tag #PAGINATION
.
Por exemplo, isso permite, se necessário, limpar uma variável de URL indesejável:
#PAGINATION{prive,self=#SELF|parametre_url{...}}
Configurar o número de links
Após o SPIP 4.0, os diferentes modelos de paginação aceitam um parâmetro nombre_liens_max
que, passado na tag #PAGINATION
permite definir o número máximo de links de paginação exibido pelo modelo. Pode-se igualmente empregar a constante _PAGINATION_NOMBRE_LIENS_MAX
.
Definir um novo modelo de paginação
É possível sobrescrever um modelo de paginação existente ou definir um novo no diretório modeles
do seu template ou plugin. Para isso, crie o ficheiro desse novo modelo com o nopme desejado. Assim, o modelo ligeiro.html
, permite-lhe usar #PAGINATION{ligeiro}
nos seus templates.
Os modelos de paginação recebem variáveis de ambiente das quais podem fazer uso: page_courante
, nombre_pages
, bloc_ancre
. Também podem utilizar o filtro |bornes_pagination
, que retorna os limites da paginação criada.
Para facilitar o seu trabalho, você pode começar por tomar o código de um modelo de paginação fornecido pelo SPIP e adaptá-lo às suas necessidades.
Não registar no histórico do navegador
Para isso, é precisso associar a classe CSS nohistory
ao link ajax (ver `ajax` para os `inclure`) :
[<nav role="navigation" class="pagination">
(#PAGINATION{precedent_suivant}|replace{lien_pagination,lien_pagination nohistory})
</nav>]