Paginateur Symfony convivial pour tout paginer
Généralement, ce bundle est basé sur le composant Knp Pager. Ce composant introduit une manière différente de gérer la pagination. Vous pouvez en savoir plus sur la logique interne sur le lien de documentation donné.
Remarque : gardez les composants knp synchronisés avec cet ensemble. Si vous souhaitez utiliser une ancienne version de KnpPaginatorBundle, utilisez les balises v3.0 ou v4.X dans le référentiel qui conviennent pour paginer les requêtes ODM MongoDB et ORM 2.0.
Pour plus de détails concernant les changements, veuillez lire les versions.
>=4.4
.>=6.4
.>=3.0
est requise si vous utilisez le moteur de création de modèles Twig. Remarque : l'utilisation de plusieurs paginateurs nécessite de définir l' alias afin de conserver des paramètres non conflictuels.
composer require knplabs/knp-paginator-bundle
Si vous n'utilisez pas flex (vous devriez le faire), vous devez activer manuellement le bundle :
// app / AppKernel . php
public function registerBundles ()
{
return [
// ...
new Knp Bundle PaginatorBundle KnpPaginatorBundle (),
// ...
];
}
Vous pouvez configurer des noms et des modèles de paramètres de requête par défaut, ainsi que quelques autres options :
knp_paginator :
convert_exception : false # throw a 404 exception when an invalid page is requested
page_range : 5 # number of links shown in the pagination menu (e.g: you have 10 pages, a page_range of 3, on the 5th page you'll see links to page 4, 5, 6)
remove_first_page_param : false # remove the page query parameter from the first page link
default_options :
page_name : page # page query parameter name
sort_field_name : sort # sort field query parameter name
sort_direction_name : direction # sort direction query parameter name
distinct : true # ensure distinct results, useful when ORM queries are using GROUP BY statements
filter_field_name : filterField # filter field query parameter name
filter_value_name : filterValue # filter value query parameter name
page_out_of_range : ignore # ignore, fix, or throwException when the page is out of range
default_limit : 10 # default number of items per page
template :
pagination : ' @KnpPaginator/Pagination/sliding.html.twig ' # sliding pagination controls template
rel_links : ' @KnpPaginator/Pagination/rel_links.html.twig ' # <link rel=...> tags template
sortable : ' @KnpPaginator/Pagination/sortable_link.html.twig ' # sort link template
filtration : ' @KnpPaginator/Pagination/filtration.html.twig ' # filters template
// config / packages / paginator . php
<?php declare (strict_types= 1 );
use Symfony Component DependencyInjection Loader Configurator ContainerConfigurator ;
return static function ( ContainerConfigurator $ configurator ): void
{
$ configurator -> extension ( ' knp_paginator ' , [
' convert_exception ' => false , // throw a 404 exception when an invalid page is requested
' page_range ' => 5 , // number of links shown in the pagination menu ( e . g : you have 10 pages , a page_range of 3 , on the 5 th page you ' ll see links
' remove_first_page_param ' => false , // remove the page query parameter from the first page link
' default_options ' => [
' page_name ' => ' page ' , // page query parameter name
' sort_field_name ' => ' sort ' , // sort field query parameter name
' sort_direction_name ' => ' direction ' , // sort direction query parameter name
' distinct ' => true , // ensure distinct results , useful when ORM queries are using GROUP BY statements
' filter_field_name ' => ' filterField ' , // filter field query parameter name
' filter_value_name ' => ' filterValue ' // filter value query parameter name
'page_out_of_range' => 'ignore', // ignore , fix , or throwException when the page is out of range
' default_limit ' => 10 // default number of items per page
],
' template ' => [
' pagination ' => ' @KnpPaginator/Pagination/sliding.html.twig ' , // sliding pagination controls template
' rel_links ' => ' @KnpPaginator/Pagination/rel_links.html.twig ' , // < link rel = ... > tags template
' sortable ' => ' @KnpPaginator/Pagination/sortable_link.html.twig ' , // sort link template
' filtration ' => ' @KnpPaginator/Pagination/filtration.html.twig ' // filters template
]
]);
};
Cela pourrait être utilisé directement dans la clé knp_paginator.template.pagination
:
@KnpPaginator/Pagination/sliding.html.twig
(par défaut)@KnpPaginator/Pagination/bootstrap_v5_pagination.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v3_pagination.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_pagination.html.twig
@KnpPaginator/Pagination/foundation_v6_pagination.html.twig
@KnpPaginator/Pagination/foundation_v5_pagination.html.twig
@KnpPaginator/Pagination/bulma_pagination.html.twig
@KnpPaginator/Pagination/semantic_ui_pagination.html.twig
@KnpPaginator/Pagination/materialize_pagination.html.twig
@KnpPaginator/Pagination/tailwindcss_pagination.html.twig
@KnpPaginator/Pagination/uikit_v3_pagination.html.twig
Cela pourrait être utilisé directement dans la clé knp_paginator.template.rel_links
:
@KnpPaginator/Pagination/rel_links.html.twig
(par défaut) Cela pourrait être utilisé directement dans la clé knp_paginator.template.sortable
:
@KnpPaginator/Pagination/sortable_link.html.twig
(par défaut)@KnpPaginator/Pagination/bootstrap_v5_bi_sortable_link.html.twig
@KnpPaginator/Pagination/bootstrap_v5_fa_sortable_link.html.twig
@KnpPaginator/Pagination/bootstrap_v5_md_sortable_link.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v3_sortable_link.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v4_font_awesome_sortable_link.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v4_material_design_icons_sortable_link.html.twig
@KnpPaginator/Pagination/semantic_ui_sortable_link.html.twig
@KnpPaginator/Pagination/uikit_v3_sortable.html.twig
Cela pourrait être utilisé directement dans la clé knp_paginator.template.filtration
:
@KnpPaginator/Pagination/filtration.html.twig
(par défaut)@KnpPaginator/Pagination/bootstrap_v5_filtration.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v4_filtration.html.twig
Actuellement, le paginateur peut paginer :
array
DoctrineDBALQueryQueryBuilder
DoctrineORMQuery
DoctrineORMQueryBuilder
DoctrineODMMongoDBQueryQuery
DoctrineODMMongoDBQueryBuilder
DoctrineODMPHPCRQueryQuery
DoctrineODMPHPCRQueryBuilderQueryBuilder
DoctrineCommonCollectionArrayCollection
- toute collection de relations Doctrine, y comprisModelCriteria
- Requête Propel ORMSolarium_Client
et Solarium_Query_Select
comme éléments // App Controller ArticleController . php
public function listAction ( EntityManagerInterface $ em , PaginatorInterface $ paginator , Request $ request )
{
$ dql = " SELECT a FROM AcmeMainBundle:Article a " ;
$ query = $ em -> createQuery ( $ dql );
$ pagination = $ paginator -> paginate (
$ query , / * query NOT result * /
$ request -> query -> getInt ( ' page ' , 1 ), / * page number * /
10 / * limit per page * /
);
// parameters to template
return $ this -> render ( ' article/list.html.twig ' , [ ' pagination ' => $ pagination ]);
}
<head>
: {# rel links for pagination #}
{{ knp_pagination_rel_links( pagination ) }}
<body>
: {# total items count #}
< div class = " count " >
{{ pagination . getTotalItemCount }}
</ div >
< table >
< tr >
{# sorting of properties based on query components #}
< th >{{ knp_pagination_sortable( pagination , ' Id ' , ' a.id ' ) }}</ th >
< th {% if pagination. isSorted ( ' a.title ' ) %} class = " sorted " {% endif %}>
{{ knp_pagination_sortable( pagination , ' Title ' , ' a.title ' ) }}
</ th >
< th {% if pagination. isSorted ([ ' a.date ' , ' a.time ' ]) %} class = " sorted " {% endif %}>
{{ knp_pagination_sortable( pagination , ' Release ' , [ ' a.date ' , ' a.time ' ]) }}
</ th >
</ tr >
{# table body #}
{% for article in pagination %}
< tr {% if loop . index is odd %} class = " color " {% endif %}>
< td >{{ article . id }}</ td >
< td >{{ article . title }}</ td >
< td >{{ article . date | date ( ' Y-m-d ' ) }}, {{ article . time | date ( ' H:i:s ' ) }}</ td >
</ tr >
{% endfor %}
</ table >
{# display navigation #}
< div class = " navigation " >
{{ knp_pagination_render( pagination ) }}
</ div >
Pour traduire le texte suivant :
%foo% name
avec clé de traduction table_header_name
. La traduction est dans le domaine messages
.{0} No author|{1} Author|[2,Inf] Authors
avec clé de traduction table_header_author
. La traduction est dans le domaine messages
.translationCount et translationParameters peuvent être combinés.
< table >
< tr >
{# sorting of properties based on query components #}
< th >{{ knp_pagination_sortable( pagination , ' Id ' | trans({ foo : ' bar ' }, ' messages ' ), ' a.id ' ) | raw }}</ th >
< th {% if pagination. isSorted ( ' a.Title ' ) %} class = " sorted " {% endif %}>{{ knp_pagination_sortable( pagination , ' Title ' , ' a.title ' ) | raw }}</ th >
< th >{{ knp_pagination_sortable( pagination , ' Author ' | trans({}, ' messages ' ), ' a.author ' ) | raw }}</ th >
</ tr >
<!-- Content of the table -->
</ table >
Vous pouvez également remplacer les traductions en créant un fichier de traduction au format de nom suivant : domain.locale.format
. Ainsi, pour créer un fichier de traduction pour ce bundle, vous devez créer par exemple le fichier KnpPaginatorBundle.tr.yaml
sous project_root/translations/
et y ajouter vos traductions :
label_previous : " Önceki "
label_next : " Sonraki "
filter_searchword : " Arama kelimesi "
Si vous définissez la traduction par défaut pour la configuration en conséquence :
framework :
default_locale : tr
Symfony le sélectionnera automatiquement.
Vous pouvez injecter automatiquement un service paginateur dans un autre service en utilisant la balise DIC knp_paginator.injectable
. La balise prend un argument facultatif paginator
, qui est l'ID du service paginator qui doit être injecté. La valeur par défaut est knp_paginator
.
La classe qui reçoit le service KnpPaginator doit implémenter KnpBundlePaginatorBundleDefinitionPaginatorAwareInterface
. Si vous êtes trop paresseux, vous pouvez également simplement étendre la classe de base KnpBundlePaginatorBundleDefinitionPaginatorAware
.
Attention, l'utilisation de
PaginatorAwareInterface
est déconseillée et pourrait être supprimée dans une future version. Vous ne devez pas compter sur l'injection de setter, mais uniquement sur une injection de constructeur appropriée. L'utilisation du mécanisme de câblage automatique intégré à Symfony est la solution suggérée.
Le service knp_paginator
sera créé paresseusement si le package symfony/proxy-manager-bridge
est installé.
Pour plus d'informations sur les services paresseux, consultez la documentation Symfony sur l'injection de dépendances.
<? xml version = " 1.0 " ?>
< container xmlns = " http://symfony.com/schema/dic/services "
xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : schemaLocation = " http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd " >
< parameters >
< parameter key = " my_bundle.paginator_aware.class " >MyBundleRepositoryPaginatorAwareRepository</ parameter >
</ parameters >
< services >
< service id = " my_bundle.paginator_aware " class = " my_bundle.paginator_aware.class " >
< tag name = " knp_paginator.injectable " paginator = " knp_paginator " />
</ service >
</ services >
</ container >
framework :
translator : { fallbacks: ['%locale%'] }
translations/KnpPaginatorBundle.en.yml
(remplacez « en » par votre propre code de langue si nécessaire). Ajoutez ensuite ces lignes : label_next : Next
label_previous : Previous
<rel>
n'ont de sens que lors de l'utilisation de la pagination, ils ne sont pas pertinents pour le tri ou le filtrage. Veuillez d'abord lire cet article.
Cette bibliothèque est maintenue par les personnes suivantes (triées par ordre alphabétique) :