nadialabs / paginator-bundle
又一个分页器包
Requires
- doctrine/collections: ^1.0
- symfony/config: ^3.4|^4.0
- symfony/dependency-injection: ^3.4|^4.0
- symfony/event-dispatcher: ^3.4|^4.0
- symfony/form: ^3.4|^4.0
- symfony/http-foundation: ^3.4|^4.0
- symfony/http-kernel: ^3.4|^4.0
- symfony/options-resolver: ^3.4|^4.0
- symfony/routing: ^3.4|^4.0
- twig/twig: ^2.0|^3.0
Requires (Dev)
- doctrine/dbal: ^2.8
- doctrine/orm: ^2.6
Suggests
- doctrine/dbal: ^2.8
- doctrine/orm: ^2.6
README
NadiaPaginatorBundle 可帮助您快速构建分页 UI。您可以使用 Symfony Form 组件来设计筛选和搜索 UI,并使用 Form 简单地验证输入参数。
安装
使用 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
示例实体: Movie
,People
获取分页实例的过程如下
- 使用
PaginatorTypeContainer
生成一个PaginatorType实例。 - 使用
PaginatorFactory
生成一个带有PaginatorType实例的分页实例。 - 创建一个查询实例(在这个例子中是一个Doctrine ORM QueryBuilder实例)
- 使用分页器进行分页,并获取分页实例
- 使用分页实例渲染视图
// 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') }}