ideup/simple-paginator-bundle

此包最新版本(dev-master)没有提供许可信息。

Symfony 2 分页器包。

dev-master 2015-03-18 10:17 UTC

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>