DataGridBundle: построение таблиц данных в Symfony 2.1

автор Alexey Romanenko

5 Фев 2013

Недавно для очередного проекта на основе фреймворка Symfony 2 нам понадобился инструмент построения таблиц данных (grids) с возможностью сортировки, фильтрации и экспорта данных. Мы обратились к сервису Packagist, репозиторию пакетов Composer, где можно найти несколько удобных гридов. Были найдены несколько решений, но либо у них не оказывалось необходимого функционала, либо документации, или возникали проблемы при работе с фильтрами. Максимально нашим требованиям удовлетворял DataGridBundle.

В статье я расскажу, как установить и настроить DataGridBundle в Symfony 2.1, а также приведу один рабочий пример.

Итак, возможности DataGridBundle:

  • Поддержка ресурсов ORM, ODM и Vector;
  • Поддержка сортировки и фильтрации данных;
  • Автоматический выбор типа данных;
  • Экспорт данных CSV, Excel, PDF, XML, JSON, HTML и др.;
  • Возможность написания действий для строк и для сущности (entity) в целом;
  • Постраничный вывод данных;
  • Поддержка нескольких гридов (grid) на одной странице;
  • Изменение шаблонов (только средствами Twig);
  • Мультиязычность.

Применяем CSS-стили, и таблица выглядит так:

Пример таблицы я взял с сайта github.com — портала для размещения ресурсов и совместной разработки. Там же можно найти необходимую документацию по DataGridBundle, скриншоты таблиц и сами файлы пакета.

Итак, перейдем непосредственно к установке:

  • Добавляем в файл в секцию require composer.json следующие строки
[DataGridBundle]
       git=git://github.com/Abhoryo/APYDataGridBundle.git
       target=bundles/APY/DataGridBundle
  • Обновляем бандлы через команду
php bin/vendors install
  • Добавляем пространство имен в autoload.php:

              <?php
               // app/autoload.php

               $loader->registerNamespaces(array(
               // ...
               'APY' => __DIR__.'/../vendor/bundles',
                ));
  • Включаем этот бандл в AppKernel.php

                <?php
               // app/AppKernel.php

                public function registerBundles()
                {
                 $bundles = array(
                 // ...
                 new APY\DataGridBundle\APYDataGridBundle(),
                 );
                }

Так как вся работа происходит в методе

 $grid->getGridResponse()

то, если таблица не отображается или пишет, что данных нет, необходимо проверить свой код на наличие вызова.

Переходим к созданию грида и для начала рассмотрим простейший пример.

Контроллер:

$data = array(
   array(
       'name' => 'Alexey',
       'login' => 'alexey',
       'age' => 25,
       'password' => 'qwerty',
       'salt' => 'ytrewq',
       'boolean' => 1,
   ),
   array(
       'name' => 'Alexey1',
       'login' => 'alexey1',
       'age' => 25,
       'password' => 'qwerty1',
       'salt' => 'ytrewq1',
       'boolean' => 1,
   ),
   array(
       'name' => 'Alexey2',
       'login' => 'alexey2',
       'age' => 25,
       'password' => 'qwerty2',
       'salt' => 'ytrewq2',
       'boolean' => 0,
   ),
);

   $source = new Vector($data);

   /** @var $grid \APY\DataGridBundle\Grid\Grid */
   $grid = $this->get('grid');

   $grid->setSource($source);

   /* @var $nameColumn \APY\DataGridBundle\Grid\Column\Column */
   $nameColumn = $grid->getColumn('name');
   $nameColumn->setFilterType('select')->setSelectFrom('query');

   return $grid->getGridResponse();

В описанном выше примере мы создаем грид из массива, а затем для колонки «Name» выставляем фильтр типа «Select».

Напомним, что можно использовать как внутренний фильтр, установленный по умолчанию, так и внешний.

Чтобы показать внешний фильтр, нужно прописать:

{{ grid_search(grid) }}
{{ grid(grid, _self) }}

Чтобы скрыть фильтр из грида:

{% block grid_filters %}{% endblock grid_filters%}

Будьте внимательны, когда используете _self внутри шаблонов. Как-то мы столкнулись с проблемой, при которой нельзя было получить доступ к переменным внутри шаблона, хотя функция {{ debug }} показывала, что переменная существует и определена. Чтобы избежать этого, мы советуем вынести шаблон в отдельный файл и впоследствии использовать именно его.

Таковы основные методы работы с DataGridBundle в веб-приложениях, написанных на фреймворке Symfony 2.1. Надеемся, наши советы вам пригодятся.

Если вы хотите узнать о других моделях поведения DataGridBundle, то можно обратиться к документации бандла на сайте github.com.

  • 0 Репосты

Комментарии

Фильтр

Закрыть

Технологии

Индустрии