bertramakers/twig-pagination

Twig 分页扩展

此包的官方仓库似乎已消失,因此该包已被冻结。

v0.1-alpha 2015-11-22 19:14 UTC

This package is auto-updated.

Last update: 2019-10-11 15:02:28 UTC


README

Build Status Coverage Status

简介

此扩展可以帮助您根据总页数和一些可配置的逻辑确定在给定页面上显示哪些分页链接。

它不会为您生成任何HTML,而只是提供一个要显示为链接的页码数组,以及在必要时省略的页码块的位置。

例如

  • 总页数: 50
  • 当前页: 30
  • 省略页指示器: -1
  • 行为: FixedLength, 11
  • 结果: [1, 2, 3, -1, 29, 30, 31, -1, 48, 49, 50];

然后您可以根据自己的需要使用Twig模板来显示这些数据。(见 在Twig中的使用

请注意,此扩展 不能帮助您加载或过滤要分页的数据。它只是帮助您决定在给定页面上显示哪些指向其他页面的链接。

安装

使用 Composer

composer require bertramakers/twig-pagination

设置

在设置PaginationExtension时,您可以配置任意多的分页函数。

每个函数都可以有一个自定义名称,以及您选择的行为。目前仅提供的操作是FixedLength,但您可以通过实现PaginationBehaviourInterface轻松添加自己的行为。

纯PHP

文档:http://twig.sensiolabs.org/doc/api.html

use DevotedCode\Twig\Pagination\PaginationExtension;
use DevotedCode\Twig\Pagination\Behaviour\FixedLength;
use \Twig_Environment;
use \Twig_Loader_Filesystem;

$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader);

// Configure two fixed length pagination functions, a small one and a wide one.
// The names are completely up to you to choose.
$paginationExtension = (new PaginationExtension())
    ->withFunction('small', new FixedLength(7))
    ->withFunction('wide', new FixedLength(21));
    
$twig->addExtension($paginationExtension);

Silex

文档:http://silex.sensiolabs.org/doc/providers/twig.html

use DevotedCode\Twig\Pagination\PaginationExtension;
use DevotedCode\Twig\Pagination\Behaviour\FixedLength;
use Silex\Provider\TwigServiceProvider;

$app->register(new TwigServiceProvider(), array(
    'twig.path' => '/path/to/templates',
));

$app['twig'] = $app->share(
    $app->extend(
        'twig', 
        function($twig, $app) {
            // Configure two fixed length pagination functions, a small one and
            // a wide one. The names are completely up to you to choose.
            $paginationExtension = (new PaginationExtension())
                ->withFunction('small', new FixedLength(7))
                ->withFunction('wide', new FixedLength(21));
        
            $twig->addExtension($paginationExtension)
        
            return $twig;
        }
    )
);

在Twig中的使用

在上面的设置部分中,我们设置了两个分页函数:smallwide。这些函数现在在Twig中作为 small_paginationwide_pagination 可用。

每个分页函数都接受以下参数:

  • 总页数
  • 当前页
  • 省略页指示器(默认为-1

重要! 当前页的值使用常规编号,从1开始,因此如果您使用基于0的编号,请确保将当前页的值加1。

示例

标准使用方法:

{% set totalPages = 20 %}
{% set currentPage = 8 %}
{% set paginationData = wide_pagination(totalPages, currentPage) %}

自定义省略页指示器:

{% set paginationData = small_pagination(totalPages, currentPage, '...') %}

遍历数据:

这个模板只是一个简单的示例,您可以从它开始,或者根据您的需求从头编写。

<ul class="pagination">

{% if currentPage > 1 %}
    <li><a href="...">Previous</a></li>
{% else %}
    <li class="disabled">Previous</li>
{% endif %}

{% for paginationItem in paginationData %}
    {% if paginationItem == -1 %} {# The value you chose for omitted chunks #}
        <li class="disabled">...</li>
    {% elseif paginationItem == currentPage %}
        <li class="active"><a href="...">{{ paginationItem }}</a></li>
    {% else %}
        <li><a href="...">{{ paginationItem }}</a></li>
    {% endif %}
{% endfor %}

{% if currentPage < totalPages %}
    <li><a href="...">Next</a></li>
{% else %}
    <li class="disabled">Next</li>
{% endif %}

</ul>

在Twig之外的使用

您可以在Twig之外轻松使用显示逻辑。

use DevotedCode\Twig\Pagination\Behaviour\FixedLength;

$behaviour = new FixedLength(21);

$totalPages = 50;
$currentPage = 8;
$omittedPagesIndicator = -1; // Optional, defaults to -1.

$paginationData = $behaviour->getPaginationData(
    $totalPages, 
    $currentPage, 
    $omittedPagesIndicator
);

之后,您只需使用您选择的模板语言来渲染分页链接。

常见问题解答(FAQ)

为什么不把所有内容都放在一个Twig模板中呢?

使用此扩展,您可以保持确定显示哪些分页链接的逻辑以及实际链接列表的标记分离。这使得您可以在应用程序中重用模板,甚至在显示链接逻辑不同的地方也能使用。这还使得测试实际显示逻辑变得容易得多。

您甚至可以在Twig之外使用行为类,并使用它们在HTML之外渲染分页链接。

您能添加一个基于0的编号选项吗?

此扩展的目的是决定向最终用户显示哪些页面编号,因此它始终从1开始计数。

然而,如果您想在URL中的页面参数使用基于0的编号,您可以轻松地这样做,只需从您获得的每个页面编号中减去1。

因此,您仍然会打印“1”作为第一页,但减去1,并使用“0”作为第一页URL的页面参数。

上一页/下一页链接在哪里?

您应该在模板中包含这些链接,因为它们对显示哪些页面编号以及排除哪些页面编号没有影响。请参见上面的模板示例,了解如何添加上一页和下一页链接。

我如何知道哪个页面链接应该禁用当前页面?

您应该简单地遍历您获得的页面编号,如果给定的页面编号等于您在生成分页数据时使用的当前页面值,那么您可以根据需要禁用该当前页面。

贡献

使用./vendor/bin/phing test运行完整的测试(lint检查、编码标准检查和单元测试)。

使用./vendor/bin/phpunit --coverage-html build检查代码覆盖率,并打开./build/index.html

为了在提交到git时自动运行完整的测试,使用./vendor/bin/phing githooks安装包含的git hooks钩子。