Grid
Описание
Grid - просто табличка, с сортировкой, постраничной навигацией, фильтрами, поиском. Поддерживает следующие адаптеры:
- Array
- SQL Query
- Db Query Builder
Настройки
Нет
Использование
Пример реализации класса MyGrid для работы с SQL:
class MyGrid extended Grid { public function init() { // SQL $adapter = new \Bluz\Grid\Source\SqlSource(); $adapter->setSource("SELECT * FROM users"); $this->setAdapter($adapter); $this->setAllowOrders(['id', 'name', 'email']); $this->setAllowFilters('status'); } }
Также поддерживаются SelectSource() который работает с Db\Query:
// Query builder $adapter = new \Bluz\Grid\Source\SelectSource(); $select = new \Bluz\Db\Query\SelectSource(); $select->select('*')->from('users', 'u'); $adapter->setSource($select);
И ArraySource() для работы с массивами:
// Array $adapter = new \Bluz\Grid\Source\ArraySource(); $adapter->setSource([['id'=>1, 'name'=>'Foo', 'email'=>'a@bc.com', 'status'=>'active'], ['id'=>2, 'name'=>'Bar', 'email'=>'d@ef.com', 'status'=>'active']]);
Для фильтрации и сортировки по полям сводной таблицы (т.е. по результату объединения двух и более таблиц) следует указать соответствия между полем в сортировке и полем в запросе:
$select->select('u.*, u.id as uid, GROUP_CONCAT( ar.`name` SEPARATOR ", " ) AS rolesList') ->from('users', 'u') ->leftJoin('u', 'acl_users_roles', 'aur', 'u.`id` = aur.`userId`') ->leftJoin('aur', 'acl_roles', 'ar', 'ar.`id` = aur.`roleId`') ->groupBy('u.id'); $this->addAllowOrder('u.id'); $this->addAlias('u.id', 'id');
данная возможность добавлена в версии 2.0.3 с версии 7.1.0 убрана возможность указывать alias как поле для методов
addAllowOrder(),addAllowFilter()и производных от них
Код контроллера:
return function () use ($view) { $view->grid = new MyGrid(); }
Пример шаблона:
/** * @var \Bluz\Grid\Grid $grid */ ?> <div class="clearfix" data-spy="grid" data-grid="<?=$grid->getUid()?>"> <script> // use data-spy="grid" for use AJAX for reload grid require(['bluz.grid']); </script> <nav class="navbar navbar-default" role="navigation"> <div class="col-lg-6"> </div> <div class="col-lg-6"> <form action="<?=$this->url('test', 'grid-with-filter')?>" class="navbar-form filter-form pull-right"> <div class="input-group"> <?php echo $this->partial( 'grid/filter-search-advanced.phtml', [ 'grid' => $grid, 'filters' => [ __('Name (not strict)') => [$grid::FILTER_LIKE => 'name'], __('Name (strict)') => [$grid::FILTER_EQ => 'name'], ] ] ) ?> <span class="input-group-btn"> <button class="btn btn-default" type="submit"><?=__("Search")?></button> </span> </div> </form> </div> </nav> <?php $this->partial('grid/total.phtml', ['grid'=>$grid]) ?> <?php $this->partial('grid/limit.phtml', ['grid'=>$grid]) ?> <table class="table table-hover"> <thead> <tr> <th width="40px"><?=__('Id')?></th> <th width="80px"><a href="<?=$grid->order('namespace')?>"><?=__('Space')?></a></th> <th width="160px"><a href="<?=$grid->order('name')?>"><?=__('Name')?></a></th> <th><a href="<?=$grid->order('value')?>"><?=__('Value')?></a></th> <th width="160px"><a href="<?=$grid->order('created')?>"><?=__('Created')?></a></th> <th width="160px"><a href="<?=$grid->order('updated')?>"><?=__('Updated')?></a></th> <th width="72px"></th> </tr> </thead> <tbody> <?php foreach($grid->getData() as $row) : ?> <tr> <td><?=$row['id']?></td> <td><span class="label label-info"><?=$row['namespace']?></span></td> <td><a href="#" class="bluz-tooltip" data-toggle="tooltip" title="<?=esc($row['description'])?>"><?=esc($row['name'])?></a></td> <td><?=esc($row['value'])?></td> <td><?=$row['created']?></td> <td><?=$row['updated']?></td> <td class="controls"> <a href="<?=$this->url('options', 'crud', ['id' => $row['id']]);?>" class="btn btn-xs btn-primary dialog" data-ajax-method="get"> <i class="icon-pencil"></i> </a> <a href="<?=$this->url('options', 'crud', ['id' => $row['id']]);?>" class="confirm btn btn-xs btn-danger ajax" data-ajax-method="delete"> <i class="icon-trash"></i> </a> </td> </tr> <?php endforeach; ?> </tbody> </table> <?php $this->partial('grid/empty-rows.phtml', ['grid'=>$grid]) ?> <?php $this->partial('grid/pagination.phtml', ['grid'=>$grid]) ?> <?php $this->partial('grid/total.phtml', ['grid'=>$grid]) ?> </div>
Про построение URL:
// example of request url
http://domain.com/pages/grid/
http://domain.com/pages/grid/page/2/
http://domain.com/pages/grid/page/2/order-alias/desc/
http://domain.com/pages/grid/page/2/order-created/desc/order-alias/asc/
// with prefix for support more than one grid on page
http://domain.com/users/grid/users-page/2/users-order-created/desc/
http://domain.com/users/grid/users-page/2/users-filter-status/active/
// hash support
http://domain.com/pages/grid/#/page/2/order-created/desc/order-alias/asc/
При использовании grid на странице, где задан маршрут с переменной (@route /foobar/{$id}) необходимо указание параметра:
/** * @route /foobar/{$id} * @param int $id */ return function($id) { /** * @var Controller $this */ $grid = new Users\Grid($id); $grid->setModule($this->module); $grid->setController($this->controller); $grid->setParams(['id' => $id]); $view->grid = $grid; };
В противном случае, линка будет иметь вид
/foobar/?orders-order-id=desc, вместо /foobar/{$id}?orders-order-id=desc
Grid Helpers
Filter
Возвращает URL для применения фильтра, cинтаксис:
$grid->filter($column, $filter, $value, $reset = true)
First
Возвращает URL первой страницы, cинтаксис:
Last
Возвращает URL последней страницы, cинтаксис:
Limit
Возвращает URL для изменения количества записей на странице, cинтаксис:
$grid->limit($limit = 25)
Next
Возвращает URL на следующую страницу, cинтаксис:
Order
Возвращает URL для сортировки, cинтаксис:
$grid->order($column, $order = null, $defaultOrder = Grid\Grid::ORDER_ASC, $reset = true)
Page
Возвращает URL на указанную страницу, cинтаксис:
$grid->page(int $page = 1)
Pages
Возвращает количество страниц, cинтаксис:
Prev
Возвращает URL на предыдущую страницу, cинтаксис:
Reset
Возвращает URL на Grid без фильтров и сортировок, cинтаксис:
Total
Возвращает количество записей, cинтаксис: