tmsolution/knp-paginator-bundle

Symfony2的分页组件,用于自动化分页以及简化排序和其他功能

安装: 44

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 3

分支: 341

类型:symfony-bundle

v2.6.1 2017-08-10 07:15 UTC

README

SEO友好的Symfony2分页组件,可分页一切内容

Build Status

通常,此组件基于Knp Pager组件。该组件引入了一种不同的分页处理方式。您可以阅读更多关于内部逻辑的文档链接。

knpbundles.com

注意:请确保与这个组件同步使用knp-components。如果您想使用KnpPaginatorBundle的旧版本 - 使用仓库中的v1.0标签,它适合分页ODM mongodbORM 2.0查询。

最新更新

有关最新更改的说明,请阅读CHANGELOG,有关代码中所需更改的说明,请阅读文档中的UPGRADE章节。

要求

  • Knp分页组件>=1.1
  • KnpPaginatorBundle的master与symfony(>=2.0版本)兼容。
  • 如果使用twig模板引擎,则需要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                      # default page range used in pagination control
    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
    template:
        pagination: 'KnpPaginatorBundle:Pagination:sliding.html.twig'     # sliding pagination controls template
        sortable: 'KnpPaginatorBundle:Pagination:sortable_link.html.twig' # sort link template

有一些额外的分页模板,可以在knp_paginator.template.pagination键中直接使用

  • KnpPaginatorBundle:Pagination:sliding.html.twig(默认)
  • KnpPaginatorBundle:Pagination:twitter_bootstrap_v3_pagination.html.twig
  • KnpPaginatorBundle:Pagination:twitter_bootstrap_pagination.html.twig
  • KnpPaginatorBundle:Pagination:foundation_v5_pagination.html.twig

使用示例

控制器

当前分页器可以分页

  • 数组
  • Doctrine\ORM\Query
  • Doctrine\ORM\QueryBuilder
  • Doctrine\ODM\MongoDB\Query\Query
  • Doctrine\ODM\MongoDB\Query\Builder
  • Doctrine\ODM\PHPCR\Query\Query
  • Doctrine\ODM\PHPCR\Query\Builder\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% 名称 与翻译键 table_header_name 相关。翻译位于域 messages
  • {0} 无作者|{1} 作者|[2,Inf] 作者 与翻译键 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 基类。

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>