Paginação

Quando não há a possibilidade de usar um plugin para realizar a paginação o jeito é fazer na unha. Para isso, é necessário muita lógica e paciência no desenvolvimento.

Vou utilizar um exemplo com 11 páginas.

Basicamente a paginação vai apresentar 5 formas diferente:
1 – 1ª página + 4 páginas seguintes:

2 – 5 primeiras páginas:


3 – 2 páginas anteriores + atual + 2 página posteriores


4 – 5 últimas páginas:


5 – 4 páginas anteriores + a última página:

Vamos ao código!
Para começarmos, precisamos de algumas variáveis que vão nos auxiliar nesse trabalho:

    #Retorna a página que está. Será passada desta forma na URL: /page/2
    pag=int(request.args[2])

    #Quantidade de post's que a página deve ter
    qtd=2

    #Números de post's que é retornado (total)
    tam=len(cds)

Para determinar a última página devemos dividir o total de post’s com a quantidade de cada página. Se tiver resto o valor deve ser acrecido em 1.

    if tam%qtd==1:
        ultima=tam/qtd+1
    else:
        ultima=tam/qtd

Para montar a paginação, precisamos determinar os valores minimo e máximo do for. Este for vai mostrar os post’s de acordo com a página.
Forma 1 e 2: os valores devem estar entre 1 e 5 (em python, sem coloque mais um para funcionar no range)

    if pag>= 1 and pag<=4:
        min=1
        max=6

Forma 5: os valores devem ser superiores a página final

    if (pag+4)>ultima:            
        min=ultima-4
        max=ultima+1

Veja como fica o código final:

    #Forma 1 e 2
    if pag>= 1 and pag<=4:
        min=1
        if ultima<6:
            max=ultima+1
        else:
            max=6
    else:   
        #Forma 4 e 5
        if (pag+4)>ultima:            
            min=ultima-4
            max=ultima+1
        #Forma 3
        else:                    
            min=pag-2
            max=pag+3

OK, já localizamos os valores, vamos ao lado prático:

<!--Verifica se a página pode ou não ter paginação-->
{{if pag['tam'] > pag['qtd']:}}
<div class="center">
    <div class="pagination">
        <ul>
            <!--Se não for a página 1, imprime os botões de "Primeira Página" e "Página anterior"-->
            {{if(pag['pag'])>1:}}
            <!-- Botão "Primeira Página" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],1])}}">&lt;&lt;</a></li>
            <!-- Botão "Página Anterior -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],(pag['pag']-1)])}}">&lt;</a></li>
            {{pass}}

            <!-- Vai imprimir os post's de acordo com os valores mínimo e máximo esbelecidos anteriormente -->
            {{for n in range(pag['min'],pag['max']):}}
                {{if int(pag['pag'])==n:}}
                    <li class="active"><a href="{{=URL(c='default',args=[request.args[0],request.args[1],n])}}">{{=n}}</a></li>       
                {{else:}}
                    <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],n])}}">{{=n}}</a></li>
                {{pass}}
            {{pass}}

            <!-- Se a página que está não for a última, imprime os botões de navegação -->
            {{if pag['pag']<pag['ultima']:}}
            <!-- Botão "Próxima Página" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],(pag['pag']+1)])}}">&gt;</a></li>
            <!-- Botão "Página Anterior" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],pag['ultima']])}}">&gt;&gt;</a></li>
            {{pass}}     
        </ul>
    </div>
</div>
{{pass}}
Anúncios

Um comentário em “Paginação

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s