Представляю Вашему вниманию бандл для Symfony2 Standard Edition, разработанный для облегчения работы с большими наборами данных таблицы. SPS — это аббревиатура для поиска, разбиения на страницы, сортировки, то есть пакет может применять фильтры, обеспечивать пагинацию, сортировку данных.
Бандл реализуется как служба, которая получает Doctrine\DBAL\Query\QueryBuilder или Doctrine\ORM\QueryBuilder и возвращает форму фильтров и массива с данными для использования в вашем уровне представления.
Демонстрацию можно посмотреть здесь, исходный код здесь.
Установка
В консоли:
1 |
$ composer require zk2/sps-bundle |
Включаем бандл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new Zk2\SpsBundle\Zk2SpsBundle(), ); // ... } // ... } |
Обновляем активы:
1 |
$ php bin/console assets:install --symlink |
Использование
В контроллере AppBundle:DefaultController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php // src/AppBundle/Controller/DefaultController.php class DefaultController extends Controller { public function indexAction() { $sps = $this->get('zk2.sps'); if ($url = $sps->isReset()) { return $this->redirect($url); } $qb = $this->getDoctrine()->getManager()->createQueryBuilder() ->select('country, continent') ->from('AppBundle:Country', 'country') ->leftJoin('country.continent', 'continent'); $sps ->addColumn('country.name', 'string', [ 'link' => ['route' => 'country_view', 'route_params' => ['id' => 'id']] ]) ->addColumn('country.code', 'string', ['sort' => false]) ->addColumn('continent.name', 'string', ['label' => 'Continent']) ->addColumn('country.surfaceArea', 'numeric', ['label' => 'Surface area']) ->addColumn('country.lastDate', 'datetime', ['label' => 'Date']); $sps ->addFilter('country.name', 'string', ['quantity' => 3]) ->addFilter('region.id', 'choice', [ 'label' => 'Region', 'choices' => $this->getDoctrine()->getManager()->createQuery( "SELECT i.id,i.name FROM AppBundle:Region i ORDER BY i.name" )->getResult(), ]) ->addFilter('country.lastDate', 'dateRange'); $sps ->setQueryBuilder($qb) ->setDefaultSort(['country.name' => 'asc']); $result = $sps->buildResult(); //['filter' => ..., 'paginator' => ...] return $this->render('default/country.html.twig', $result); } } |
И шаблон default/country.html.twig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{% extends '......html.twig' %} {% block stylesheets %} <link href="{{ asset('bundles/zk2sps/css/bootstrap.min.css') }}" rel="stylesheet" media="screen"> <link href="{{ asset('bundles/zk2sps/datepicker/css/bootstrap-datepicker3.standalone.min.css') }}" rel="stylesheet" /> <link href="{{ asset('bundles/zk2sps/css/sps-style.css') }}" rel="stylesheet"/> {% endblock %} {% block body %} {{ sps_filter_form(filter) }} {{ sps_filter_table(paginator) }} {% endblock %} {% block javascripts %} <script src="{{ asset('bundles/zk2sps/js/jquery.min.js') }}"></script> <script src="{{ asset('bundles/zk2sps/js/bootstrap.min.js') }}"></script> <script src="{{ asset('bundles/zk2sps/datepicker/js/bootstrap-datepicker.min.js') }}"></script> <script src="{{ asset('bundles/zk2sps/js/sps.js') }}"></script> {% endblock %} |
Более подробно об использовании здесь.