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

IT-копирайтер
Время чтения: 5 минут
Недавно для очередного проекта на основе фреймворка 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.
Комментарии