ideup / simple-paginator-bundle
Symfony 2 分页器包。
Requires
- php: >=5.3.0
- beberlei/doctrineextensions: 0.3.0
- symfony/symfony: >=2.0
This package is not auto-updated.
Last update: 2020-01-10 14:39:06 UTC
README
此包包含一个用于轻松高效且无需费力进行复杂查询分页的包。
依赖
为了使该包正常工作,您还应该安装 DoctrineExtensions\Paginate
。
包和说明在 https://github.com/beberlei/DoctrineExtensions
使用 composer 安装
在您的 composer.json 中添加 IdeupSimplePaginatorBundle
"require": { "php": ">=5.3.3", "symfony/symfony": "2.1.*", . . . . . "ideup/simple-paginator-bundle":"*" }
现在下载并安装包
$ php composer.phar update ideup/simple-paginator-bundle
Composer 会将包安装到您的项目 vendor/ideup
目录。
如何在代码中包含 SimplePaginatorBundle
您应该将此存储库克隆到您的 Symfony 的 vendor/bundles
目录中,并将其添加到 autoload.php
文件中
<?php $loader->registerNamespaces(array( 'Symfony' => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'), ... 'Ideup' => __DIR__.'/../vendor/bundles', );
... 然后在您的 AppKernel.php
文件中
<?php public function registerBundles() { $bundles = array( ... new Ideup\SimplePaginatorBundle\IdeupSimplePaginatorBundle(), ); }
... 因此,您现在可以准备好使用 IdeupSimplePaginatorBundle 作为服务。
由于 Paginator::paginate()
方法需要一个 Query
对象来工作,因此您需要稍微修改您的实体存储库类
- 之前
<?php class User extends EntityRepository { public function findByMyCriteria() { $query = $this->_em->createQuery('...'); return $query->getResult(); } }
- 之后
<?php class User extends EntityRepository { public function findByMyCriteria() { return $this->findByMyCriteriaDQL()->getResult(); } public function findByMyCriteriaDQL() { $query = $this->_em->createQuery('...'); return $query; } }
在您的控制器中,您可以将分页器服务实例化。 SimplePaginatorBundle
足够智能,可以检测来自 Request
上下文的当前页面和每页最大项目数,因此您不需要编写更多样板代码!
- 之前
<?php class MyController extends Controller { public function listAction() { $paginator = $this->get('ideup.simple_paginator'); $users = $paginator->paginate($em->getRepository('MyBundle:User')->findByMyCriteriaDQL())->getResult(); $vars = array( 'users' => $users, 'paginator' => $paginator); return $this->render('MyBundle:User:list.html.twig', $vars); } }
请注意,变量 $users
仅包含 Doctrine 集合的已分页子集,并且您可以通过查询 $paginator
对象来获取有关分页过程的详细信息;例如,完整集合中有多少项目,我们在哪一页,最后一页是哪一页等。
- 之后
<?php class MyController extends Controller { public function listAction() { $paginator = $this->get('ideup.simple_paginator'); $users = $paginator->paginate($em->getRepository('MyBundle:User')->findByMyCriteriaDQL())->getResult(); $vars = array( 'users' => $users, ); return $this->render('MyBundle:User:list.html.twig', $vars); } }
请注意,现在除非您想获取有关分页过程的详细信息,否则不需要将 $paginator
变量传递到模板。
如何在视图中渲染分页器
- 之前
<ul id="paginate_elements"> {% if paginator.currentPage > 1 %} <li><a href="{{ path('my_controller_route', {'page': paginator.previousPage}) }}">previous</a></li> {% else %} <li class="left_disabled"><a href="#">previous</a></li> {% endif %} {% for page in paginator.minPageInRange..paginator.maxPageInRange %} {% if page == paginator.currentPage %} <li><a class="current" href="#">{{ page }}</a></li> {% else %} <li><a href="{{ path('my_controller_route', {'page': page}) }}">{{ page }}</a></li> {% endif %} {% endfor %} {% if paginator.currentPage < paginator.lastPage %} <li class="right"><a href="{{ path('my_controller_route', {'page': paginator.nextPage}) }}">next</a></li> {% else %} <li class="right_disabled">next</li> {% endif %} </ul>
- 之后
{{ simple_paginator_render('my_controller_route') }}
您可以根据以下方式自定义分页器视图
{{ simple_paginator_render('my_controller_route', null, { params }) }}
其中 params
可能是
-
routeParams
,控制器路由所需的自定义参数(默认:{}
) -
container_class
,应用于包装分页器的<ul>
元素的 CSS 类(默认:simple_paginator
) -
firstPageText
,显示在第一页链接上的文本(默认:first
) -
firstEnabledClass
,当存在第一页时应用于第一页链接的 CSS 类(默认:first
) -
firstDisabledClass
,当不存在第一页时应用于第一页文本的 CSS 类(默认:first_disabled
) -
previousPageText
,显示在上一页链接上的文本(默认:previous
) -
previousEnabledClass
,当存在上一页时应用于上一页链接的 CSS 类(默认:left
) -
previousDisabledClass
,当不存在上一页时应用于上一页文本的 CSS 类(默认:left_disabled
) -
currentClass
,应用于包装当前页链接的<li>
元素的 CSS 类(默认:current
) -
nextPageText
,显示在下一页链接上的文本(默认:next
) -
nextEnabledClass
,如果存在下一页,应用在下一页链接上的CSS类(默认:right
) -
nextDisabledClass
,当没有下一页时应用在下一页文本上的CSS类(默认:right_disabled
) -
lastPageText
,显示在最后一页链接上的文本(默认:last
) -
lastEnabledClass
,如果存在最后一页,应用在最后一页链接上的CSS类(默认:last
) -
lastDisabledClass
,当没有最后一页时应用在最后一页文本上的CSS类(默认:last_disabled
)
例如,如果您想自定义分页器视图以显示一个接收参数 id
的路由,并且您想更改容器类
{{ simple_paginator_render('my_controller_route', null, { 'routeParams' : {'id' : id}, 'container_class' : 'custom_simple_paginator_class' }) }}
如果您的需求超出了这个范围,您可以在自己的视图中进行自定义
{{ simple_paginator_render('my_controller_route', null, {....}, 'MyBundle:MyViewFolder:MyViewFile.html.twig') }}
要创建 MyBundle:MyViewFolder:MyViewFile.html.twig
,请从包含在bundle中的默认模板 Resources\views\Paginator\simple-paginator-list-view.html.twig
进行复制,并在自己的Bundle中进行自定义。
例如,如果您只想显示分页器数字,您的模板如下所示
MyBundle\Resources\views\MyViewFolder\MyViewFile.html.twig
:
<ul class="{{ container_class }}"> <!-- NUMBERS --> {% for page in minPage..maxPage %} {% if page == currentPage %} <li class="{{ currentClass }}"> {{ page }} </li> {% else %} {% set rParams = {'page': page, 'paginatorId': id} | merge(routeParams) %} <li> <a href="{{ path(route, rParams) }}">{{ page }}</a> </li> {% endif %} {% endfor %} </ul>
如何在单个视图中包含多个分页器
SimplePaginatorBundle
支持多个分页器,您应该在控制器和视图调用中指定一个id。注意,您可以修改每个分页器的特定属性。
- 之前
<?php class MyController extends Controller { public function listAction() { $paginator = $this->get('ideup.simple_paginator'); $paginator->setItemsPerPage(25, 'users'); $users = $paginator->paginate($em->getRepository('MyBundle:User')->findByMyCriteriaDQL(), 'users')->getResult(); $paginator->setItemsPerPage(5, 'groups'); $groups = $paginator->paginate($em->getRepository('MyBundle:User')->findByMyCriteriaDQL(), 'groups')->getResult(); $vars = array( 'users' => $users, 'groups' => $groups, 'paginator' => $paginator); return $this->render('MyBundle:User:list.html.twig', $vars); } }
在视图中,您还需要指定分页器id
<ul id="paginate_elements"> {% if paginator.currentPage('users') > 1 %} <li><a href="{{ path('my_controller_route', {'page': paginator.previousPage('users'), 'paginatorId': 'users'}) }}">previous</a></li> {% else %} <li class="left_disabled"><a href="#">previous</a></li> {% endif %} {% for page in paginator.minPageInRange('users')..paginator.maxPageInRange('users') %} {% if page == paginator.currentPage('users') %} <li><a class="current" href="#">{{ page }}</a></li> {% else %} <li><a href="{{ path('my_controller_route', {'page': page, 'paginatorId': 'users'}) }}">{{ page }}</a></li> {% endif %} {% endfor %} {% if paginator.currentPage('users') < paginator.lastPage('users') %} <li class="right"><a href="{{ path('my_controller_route', {'page': paginator.nextPage('users'), 'paginatorId': 'users'}) }}">next</a></li> {% else %} <li class="right_disabled">next</li> {% endif %} </ul>
- 之后
<?php class MyController extends Controller { public function listAction() { $paginator = $this->get('ideup.simple_paginator'); $users = $paginator ->setItemsPerPage(25, 'users'); ->paginate($em->getRepository('MyBundle:User')->findByMyCriteriaDQL(), 'users') ->getResult() ; // Now also we can paginate arrays $allGroups = array('group1', 'group2', 'group3', 'group4', 'group5'); $groups = $paginator ->setItemsPerPage(3, 'groups') ->paginate($allGroups, 'groups') ->getResult() ; $vars = array( 'users' => $users, 'groups' => $groups, ); return $this->render('MyBundle:User:list.html.twig', $vars); } }
在视图中,您还需要指定分页器id
{{ simple_paginator_render('my_controller_route', 'users', {....}) }} {{ simple_paginator_render('my_controller_route', 'groups', {....}) }}
变更日志
v0.91
-
添加了对数组分页的支持。
-
更改了设置方法。现在这些方法返回分页对象。
-
添加了对twig的支持。
v0.9
-
添加了对DoctrineExtensions\Paginate的依赖,以处理正确的分页(请参阅https://github.com/beberlei/DoctrineExtensions)
-
添加了对一次分页多个列表的支持
-
将Paginador类的名称更改为Paginator,这是services.xml定义我们的服务的方式,通过将实现分页的类作为参数传递并设置服务id
<parameters> <parameter key="simple_paginador.class">Ideup\SimplePaginatorBundle\Paginator\Paginator</parameter> </parameters> <services> <service id="ideup.simple_paginator" class="%simple_paginator.class%"> <argument type="service" id="request" strict="false" /> </service> </services>