vkr/pager-bundle

适用于 Symfony2/3 的无视图分页组件

1.0.2 2017-03-23 22:44 UTC

This package is auto-updated.

Last update: 2024-09-20 22:18:00 UTC


README

这是一个简单的 Symfony 分页组件。与其他分页组件不同,它完全无视图依赖,采用 SOA 风格编写 - 你先写自己的服务,然后在控制器中获取这个服务和分页服务,然后获取所有需要的分页数据,以供后续在视图层使用。

此组件依赖于 VKRSettingsBundle,请在使用之前阅读其文档。

安装

除了在 Composer 和 AppKernel.php 中启用组件外,几乎没有什么需要做的。但是,如果你想要使用基于设置的每页记录数,你需要为每个调用的分页实例创建一个设置。阅读 VKRSettingsBundle 文档以获取创建设置的详细信息。

使用

解析器

有一个名为 getPagerProps() 的公共方法。为了使用它,你需要编写一个实现了 VKR\PagerBundle\Interfaces\PageableInterface 的解析器。该接口有一个名为 getNumberOfRecords() 的方法,应该返回可以使用分页显示的总记录数。以下是一个解析器类的示例。

class MyParser implements VKR\PagerBundle\Interfaces\PageableInterface
{
    private $em;

    public function __construct(Doctrine\ORM\EntityManager $em)
    {
        $this->em = $em;
    }

    public function getNumberOfRecords(array $additionalArguments = [])
    {
        $allRecords = $this->em->getRepository('AppBundle:MyEntity')->findAll();
        if (!$allRecords) {
            return 0;
        }
        return sizeof($allRecords);
    }
}

请注意,这个查询在大量数据上可能非常慢,因此请尝试使用聚合函数和索引。

使用额外的参数

如果你的 getNumberOfRecords() 实现需要参数,你有两种选择。你可以将其作为类属性传递,或者使用可选的 $additionalArguments 数组,该数组作为控制器中 getPagerProps() 的第四个参数传递 - 这种方式推荐用于不需要查询结果在其他地方,并且将你的解析器类注册为服务的情况。

解析器

public function getNumberOfRecords(array $additionalArguments = [])
{
    $query = "SELECT a FROM table1 a WHERE a.id IN ($additionalArguments['ids'])";
    ...
}

控制器

public function myControllerAction()
{
    ...
    $additionalArguments = [
        'ids' => [1,2,3]
    ];
    $pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPage, $additionalArguments);
    ...
}

控制器

将以下内容添加到你的控制器中

$parser = $this->get('my_parser_service');
$pager = $this->get('vkr_pager.pager');
$recordsPerPage = 20;
$pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPage);

如果你想要禁用分页并显示所有结果在单页上,使用

$recordsPerPage = -1;

使用 getPagerProps() 的另一种方法是定义一个设置以简化 $recordsPerPage 的自定义。如果你有这样一个设置,你可以将其用作第三个参数

$recordsPerPageSettingName = 'records_per_page';
$pagerProps = $pager->getPagerProps($parser, $request->getRequestUri(), $recordsPerPageSettingName);

生成的 PagerProps 对象是一个内存中的实体,具有以下属性

  • $currentPage - 当前页码,对应于 page 查询字符串参数。默认为 1。
  • $uriWithoutPage - 当前页 URI,除了 page 之外的所有查询字符串参数。它还以 ? 或 & 结尾。
  • $recordsPerPage - 每页可以显示的最大记录数。
  • $firstResult - 如果你有包含 N 条记录的零索引数组,则此键指示需要显示在当前页上的记录的第一个索引。 $firstResult$recordsPerPage 大约对应于 SQL LIMIT 子句的两个参数。
  • $numberOfPages - 选择的总页数。

这些属性可以通过标准获取器(如 getCurrentPage() 等)访问。

请注意,这里实际上没有记录,因为此组件不会进行任何数据库查询。你需要编写一个类,将此数据转换为查询。

视图

你需要手动将生成的数组传递到视图中。此组件不帮助你显示内容,因此它可以与任何模板技术一起使用。在 Resources/views/pager_macro.html.twig 中有一个小示例,说明如何在 Twig 中使用它,它包括一些 Twitter Bootstrap 类。

如果您使用 Twig,您还可以使用包含在包中的自定义过滤器 page()。它会将页面属性追加到查询字符串。

<a href="{{ pagerProps.getUriWithoutPage() | page(page_number) }}">

API

void Pager::__construct(VKR\SettingsBundle\SettingsRetriever $settingsRetriever)

VKR\PagerBundle\Entity\Perishable\PagerProps Pager::getPagerProps(VKR\PagerBundle\Interfaces\PageableInterface $parser, string $requestUri, int|string $recordsPerPageData, array $additionalArguments = [])

如果第三个参数是字符串,则解释为设置名称,如果是整数,则认为是每页实际记录数。

int PageableInterface::getNumberOfRecords(array $additionalArguments = [])

获取在此视图中可能显示的总记录数。

此外,由于简洁起见,省略了 VKR\PagerBundle\Entity\Perishable\PagerProps 实体上的获取器和设置器。