nadialabs/paginator-bundle

又一个分页器包

安装次数: 2,866

依赖: 0

推荐者: 0

安全: 0

星标: 2

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v1.0.24 2020-10-07 06:58 UTC

README

NadiaPaginatorBundle 可帮助您快速构建分页 UI。您可以使用 Symfony Form 组件来设计筛选和搜索 UI,并使用 Form 简单地验证输入参数。

Example Image

安装

使用 composer 安装,运行

composer require nadialabs/paginator-bundle

将包注册到 AppKernel

// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Nadia\Bundle\PaginatorBundle\NadiaPaginatorBundle(),
        // ...
    );
}

包配置

nadia_paginator:
    default_options:
        input_key_class: Nadia\Bundle\PaginatorBundle\Input\InputKeys
        default_page_size: 10
        default_page_range: 8
        session_enabled: false
        default_translation_domain: null
    templates:
        pages: '@NadiaPaginator/templates/bootstrap4/pages.html.twig'
        searches: '@NadiaPaginator/templates/bootstrap4/searches.html.twig'
        filters: '@NadiaPaginator/templates/bootstrap4/filters.html.twig'
        sorts: '@NadiaPaginator/templates/bootstrap4/sorts.html.twig'
        sort_link: '@NadiaPaginator/templates/bootstrap4/sort_link.html.twig'
        page_sizes: '@NadiaPaginator/templates/bootstrap4/page_sizes.html.twig'
  • default_options
    • input_key_class: 定义 HTTP 请求参数键的类。
    • default_page_size: 默认页面大小
    • default_page_range: 默认页面范围(控制页面链接数量)
    • session_enabled: 启用会话支持,将输入数据存储在会话中。启用时,您可以使用不带查询字符串的干净 URL。否则,筛选、搜索、排序、页面大小和页面参数将成为 URL 查询字符串的一部分,或通过 POST 请求体传输。
    • default_translation_domain: 每个 Form 的默认 translation-domain
  • templates
    • pages: 渲染页面的模板
    • searches: 渲染搜索块的模板
    • filters: 渲染筛选块的模板
    • sorts: 渲染排序选择块的模板
    • sort_link: 渲染排序链接的模板
    • page_sizes: 渲染页面大小选择块的模板

创建 PaginatorType 类

定义分页器配置。

示例类: AppBundle\Paginator\Movies\PaginatorType

您可以实现这些方法来定义 PaginatorType 类

buildSearch

使用 SearchBuilder 设置带有 Symfony FormType 风格的搜索表单元素。

buildFilter

使用 FilterBuilder 设置带有 Symfony FormType 风格的筛选表单元素。

buildSort

使用 SortBuilder 设置排序方法。

buildPageSize

使用 PageSizeBuilder 设置页面大小列表。

getFormOptions

设置分页器表单选项,返回包含表单选项的数组。

configureOptions

设置分页器选项,您可以为将额外数据注入到 PaginatorType 定义自定义选项。PaginatorType 将在这些方法中使用这些选项:`buildSearch`、`buildFilter`、`buildSort`、`buildPageSize`、`getFormOptions`。

创建 SearchQueryCompiler 类

定义一个查询编译器来构建自定义搜索条件。

Doctrine QueryBuilder 的示例类: AppBundle\Paginator\Movies\FilterQueryCompiler

创建 FilterQueryCompiler 类

定义一个查询编译器来构建自定义筛选条件。

Doctrine QueryBuilder 的示例类: AppBundle\Paginator\Movies\FilterQueryCompiler

使用 PaginatorType 创建 Pagination 实例

示例控制器: MovieController
示例实体: MoviePeople

获取分页实例的过程如下

  1. 使用 PaginatorTypeContainer 生成一个PaginatorType实例。
  2. 使用 PaginatorFactory 生成一个带有PaginatorType实例的分页实例。
  3. 创建一个查询实例(在这个例子中是一个Doctrine ORM QueryBuilder实例)
  4. 使用分页器进行分页,并获取分页实例
  5. 使用分页实例渲染视图
// Example controller action

$options = [
    'movieCompanies' => [
        'Warner Bros.',
        'Sony Pictures',
        'Walt Disney',
        'Universal Pictures',
        '20th Century Fox',
        'Paramount Pictures',
        'Lionsgate Films',
        'The Weinstein Company',
        'DreamWorks Pictures',
    ],
];
$paginator = $this->get('nadia_paginator.paginator_factory')->create(PaginatorType::class, $options);

$qb = $this->getDoctrine()->getRepository(Movie::class)
    ->createQueryBuilder('movie')
    ->select(['movie', 'director'])
    ->leftJoin('movie.director', 'director')
;
/** @var Movie[]|Collection|Pagination $pagination */
$pagination = $paginator->paginate($qb);

使用Twig渲染HTML

您可以使用此模板轻松渲染列表页面 @NadiaPaginator/templates/bootstrap4/pagination.html.twig
使用twig的 embed 标签覆盖 tableContent 块,并将您的表格内容放入 tableContent 块。

示例twig文件: index.html.twig

// Render view
$this->render('@App/Movie/index.html.twig', ['pagination' => $pagination]);
{# Example view file #}

{% use '@NadiaPaginator/templates/bootstrap4/pagination.html.twig' %}

<div class="container-fluid">
    {{ block('pagination') }}
</div>

{% block tableContent %}
    <table class="table table-bordered table-striped">
        <thead>
        <tr>
            <th>
                {{ nadia_paginator_sort_link(pagination, 'title', 'movie.title', 'ASC') }}
            </th>
            <th>
                {{ nadia_paginator_sort_link(pagination, 'description', 'movie.description', 'ASC') }}
            </th>
            <th>
                {{ nadia_paginator_sort_link(pagination, 'releasedAt', 'movie.releasedAt', 'DESC') }}
            </th>
            <th>Director</th>
            <th>Company</th>
        </tr>
        </thead>
        <tbody>
        {% for movie in pagination %}
            <tr>
                <td>{{ movie.title }}</td>
                <td>{{ movie.description }}</td>
                <td>{{ movie.releasedAt|date('Y-m-d') }}</td>
                <td>{{ movie.director.name }}</td>
                <td>{{ movie.company }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
{% endblock tableContent %}

在Twig中渲染搜索块

使用 nadia_paginator_searches 方法在Twig模板中渲染搜索块。

{{ nadia_paginator_searches(pagination, {attributes: {class: 'col-md-6 col-xl-4 search'}}) }}

在Twig中渲染筛选块

使用 nadia_paginator_filters 方法在Twig模板中渲染筛选块。

{{ nadia_paginator_filters(pagination, {attributes: {class: 'col-md-4 col-xl-3 mb-1 filter'}}) }}

在Twig中渲染排序块

使用 nadia_paginator_sorts 方法在Twig模板中渲染排序块。

{{ nadia_paginator_sorts(pagination) }}

在Twig中渲染页面大小块

使用 nadia_paginator_page_sizes 方法在Twig模板中渲染页面大小块。

{{ nadia_paginator_page_sizes(pagination) }}

在Twig中渲染排序链接

{{ nadia_paginator_sort_link(pagination, 'title', 'movie.title', 'ASC') }}