ttskch / pagerfanta-bundle
此包已被弃用,不再维护。未建议替代包。
使用 Symfony 和 Pagerfanta 最为简单和可定制的方案
1.1.1
2020-01-31 05:27 UTC
Requires
- php: ^7.1.3
- cakephp/utility: ^3.5
- pagerfanta/pagerfanta: ^2.1
- symfony/framework-bundle: ^4.0
- symfony/twig-bundle: ^4.0
Requires (Dev)
- phpunit/phpunit: ^7.5
- symfony/browser-kit: ^4.0
- symfony/form: ^4.0
- symfony/phpunit-bridge: ^4.0
- symfony/yaml: ^4.0
This package is auto-updated.
Last update: 2020-08-24 15:52:40 UTC
README
该包今天已不再维护。请使用 TtskchPaginatorBundle 代替。
TtskchPagerfantaBundle
使用 Symfony 和 Pagerfanta 最为简单和可定制的方案。
特性
与 WhiteOctoberPagerfantaBundle 相比的优势
- 非常轻量级
- 可自定义 twig-templated views
- 排序链接功能
- 易于与 搜索表单 一起使用
- 预设 bootstrap4 主题
演示
您可以在 演示分支 上轻松尝试以下演示应用程序。
要求
- PHP ^7.1.3
- Symfony ^4.0
安装
$ composer require ttskch/pagerfanta-bundle
// config/bundles.php return [ // ... Ttskch\PagerfantaBundle\TtskchPagerfantaBundle::class => ['all' => true], ];
使用
// FooController.php public function index(FooRepository $fooRepository, Context $context) { $context->initialize('id'); $queryBuilder = $fooRepository ->createQueryBuilder('f') ->orderBy(sprintf('f.%s', $context->criteria->sort), $context->criteria->direction) ; $adapter = new DoctrineORMAdapter($queryBuilder); $pagerfanta = new Pagerfanta($adapter); $pagerfanta ->setMaxPerPage($context->criteria->limit) ->setCurrentPage($context->criteria->page) ; return $this->render('index.html.twig', [ 'pagerfanta' => $pagerfanta, ]); }
{# index.html.twig #} {% set keys = ['id', 'name', 'email'] %} <table> <thead> <tr> {% for key in keys %} <th>{{ ttskch_pagerfanta_sortable(key) }}</th> {% endfor %} </tr> </thead> <tbody> {% for item in pagerfanta.getCurrentPageResults() %} <tr> {% for key in keys %} <td>{{ attribute(item, key) }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table> {{ ttskch_pagerfanta_pager(pagerfanta) }}
查看 src/Twig/PagerfantaExtension.php 了解有关 twig 函数的更多信息。
使用连接实体的属性进行排序
// FooController.php // ... $queryBuilder = $fooRepository ->createQueryBuilder('f') ->leftJoin('f.parent', 'p') ; if (preg_match('/^parent\.(.+)$/', $context->criteria->sort, $m)) { $sort = sprintf('p.%s', $m[1]); } else { $sort = sprintf('f.%s', $context->criteria->sort); } $queryBuilder->orderBy($sort, $context->criteria->direction); // ...
{# index.html.twig #} {# ... #} <th>{{ ttskch_pagerfanta_sortable(id) }}</th> <th>{{ ttskch_pagerfanta_sortable(name) }}</th> <th>{{ ttskch_pagerfanta_sortable(email) }}</th> <th>{{ ttskch_pagerfanta_sortable(parent.id) }}</th> {# ... #}
配置
$ bin/console config:dump-reference ttskch_pagerfanta # Default configuration for extension with alias: "ttskch_pagerfanta" ttskch_pagerfanta: page: name: page range: 5 limit: name: limit default: 10 sort: key: name: sort direction: name: direction # "asc" or "desc" default: asc template: pager: '@TtskchPagerfanta/pager/default.html.twig' sortable: '@TtskchPagerfanta/sortable/default.html.twig'
自定义视图
使用预设 bootstrap4 主题
只需按如下方式配置包。
# config/packages/ttskch_pagerfanta.yaml ttskch_pagerfanta: template: pager: '@TtskchPagerfanta/pager/bootstrap4.html.twig'
使用您自己的主题
创建您自己的模板并按如下方式配置包。
# config/packages/ttskch_pagerfanta.yaml ttskch_pagerfanta: template: pager: 'your/own/pager.html.twig' sortable: 'your/own/sortable.html.twig'
与搜索表单一起使用
// FooCriteria.php use Ttskch\PagerfantaBundle\Entity\Criteria; class FooCriteria extends Criteria { public $query; }
// FooSearchType.php use Symfony\Component\Form\Extension\Core\Type\SearchType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Ttskch\PagerfantaBundle\Form\CriteriaType; class FooSearchType extends CriteriaType { public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); $builder ->add('query', SearchType::class) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => FooCriteria::class, // if your app depends on symfony/security-csrf adding below is recommended // 'csrf_protection' => false, ]); } }
// FooRepository.php public function createQueryBuilderFromCriteria(FooCriteria $criteria) { return $this->createQueryBuilder('f') ->where('f.name like :query') ->orWhere('f.email like :query') ->setParameter('query', sprintf('%%%s%%', str_replace('%', '\%', $criteria->query))) ->orderBy(sprintf('f.%s', $criteria->sort), $criteria->direction) ; }
// FooController.php public function index(FooRepository $fooRepository, Context $context) { $context->initialize('id', FooCriteria::class, FooSearchType::class); $queryBuilder = $fooRepository->createQueryBuilderFromCriteria($context->criteria); $adapter = new DoctrineORMAdapter($queryBuilder); $pagerfanta = new Pagerfanta($adapter); $pagerfanta ->setMaxPerPage($context->criteria->limit) ->setCurrentPage($context->criteria->page) ; return $this->render('index.html.twig', [ 'form' => $context->form->createView(), 'pagerfanta' => $pagerfanta, ]); }
{# index.html.twig #} {{ form(form, {action: path('index'), method: 'get'}) }} {% set keys = ['id', 'name', 'email'] %} <table> <thead> <tr> {% for key in keys %} <th>{{ ttskch_pagerfanta_sortable(key) }}</th> {% endfor %} </tr> </thead> <tbody> {% for item in pagerfanta.getCurrentPageResults() %} <tr> {% for key in keys %} <td>{{ attribute(item, key) }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table> {{ ttskch_pagerfanta_pager(pagerfanta) }}