metaship-ru / knp-paginator-bundle
Symfony 的分页器包,用于自动化分页以及简化排序和其他功能
Requires
- php: ^7.1
- knplabs/knp-components: ^1.3 || 2.3.4.*
- symfony/framework-bundle: ^3.4 || ^4.0
- symfony/translation: ^3.4 || ^4.0
- twig/twig: ^2.0
Requires (Dev)
- phpunit/phpunit: ^6.4 || ^8.0
- symfony/expression-language: ^3.4 || ^4.0
This package is auto-updated.
Last update: 2024-09-22 20:04:23 UTC
README
SEO 优化友好的 Symfony 分页器,可分页一切内容
通常,此包基于 Knp Pager 组件。此组件引入了处理分页的另一种方式。您可以在提供的文档链接中了解更多关于内部逻辑的信息。
注意:请确保 knp-components 与此包同步。如果您想使用 KnpPaginatorBundle 的旧版本,请使用存储库中的 v1.0 标签,它适用于分页 ODM MongoDB 和 ORM 2.0 查询。
最新更新
有关最新更改的说明,请阅读 CHANGELOG,有关代码中所需更改的说明,请阅读文档的 UPGRADE 章节。
需求
- Knp Pager 组件
>=1.1。 - KnpPaginatorBundle 的 master 与 Symfony
>=2.7版本兼容。 - 如果您使用 twig 模板引擎,则需要
>=1.5版本的 Twig。
特性
- 无需初始化特定的适配器。
- 可以按需进行定制,例如:分页视图、事件订阅者。
- 根据请求参数添加自定义过滤、排序功能。
- 关注点分离,分页器仅负责生成分页视图,分页视图用于表示。
注意:使用多个分页器需要设置 别名 以保持参数不冲突。
更详细的文档
- 创建 自定义分页订阅者
- 扩展分页类(待定,可能需要一些重构)
- 自定义视图模板和参数
安装和配置
使用 Composer 非常简单,运行
composer require knplabs/knp-paginator-bundle
将 PaginatorBundle 添加到您的应用程序内核
// app/AppKernel.php public function registerBundles() { return array( // ... new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(), // ... ); }
配置示例
您可以为默认查询参数名称和模板进行配置
knp_paginator: page_range: 5 # number of links showed 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) 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 template: pagination: '@KnpPaginator/Pagination/sliding.html.twig' # sliding pagination controls template sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template filtration: '@KnpPaginator/Pagination/filtration.html.twig' # filters template
额外的分页模板
这些模板可以在 knp_paginator.template.pagination 键中直接使用
@KnpPaginator/Pagination/sliding.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_v5_pagination.html.twig@KnpPaginator/Pagination/bulma_pagination.html.twig@KnpPaginator/Pagination/semantic_ui_pagination.html.twig@KnpPaginator/Pagination/materialize_pagination.html.twig
额外的可排序模板
这些模板可以在 knp_paginator.template.sortable 键中直接使用
@KnpPaginator/Pagination/sortable_link.html.twig(默认)@KnpPaginator/Pagination/twitter_bootstrap_v3_sortable_link.html.twig@KnpPaginator/Pagination/font_awesome_sortable_link.html.twig
使用示例
控制器
当前分页器可以分页
数组Doctrine\ORM\QueryDoctrine ORM 查询构建器Doctrine ODM MongoDB 查询Doctrine ODM MongoDB 查询构建器Doctrine ODM PHPCR 查询Doctrine ODM PHPCR 查询构建器\QueryBuilderDoctrine\Common\Collection\ArrayCollection- 包括任何 Doctrine 关系集合ModelCriteria- Propel ORM 查询- 包含
Solarium_Client和Solarium_Query_Select的数组
// Acme\MainBundle\Controller\ArticleController.php public function listAction(Request $request) { $em = $this->get('doctrine.orm.entity_manager'); $dql = "SELECT a FROM AcmeMainBundle:Article a"; $query = $em->createQuery($dql); $paginator = $this->get('knp_paginator'); $pagination = $paginator->paginate( $query, /* query NOT result */ $request->query->getInt('page', 1), /*page number*/ 10 /*limit per page*/ ); // parameters to template return $this->render('AcmeMainBundle:Article:list.html.twig', array('pagination' => $pagination)); }
视图
{# 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>{{ 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>
视图中的翻译
为了翻译以下文本
%foo% name,翻译键为table_header_name。翻译位于域messages中。{0} No author|{1} Author|[2,Inf] Authors,翻译键为table_header_author。翻译位于域messages中。
translationCount 和 translationParameters 可以组合。
<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>
依赖注入
您可以使用 knp_paginator.injectable DIC 标签自动将分页服务注入到另一个服务中。该标签接受一个可选参数 paginator,它是应注入的分页服务 ID。默认为 knp_paginator。
接收 KnpPaginator 服务的类必须实现 Knp\Bundle\PaginatorBundle\Definition\PaginatorAwareInterface。如果您太懒,也可以直接扩展 Knp\Bundle\PaginatorBundle\Definition\PaginatorAware 基类。
延迟服务
如果已安装包 ocramius/proxy-manager,则 knp_paginator 服务将延迟创建。
有关延迟服务的更多信息,请参阅 Symfony 依赖注入文档。
XML 配置示例
<?xml version="1.0" ?> <container xmlns="https://symfony.com.cn/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://symfony.com.cn/schema/dic/services https://symfony.com.cn/schema/dic/services/services-1.0.xsd"> <parameters> <parameter key="my_bundle.paginator_aware.class">MyBundle\Repository\PaginatorAwareRepository</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>
故障排除
- 确保在 symfony 配置中启用了翻译器
framework: translator: { fallbacks: ['%locale%'] }
- 如果您的区域设置不可用,请创建自己的翻译文件在
app/Resources/translations/KnpPaginatorBundle.en.yml(如有必要,用您的语言代码替换 en)。然后添加以下行
label_next: Next label_previous: Previous