Freundlicher Symfony-Paginator zum Paginieren von allem
Im Allgemeinen basiert dieses Paket auf der Knp Pager-Komponente. Diese Komponente führt eine andere Art der Paginierungsbehandlung ein. Weitere Informationen zur internen Logik finden Sie unter dem angegebenen Dokumentationslink.
Hinweis: Halten Sie die knp-Komponenten mit diesem Bundle synchron. Wenn Sie eine ältere Version von KnpPaginatorBundle verwenden möchten, verwenden Sie die Tags v3.0 oder v4.X im Repository, die zum Paginieren von ODM MongoDB- und ORM 2.0- Abfragen geeignet sind
Einzelheiten zu Änderungen finden Sie in den Veröffentlichungen.
>=4.4
.>=6.4
Versionen kompatibel.>=3.0
ist erforderlich, wenn Sie die Twig-Templating-Engine verwenden. Hinweis: Die Verwendung mehrerer Paginatoren erfordert die Festlegung des Alias , um nicht widersprüchliche Parameter beizubehalten.
composer require knplabs/knp-paginator-bundle
Wenn Sie Flex nicht verwenden (das sollten Sie tun), müssen Sie das Bundle manuell aktivieren:
// app / AppKernel . php
public function registerBundles ()
{
return [
// ...
new Knp Bundle PaginatorBundle KnpPaginatorBundle (),
// ...
];
}
Sie können Standardnamen und -vorlagen für Abfrageparameter sowie einige andere Optionen konfigurieren:
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
]
]);
};
Das könnte sofort im Schlüssel knp_paginator.template.pagination
verwendet werden:
@KnpPaginator/Pagination/sliding.html.twig
(standardmäßig)@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
Das könnte sofort im Schlüssel knp_paginator.template.rel_links
verwendet werden:
@KnpPaginator/Pagination/rel_links.html.twig
(standardmäßig) Das könnte sofort im Schlüssel knp_paginator.template.sortable
verwendet werden:
@KnpPaginator/Pagination/sortable_link.html.twig
(standardmäßig)@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
Das könnte sofort im Schlüssel knp_paginator.template.filtration
verwendet werden:
@KnpPaginator/Pagination/filtration.html.twig
(standardmäßig)@KnpPaginator/Pagination/bootstrap_v5_filtration.html.twig
@KnpPaginator/Pagination/twitter_bootstrap_v4_filtration.html.twig
Derzeit kann der Paginator Folgendes paginieren:
array
DoctrineDBALQueryQueryBuilder
DoctrineORMQuery
DoctrineORMQueryBuilder
DoctrineODMMongoDBQueryQuery
DoctrineODMMongoDBQueryBuilder
DoctrineODMPHPCRQueryQuery
DoctrineODMPHPCRQueryBuilderQueryBuilder
DoctrineCommonCollectionArrayCollection
– jede Doctrine-Relationssammlung, einschließlichModelCriteria
– ORM-Abfrage vorantreibenSolarium_Client
und Solarium_Query_Select
als Elementen // 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 >
Für die Übersetzung des folgenden Textes:
%foo% name
mit Übersetzungsschlüssel table_header_name
. Die Übersetzung befindet sich in der Domäne messages
.{0} No author|{1} Author|[2,Inf] Authors
mit Übersetzungsschlüssel table_header_author
. Die Übersetzung befindet sich in der Domäne messages
.translationCount und translationParameters können kombiniert werden.
< 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 >
Sie können Übersetzungen auch überschreiben, indem Sie eine Übersetzungsdatei im folgenden Namensformat erstellen: domain.locale.format
. Um also eine Übersetzungsdatei für dieses Bundle zu erstellen, müssen Sie beispielsweise die Datei KnpPaginatorBundle.tr.yaml
unter project_root/translations/
erstellen und dort Ihre Übersetzungen hinzufügen:
label_previous : " Önceki "
label_next : " Sonraki "
filter_searchword : " Arama kelimesi "
Wenn Sie die Standardübersetzung für die Konfiguration entsprechend festlegen:
framework :
default_locale : tr
Symfony wählt es automatisch aus.
Sie können einen Paginatordienst automatisch in einen anderen Dienst einfügen, indem Sie das DIC-Tag knp_paginator.injectable
verwenden. Das Tag benötigt ein optionales Argument paginator
, das die ID des Paginator-Dienstes ist, der eingefügt werden soll. Der Standardwert ist knp_paginator
.
Die Klasse, die den KnpPaginator-Dienst empfängt, muss KnpBundlePaginatorBundleDefinitionPaginatorAwareInterface
implementieren. Wenn Sie zu faul sind, können Sie auch einfach die Basisklasse KnpBundlePaginatorBundleDefinitionPaginatorAware
erweitern.
Von der Verwendung
PaginatorAwareInterface
wird abgeraten und diese Warnung könnte in einer zukünftigen Version entfernt werden. Sie sollten sich nicht auf die Setter-Injektion verlassen, sondern nur auf die richtige Konstruktor-Injektion. Die Verwendung des in Symfony integrierten Autowiring-Mechanismus ist die empfohlene Vorgehensweise.
Der knp_paginator
Dienst wird verzögert erstellt, wenn das Paket symfony/proxy-manager-bridge
installiert ist.
Weitere Informationen zu Lazy-Diensten finden Sie in der Symfony-Dokumentation zur Abhängigkeitsinjektion.
<? 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
(ersetzen Sie bei Bedarf „en“ durch Ihren eigenen Sprachcode). Fügen Sie dann diese Zeilen hinzu: label_next : Next
label_previous : Previous
<rel>
-Links nur bei Verwendung der Paginierung von Bedeutung sind, sie sind für die Sortierung oder Filterung nicht relevant. Bitte lesen Sie zuerst diesen Beitrag.
Diese Bibliothek wird von folgenden Personen gepflegt (alphabetisch sortiert):