O que é o KnpPaginatorBundle?
O KnpPaginatorBundle é uma biblioteca para a paginção de listas em Symfony. Ele permite que você crie a interface de usuário necessária para navegar pelos dados em um banco de dados volumoso. Uma interface de paginação fácil de usar é criada quando você inclui o pacote “knp-paginator-bundle” no seu projeto. Você pode personalizar a interface para se adequar às suas necessidades, permitindo que os usuários pesquisem, filtrem e classifiquem pelos dados com facilidade. Além disso, este recurso ajuda a manter a performance do seu aplicativo, pois só é carregado uma quantidade pré-definida de registros de cada vez.
Quais são os recursos do KnpPaginatorBundle?
Estes são alguns recursos incluído no KnpPaginatorBundle:
- Paginção de resultados
- Geração de links para páginas de resultados
- Classificação fácil de resultados em ordem crescente ou decrescente
- Filtros simples e avançados
- Busca por palavra-chave
Como instalar o KnpPaginatorBundle?
Para instalar o KnpPaginatorBundle via Composer, execute o seguinte comando no terminal:
composer require knplabs/knp-paginator-bundle
Uma vez que o pacote foi instalado, você deve adicionar o paginator.yaml em config/packages/ com as seguintes linhas.
knp_paginator:
page_range: 5 # número de links de página de navegação visualizados
default_options:
page_name: page # nome do parâmetro na url
sort_direction_parameter_name: direction # nome do parâmetro usado para mudar a direção da ordenação
sort_field_parameter_name: sort # nome do parâmetro usado para mudar o campo de ordenação
distinct: true # chave única de campo padrão
template:
# nome do arquivo de modelo que renderiza a paginação do controle.
Como paginar resultados com o KnpPaginatorBundle?
Vamos supor que você tem uma consulta que retornou um grande número de resultados e precisa paginate-los em várias páginas. Para fazer isso, o KnpPaginatorBundle inclui o seguinte exemplo de código:
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository(‘AcmeBundle:Product’);
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$repo->findAll(), // origem de dados a ser paginado (array resultset)
$request->query->getInt('page', 1), // número da página iniciada
10 // número de itens por página
);
Como classificar os resultados em ordem crescente ou decrescente com KnpPaginatorBundle?
Você pode ordernar a listagem facilmente com o KnpPaginatorBundle. Observe o uso de query.setParameter acompanhado de variáveis nomeadas na query. A query SQL resultante pode ser vista na guia “Query” na visualização do profile do Symfony. O exemplo a seguir ordena os artigos por ID em ordem crescente:
$query = $em->createQuery('SELECT a FROM AppBundle:Article a ORDER BY a.id ASC');
$query->setParameter('user_id', $user_id); // adicione condição extra
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$query, // origem de dados a ser ordernada (pode ser qualquer coisa)
$request->query->getInt('page', 1), // número da página iniciada
10 // número de registros por página
);
Como adicionar filtros com KnpPaginatorBundle?
O KnpPaginatorBundle inclui filtros para simplificar a busca e classificação em várias colunas. Uma consulta de exemplo inclui o uso de query.setParameter acompanhado de variáveis nomeadas na consulta. A consulta SQL resultante pode ser vista na guia “Query” na visualização do profile do Symfony. No próximo exemplo, vamos ordernar os artigos por Título em ordem crescente:
$query = $em->createQuery('SELECT a FROM AppBundle:Article a WHERE a.user_id = :user_id ORDER BY a.title ASC');
$query->setParameter('user_id', $user_id);
$filterForm = $this->createForm(FilterType::class);
$filterForm->handleRequest($request);
if ($filterForm->isSubmitted() && $filterForm->isValid()) {
$data = $filterForm->getData();
if ($data['name']) {
$query->andWhere('a.name LIKE :name');
$query->setParameter('name', '%'.$data['name'].'%');
}
$pagination = $this->get('knp_paginator')->paginate(
$query, // origem de dados a ser paginado
$request->query->getInt('page', 1), // número da página iniciada
10 // número de registros por página
);
}
Como personalizar a visualização do KnpPaginatorBundle?
O design padrão do KnpPaginatorBundle pode ser substituído usando o arquivo de modelo Twig conforme as necessidades do seu projeto. Existem vários exemplos de código para você começar aqui. Note que a aparência da página de paginação pode variar bastante de projeto para projeto, dependendo do nível de personalização. O KnpPaginatorBundle torna tudo possível. O exemplo a seguir modifica a aparência dos botões utilizando classes CSS:
{# app/Resources/views/pagination.html.twig #}
{# ... iniciando com os botões Primeira Página e Última Página #}
{% if pagination.pageNumber != 1 %}
<< Primeira Página
{% endif %}
{% if pagination.hasNext %}
Próxima Página >>
{% endif %}
Como usar o KnpPaginatorBundle Com Shared Templates?
O KnpPaginatorBundle facilita a personalização de um site com um cabeçalho compartilhado e footer em cada página. Nesse trecho de código, você pode adicionar a variável items para torná-la disponível fora da paginação. O Twig então pode acessá-la em seu arquivo template de página. O exemplo a seguir utiliza esse recurso:
{# app/Resources/views/base.html.twig #}
{% block title %}Meu Site{% endblock %}
{% block stylesheets %}{% endblock %}
{% include 'partials/_header.html.twig' %}
{% for flashMessage in app.session.flashbag.get('success') %}
{{ flashMessage }}
{% endfor %}
{{ knp_pagination_render(pagination, ‘KnpPaginatorBundle:Pagination:twitter_bootstrap.html.twig’,