ttskch/pagerfanta-bundle

此包已被弃用,不再维护。未建议替代包。

使用 Symfony 和 Pagerfanta 最为简单和可定制的方案

安装: 466

依赖: 0

建议者: 0

安全: 0

星标: 3

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

1.1.1 2020-01-31 05:27 UTC

This package is auto-updated.

Last update: 2020-08-24 15:52:40 UTC


README

该包今天已不再维护。请使用 TtskchPaginatorBundle 代替。

TtskchPagerfantaBundle

Travis (.com) Latest Stable Version Total Downloads

使用 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) }}