-
Notifications
You must be signed in to change notification settings - Fork 39
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'=>'[email protected]', 'status'=>'active'],
['id'=>2, 'name'=>'Bar', 'email'=>'[email protected]', '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
Возвращает URL для применения фильтра, cинтаксис:
$grid->filter($column, $filter, $value, $reset = true)
Возвращает URL первой страницы, cинтаксис:
$grid->filter()
Возвращает URL последней страницы, cинтаксис:
$grid->last()
Возвращает URL для изменения количества записей на странице, cинтаксис:
$grid->limit($limit = 25)
Возвращает URL на следующую страницу, cинтаксис:
$grid->next()
Возвращает URL для сортировки, cинтаксис:
$grid->order($column, $order = null, $defaultOrder = Grid\Grid::ORDER_ASC, $reset = true)
Возвращает URL на указанную страницу, cинтаксис:
$grid->page(int $page = 1)
Возвращает количество страниц, cинтаксис:
$grid->pages()
Возвращает URL на предыдущую страницу, cинтаксис:
$grid->prev()
Возвращает URL на Grid без фильтров и сортировок, cинтаксис:
$grid->reset()
Возвращает количество записей, cинтаксис:
$grid->total()
Acl
Application
Auth
Cache
Common
— Exception
— Collection
— Container
— Helper
— Options
— Singleton
Config
Controller
— Data
— Mapper
—— Crud
—— Rest
— Reflection
Crud
— Crud Table
Db
— Row
— Table
— Relations
— Query
Debug
EventManager
Grid
Http
Layout
Logger
Mailer
Messages
Nil
Proxy
Registry
Request
Response
Router
Session
Translator
Validator
View