metaship-ru/knp-paginator-bundle

Symfony 的分页器包,用于自动化分页以及简化排序和其他功能

0.1.3 2020-07-22 10:35 UTC

This package is auto-updated.

Last update: 2024-09-22 20:04:23 UTC


README

SEO 优化友好的 Symfony 分页器,可分页一切内容

Build Status

通常,此包基于 Knp Pager 组件。此组件引入了处理分页的另一种方式。您可以在提供的文档链接中了解更多关于内部逻辑的信息。

knpbundles.com

注意:请确保 knp-components 与此包同步。如果您想使用 KnpPaginatorBundle 的旧版本,请使用存储库中的 v1.0 标签,它适用于分页 ODM MongoDBORM 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\Query
  • Doctrine ORM 查询构建器
  • Doctrine ODM MongoDB 查询
  • Doctrine ODM MongoDB 查询构建器
  • Doctrine ODM PHPCR 查询
  • Doctrine ODM PHPCR 查询构建器\QueryBuilder
  • Doctrine\Common\Collection\ArrayCollection - 包括任何 Doctrine 关系集合
  • ModelCriteria - Propel ORM 查询
  • 包含 Solarium_ClientSolarium_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

维护者