JAMES WEB
Aprenda como se faz.
Paginação (Categorias)
Em um sistema de e-commerce, a paginação é um recurso essencial para organizar e exibir grandes quantidades de produtos ou informações de forma clara e eficiente. Imagine uma loja online com centenas ou milhares de itens em seu catálogo: exibir todos esses produtos em uma única página tornaria a experiência do usuário extremamente confusa e lenta.
A paginação resolve esse problema dividindo o conteúdo em páginas menores e numeradas, permitindo que os usuários naveguem facilmente entre elas. Em vez de rolar infinitamente por uma lista gigante de produtos, os visitantes podem clicar em números ou setas para avançar ou retroceder pelas páginas, encontrando rapidamente o que procuram.

Para começar…
Para começar vamos criar um método que irá realizar a paginação de nosso site. Para isto acesse o arquivo “Category.php” e crie a função getProductsPage() acima da função addProduct(). Veja a seguir como ela ficará:
PHP: Category.php – getProductsPage()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php //início do código Public function getProductsPage( $page = 1, $itemsPerPage = 4) { $start = ( $page -1) * $itemsPerPage ; $sql = new Sql(); $results = $sql ->select(" SELECT SQL_CALC_FOUND_ROWS * FROM tb_products a INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct INNER JOIN tb_categories c ON c.idcategory = b.idcategory WHERE c.idcategory = :idcategory LIMIT $start , $itemsPerPage ; ", [ ':idcategory' => $this ->getidcategory() ]); $resultTotal = $sql ->select( "SELECT FOUND_ROWS() AS nrtotal;" ); return [ 'data' =>Product::checkList( $results ), 'total' =>(int) $resultTotal [0][ "nrtotal" ], 'pages' => ceil ( $resultTotal [0][ "nrtotal" ] / $itemsPerPage ) ]; } // resto código php ?> |
Explicação detalhada linha por linha:
- L4 – Public function getProductsPage($page = 1, $itemsPerPage = 4): A função getProductPage() recebe dois parâmetros. O primeiro qual a página que está sendo exibida, “$page”, que por padrão será “1” e quantos itens por página queremos de seja exibido através de “$itemsPerPage”. Por questão de exemplo vamos colocar o valor “4”.
- L6 – $start = ($page -1) * $itemsPerPage: Através da variável “$start” vamos armazenar qual o primeiro produto a ser exibido de acordo com o valor de “$page”. Como o valor inicial de “$page” é igual a “1” e sendo subtraído por “1” será igual a zero que multiplicado por 4, “$itemsPerPage”, o valor de “$start” será 0, o valor do primeiro produto (1º registro) a ser exibido na página de 3 possíveis. Caso “$page” seja 2 o resultado da operação será 4, que representará o primeiro produto a ser exibido na página 2 (4º registro) obs: a contagem começa do zero;
- L7 – $sql = new Sql();: Aqui, criamos uma instância da classe Sql. Assumimos que essa classe encapsula a lógica para interagir com o banco de dados;
- L8 – $results = $sql->select(“: O resultado da consulta SQL é armazenado na variável $results. Este resultado será um array de registros do banco de dados.
- L9 – SELECT SQL_CALC_FOUND_ROWS *: Seleciona todas as colunas (*) da tabela tb_products. SQL_CALC_FOUND_ROWS é uma diretiva que instrui o banco de dados a contar o número total de linhas que a consulta retornaria sem a cláusula LIMIT.
- L10/12 – FROM tb_products a INNER JOIN tb_categoriesproducts b ON a.idproduct = b.idproduct INNER JOIN tb_categories c ON c.idcategory = b.idcategory: Realiza junções (joins) entre as tabelas tb_products, tb_categoriesproducts e tb_categories para relacionar produtos e categorias.
- L13 – WHERE c.idcategory = :idcategory: Filtra os resultados para incluir apenas produtos que pertencem à categoria especificada. :idcategory é um parâmetro nomeado.
- L14 – LIMIT $start, $itemsPerPage: Limita o número de resultados retornados, implementando a paginação.
- L16 – [‘:idcategory’=>$this->getidcategory()]: Fornece o valor para o parâmetro :idcategory. onde $this->getidcategory() retorna o ID da categoria desejada.
- L18 – $resultTotal = $sql->select(“SELECT FOUND_ROWS() AS nrtotal;”);: Aqui, executamos outra consulta SQL para obter o número total de linhas que a consulta anterior retornaria sem o LIMIT. FOUND_ROWS() retorna esse valor, e o armazenamos na coluna nrtotal.
- L19/23 – return […]: Finalmente, a função retorna um array associativo contendo:
- ‘data’=>Product::checkList($results): Os resultados da consulta, processados pela função.
- ‘total’=>(int)$resultTotal[0][“nrtotal”]: O número total de produtos encontrados, convertido para um inteiro.
- ‘pages’=>ceil($resultTotal[0][“nrtotal”] / $itemsPerPage): O número total de páginas necessárias para exibir todos os produtos. O ceil() é uma função interna do PHP 7 que arredonda o resultado para cima, garantindo que todas as páginas sejam incluídas.
Rota Templete Category
Este bloco de código renderiza o template category.html, preenchendo-a com os dados da categoria, os produtos e define uma rota para exibir os produtos de uma categoria específica, com paginação. Ele obtém o ID da categoria da URL, busca os dados da categoria e os produtos paginados do banco de dados, gera links de paginação e renderiza um template chamado “category” com os dados necessários. Essencialmente, é a lógica para exibir uma página de categoria de produtos em um site.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php //início do código //Rota Template Category $app ->get( '/category/:idcategory' , function ( $idcategory ) { $page = (isset( $_GET [ 'page' ]))?(int) $_GET [ 'page' ]: 1; $category = new Category(); $category ->get((int) $idcategory ); $pagination = $category ->getProductsPage( $page ); $pages = []; for ( $i =1; $i <= $pagination [ 'pages' ]; $i ++) { array_push ( $pages , [ 'link' => '/category/' . $category ->getidcategory(). '?page=' . $i , 'page' => $i ]); } $page = new Page(); $page ->setTpl( "category" , [ 'category' => $category ->getValues(), 'products' => $pagination [ "data" ], 'pages' => $pages ]); }); // resto código php ?> |
Veja a exeplicação linha por linha
- L5 – $app->get(‘/category/:idcategory’, function($idcategory) { … }): Esta linha configura uma rota na aplicação web. $app é um objeto que gerencia as rotas da aplicação.
- $app->get(…): Define uma rota que responde a requisições HTTP do tipo GET (quando o usuário acessa uma URL no navegador).
- ‘/category/:idcategory’: É o padrão da URL que a rota irá capturar. :idcategory é um parâmetro dinâmico, ou seja, pode variar. Por exemplo, /category/1, /category/2, etc.
- function($idcategory) { … }: É uma função anônima que será executada quando a rota for acessada. $idcategory é o valor da categoria (parâmetro dinâmico capturado da URL).
- L7 – page = (isset($_GET[‘page’]))?(int)$_GET[‘page’]: 1;: Esta linha determina o número da página a ser exibida.
- isset($_GET[‘page’]): Verifica se o parâmetro page foi passado na URL (por exemplo, ?page=2).
- ?(int)$_GET[‘page’]: Se $_GET[‘page’] existir, ele é convertido para um inteiro e atribuído à variável $page. Caso contrário, $page recebe o valor padrão 1 (primeira página).
- L8 – $category = new Category();: Cria uma nova instância da classe Category. Assumimos que essa classe encapsula a lógica para trabalhar com categorias de produtos.
- L9 – $category->get((int)$idcategory);: Chama o método get() do objeto $category, passando o idcategory convertido para um inteiro. Este método busca as informações da categoria no banco de dados e as armazena no objeto $category.
- L10 – $pagination = $category->getProductsPage($page);: Chama o método getProductsPage() do objeto $category, passando o número da página $page. Este método, como vimos anteriormente, busca os produtos da categoria, aplicando a paginação. O resultado é armazenado na variável $pagination.
- L11 – $pages = [];: Inicializa um array vazio chamado $pages. Este array irá armazenar informações sobre as páginas da paginação.
- L12 – for ($i=1; $i <= $pagination['pages']; $i++) { ... }: Um loop for que itera sobre o número total de páginas ($pagination[‘pages’]).
- L13 – array_push($pages, […]);: Dentro do loop, um array associativo é criado para cada página e adicionado ao array $pages.
- L14 – ‘link’=>’http://localhost/ecommerce/category/’.$category->getidcategory().’?page=’.$i: Cria o link para a página $i.
- L15 – ‘page’=>$i: Armazena o número da página $i.
- L18 – page = new Page();: Cria uma nova instância da classe Page. Essa classe lida com a renderização de templates (category.html).
- L19 – $page->setTpl(“category”, […]);: Chama o método setTpl() do objeto $page, passando o nome do template (“category”) e um array de dados para serem usados no template.
- L20 – ‘category’=>$category->getValues(): Passa os dados da categoria para o template.
- L21 – ‘products’=>$pagination[“data”]: Passa os produtos da página atual para o template.
- L22 – ‘pages’=>$pages: Passa os links de paginação para o template.
Links paginação
O trecho de HTMLa seguir extraido do código caegory.html, combinado com a lógica do motor de templates, gera uma lista de links de paginação. Cada link leva a uma página diferente de resultados, permitindo que o usuário navegue facilmente entre as páginas. A classe “pagination” é usada para aplicar estilos visuais à lista, garantindo que ela se integre perfeitamente ao design da página.
Altere o trecho entre as tags <ul class=”pagination> e <ul> pelo seguinte trecho:
1 2 3 4 5 6 7 8 9 | <!-- INICIO CODIGO HTML ///////////////////////--> < ul class = "pagination" > {loop="$pages"} < li >< a href = "{$value.link}" >{$value.page}</ a ></ li > {/loop} </ ul > <!-- FINAL CODIGO HTML ///////////////////////--> |
Observe o que o trecho faz linha por linha:
- L3 – <ul class=”pagination”>: Esta linha inicia uma lista não ordenada (<ul>). Em HTML, listas não ordenadas são usadas para agrupar itens relacionados, sem uma ordem numérica específica.
- class=”pagination”: Atribui a classe CSS “pagination” à lista. Classes CSS são usadas para aplicar estilos visuais aos elementos HTML. Neste caso, a classe “pagination” define a aparência da lista de links de paginação.
- L4 – {loop=”$pages”}: Esta é uma diretiva de template, não HTML padrão. Estamos usando um motor de templates personalizado que permite inserir lógica de programação no HTML. Inicia um loop que itera sobre o array $pages que foi passado do código PHP para o template. Lembre-se, o array $pages contém informações sobre os links de paginação.
- L5 – <li><a href=”{$value.link}”>{$value.page}</a></li>: Esta linha gera um item de lista (<li>) contendo um link (<a>).
- <li>: Cada página da paginação, aparece como um item da lista.
- <a>: Representa um hyperlink, um link que o usuário pode clicar para navegar para outra página.
- href=”{$value.link}”: Define o destino do link. {$value.link} é uma variável de template que representa o link para uma página de paginação específica.
- {$value.page}: É o texto exibido no link, que representa o número da página.
- L6 – {/loop}: Esta linha encerra o loop iniciado por {loop=”$pages”}. Ela indica o fim do bloco de código que será repetido para cada item no array $pages.
- L7 – </ul>: Esta linha encerra a lista não ordenada (<ul>).
Agora ao clicar no menu de categorias no rodapé do site, será exibido página com os produtos referente à categoria selecionada. Serão exibidos quatro produtos por página e quantas páginas foram necessárias para exibir todos os produtos daquela categoria.

Para Saber Mais…
- Classe Category.php