Перейти к основному содержимому

Datagrid

Виджет для отрисовки сеток с данными.

1. Общее описание

Может включать в себя следующие элементы:

  • Форма фильтрации
  • Панель со списком групповых операций
  • Верхний тулбар со стат. информацией и кнопками-действий (например, "Добавить материал")
  • Таблица с данными
  • Нижний пейджер

2. API виджета

print widget('xdatagrid',$data);

Где $data может иметь следующую структуру:

$data['columns.<column_id>']=array('data'=>'<Название колонки>','field'=>'<id поля>', 'sort'=>'<desc|asc>','default_sort'=>'<desc|asc>'); $data['datasource.xquery'] = <XdbBaseQuery объект>
$data['datasource.key_field'] = '<ID поля, которое будет использоваться в кач-ве идентификатора, каждой отображаемой в таблице строки>'
$data['pager.count'] = '<Максимальное число строк в таблице>'
$data['pager.type'] = '<normal|more>'
$data['pager.ajax'] = '<true|false>'
$data['actions'] = <Список групповых операций, перечисленных через запятую>
$data['toolbar.stat'] = <true|false>
$data['toolbar.actions'] = <Список действий, перечисленных через запятую>
$data['filters.form_id'] = <form_id формы фильтрации>
$data['enabled_columns'] = <Список id колонок, которые будут выводиться> Если список пустой, то выводятся все колонки, определенные в columns $data['enabled_filters'] = <Список id фильтров, которые будут выводиться> Если
список пустой, то выводятся все фильтры, определенные в filters

3. Примеры использования

function renderGrid()
{
$data = [];

//1. Настроим источник данных
$xquery = EM::getRepository(XmaccAccountEntity::class)
->findAllQuery()
->applyJoinUser(['name', 'picture', 'access as last_access_at'])
// ->appendOrderBy('last_event_at', DB_ORDER_DESC)
;

$xquery->applyRequestParams();
$xquery->usePager(100);
$tableAlias = $xquery->getTableAlias();

// $data['grid_id'] = 'Xmacc.adminMultiAccounts'; //Можем указать grid_id, чтобы было проще идентифицировать данный грид в хуке
$data['datasource.xquery'] = $xquery;
$data['datasource.key_field'] = "{$tableAlias}.uid";


//Нам необходимо получить для всех отображаемых в сетке пользователей стат.
//Для этого используем событие xtable::onTableItemsReady.
//В этом событии нам доступен массив всех объектов, полученных из datasource (xquery).
//Нас остается получить доп. данные и внедрить их в объект
// $data['onTableItemsReady'] = '_prepareXmaccAccountsStatData';

// 2. Настроим колонки таблицы
$data['columns.uid'] = [
'data' => '#UID',
'field' => "{$tableAlias}.uid",
'default_sort' => 'desc',
// 'widget.name' => 'xusers__uid',
];

$data['columns.group'] = [
'data' => 'Группа',
'widget.name' => 'xmacc-account-group',
];

$data['columns.account'] = [
'data' => 'Аккаунт',
'widget.name' => 'xmacc-account',
];

$data['columns.status'] = [
'data' => 'Статусы',
'widget.name' => 'xmacc-account-statuses',
];
$data['columns.stat'] = [
'data' => 'Состояние',
'widget.name' => 'xmacc-account-stat',
];

$data['columns.last_access_at'] = [
'data' => 'Последний доступ',
'field' => 'last_access_at',
'sort' => 'desc',
'default_sort' => 'desc',
'widget.name' => 'datetime',
'widget.options.fieldname' => 'last_access_at',
];

$data['columns.actions'] = [
'data' => 'Действия',
'widget.name' => 'xmacc-account-actions',
];

/// 3.Настроим фильтры
$data['filters.field_groups'] = '#Аккаунт,#Статусы,#Прочие фильтры';

$data['filters.fields.group_id'] = [
'form_widget' => 'xmacc.group_id',
'field_group' => 0,
];
$data['filters.fields.account_name'] = [
'form_widget' => 'xmacc.account_name',
'field_group' => 0,
];
$data['filters.fields.enabled_status'] = [
'form_widget' => 'xmacc.account_enabled_status',
'field_group' => 1,
];
$data['filters.fields.admin_status'] = [
'form_widget' => 'xmacc.account_admin_status',
'field_group' => 1,
];

$data['filters.fields.online_status'] = [
'form_widget' => 'xmacc.account_online_status',
'field_group' => 1,
];

$data['filters.fields.has_unread_messages'] = [
'form_widget' => 'xmacc.account_has_unread_messages',
'field_group' => 2,
];
$data['filters.fields.has_new_events'] = [
'form_widget' => 'xmacc.account_has_new_events',
'field_group' => 2,
];
$data['filters.fields.last_access'] = [
'form_widget' => 'xmacc.account_last_access',
'field_group' => 2,
];

// 4. Настроим Тулбар
//Тулбар: Кнопка добавления группы
$data['toolbar.action'] = [
'title' => 'Добавить управляемый аккаунт',
'path' => 'admin/xmacc/accounts/create',
'attributes' => ['append_class' => 'ctools-use-modal'],
];
//Тулбар:статистиика
$data['toolbar.stat'] = true;

// 5. Настроим Групповые операции
$data['actions'] = ["xmacc_update_online_status"];

// 6. Получим грид
return widget('xdatagrid', $data);
}

TODO

  • toolbar.actions - Поддержка множества действий
  • alter_hook, чтобы дать возможность менять $data
  • content_load($row) ??
  • responsive filter form