Back-End

10 abr, 2012

Rolagem infinita: técnica de paginação com jQuery e PHP

Publicidade

Olá, pessoal! Hoje falaremos sobre paginação. Sobre esse assunto existe muito material na Internet, porém a minha intenção é mostrar uma abordagem nova e que muitas empresas estão usando: a “rolagem infinita”. É uma técnica bem simples de fazer. Veja o seguinte trecho de código:

Rolagem Infinita – Exemplo 1

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
        <title>Exemplo 1 - Rolagem Infinita</title>
        <script>
            $(document).ready(function(){
                $("#proxima-pagina").click(function(e){
                    $.post('ajax-exemplo.php', {}, function(data){
                        $("#local").append(data);
                    });
                    e.preventDefault();
                });
            });
        </script>
    </head>
    <body>
        <ul id="local">
            <?php 
                $linhas = array();
                $linhas[] = 'Link '.time();
sleep(1);
                $linhas[] = 'Link '.time();
                sleep(1);
$linhas[] = 'Link '.time();
            foreach($linhas as $linha){
                echo '<li>'.$linha.'</li>';
            }
            ?>
        </ul>
        <p><a href="javascript:void(0)" id="proxima-pagina">Próxima Página</a></p>
    </body>
</html>

É algo autoexplicativo. Eu não fiz acesso a banco de dados para não torná-lo complexo.

O código do arquivo ajax-exemplo.php é muito simples, vejam:

<li>Link <?php echo time(); sleep(1); ?></li>
<li>Link <?php echo time(); sleep(1); ?></li>
<li>Link <?php echo time(); sleep(1); ?></li>

Fazendo dessa forma, eu já tenho a paginação; porém esse código, ao meu ver, tem um grande problema. Caso ocorra algum erro de JavaScript na página que impeça esse código de ser executado, o usuário não terá a paginação. E vocês sabem: usuário insatisfeito não volta ao seu site. 

Então, como podemos resolver esse problema? Vamos ao código do exemplo 02!

Rolagem Infinita – Exemplo 2

<?php
    $pagina=1;
    if (isset($_GET['pagina']) ){
        $pagina = $_GET['pagina'];
    } 
    $pagina++;
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
        <title>Exemplo 2 - Rolagem Infinita</title>
        <script>
            //DEFINITION++;
            $(document).ready(function(){
                $("#proxima-pagina").click(function(e){
                    var el = $(this);
                    el.html('carregando');
                    var href = el.attr("href").split('=');
                    var link = href[1];
                    var proxima_pagina = (parseInt(link)+1);
                    $.post('ajax-exemplo.php', {pagina: link}, function(data){
                        $("#local").append(data);
                        el.attr( 'href', 'exemplo2.php?pagina='+(proxima_pagina) );
                        el.html( 'Página ' + proxima_pagina );
                    });
                    e.preventDefault();
                });
            });
        </script>
    </head>
    <body>
        <ul id="local">
            <?php 
                $linhas = array();
                $linhas[] = 'Link '.time();
                sleep(1);
                $linhas[] = 'Link '.time();
                sleep(1);
                $linhas[] = 'Link '.time();
            foreach($linhas as $linha){
                echo '<li>'.$linha.'</li>';
            }
            ?>
        </ul>
        <p><a href="exemplo2.php?pagina=<?php echo $pagina; ?>" id="proxima-pagina">Página <?php echo $pagina; ?></a></p>
    </body>
</html>

Nesse código, eu faço um Parser da URL, que no meu caso é muito simples: eu simplesmente faço o split do link para pegar qual seria a próxima página. É importante que a próxima página exista e faça de fato a paginação. 

Remova o comentário DEFINITION++ que verá o funcionamento do código JavaScript para paginação. Agora já temos uma paginação funcionando e sem o problema de erro, caso o JavaScript pare de funcionar.

Agora comentarei um caso real que aconteceu recentemente na movin’ on – empresa em que trabalho -, e foi exatamente isso que motivou a fazer este artigo.

Conseguimos fechar uma parceria com o site Mídia Publicitária para renovar a interface do site deles e no layout sugerimos que a paginação fosse feita dessa forma, com rolagem infinita. Porém, o site deles é no WordPress. Como poderíamos fazer essa paginação? Não poderíamos fazer como no exemplo acima, pois não compensaria (no nosso ponto de vista) fazer o get_posts por ajax e exibir o conteúdo. 

Dessa forma, fizemos o seguinte:

<script>
    jQuery(function(){
        jQuery(".mais-postagens a").click(function(e){
            var link = jQuery(this).attr("href");
            jQuery(".mais-postagens").html("<a><img src='http://midiapublicitaria.com/wp-content/themes/mp-movinon/images/ajax-loader.gif' alt='carregando...' />carregando...</a>");
            jQuery("#hack-mv").load(link, function(data){ 
                var c = jQuery("#hack-mv").find("#content");
                c.find("header.page-header").remove();
                c.find(".popular").remove();
                jQuery("#hack-mv").remove();
                jQuery(".mais-postagens").remove();
                jQuery("#mais-post").html(c.html());
                jQuery("#mais-post").attr("id", 't-'+new Date().getTime() );
            });
            e.preventDefault();
        });
 
    });
</script>

No código acima, eu pego o conteúdo da URL e coloco dentro de um iframe. Acesso-o e capturo somente a DIV, onde está o conteúdo que está sendo paginado. Removo as partes que não interessam para a paginação e adiciono o HTML dentro de uma nova DIV. Pronto, paginação realizada!

Uma dica extra: Para quem não conhece o WordPress, deveria pesquisar sobre, pois ele traz muita produtividade ao desenvolvimento de sites. 

Espero que tenham gostado e caso tenham alguma dúvida é só perguntar nos comentários.

Um detalhe: os códigos aqui tiveram o objetivo de serem explicativos e não mostrar performance ou a melhor forma de ser feito.

Até a próxima!