Представляю Вашему вниманию бандл для 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 %} | 
Более подробно об использовании здесь.





