Skip to content
Anton edited this page Dec 21, 2016 · 21 revisions

Описание

Grid - просто табличка, с сортировкой, постраничной навигацией, фильтрами, поиском. Поддерживает следующие адаптеры:

Настройки

Нет

Использование

Пример реализации класса 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интаксис:

$grid->filter()

Last

Возвращает URL последней страницы, cинтаксис:

$grid->last()

Limit

Возвращает URL для изменения количества записей на странице, cинтаксис:

$grid->limit($limit = 25)

Next

Возвращает URL на следующую страницу, cинтаксис:

$grid->next()

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интаксис:

$grid->pages()

Prev

Возвращает URL на предыдущую страницу, cинтаксис:

$grid->prev()

Reset

Возвращает URL на Grid без фильтров и сортировок, cинтаксис:

$grid->reset()

Total

Возвращает количество записей, cинтаксис:

$grid->total()
Clone this wiki locally