# Разработка виджета дашборда
← [К обзору UI-вкладов](contributions.md)
Виджет состоит из описания в `module.php`, поставщика данных (`provider`),
Twig-шаблона и стилей модуля. Он автоматически исчезает при выключении модуля
или отсутствии права.
## 1. Описание в `module.php`
```php
use App\Adminx\Notes\DashboardWidget;
'admin_extension' => array(
'icon' => 'ti ti-notes',
'dashboard' => array(
'code' => 'recent',
'label' => 'Мои заметки',
'description' => 'Последние и закреплённые заметки пользователя.',
'icon' => 'ti ti-notes',
'template' => '@notes/dashboard.twig',
'provider' => array(DashboardWidget::class, 'data'),
'permission' => 'view_notes',
'sort_order' => 24,
),
),
```
`code` формирует стабильный layout-код
`module.notes.dashboard.recent`. Не меняйте его после выпуска: настройки порядка
и видимости сохраняются по этому значению. Если code не задан, система использует
порядковый номер вклада, что менее устойчиво при добавлении новых виджетов.
`label`, `description` и `icon` показываются в настройках интерфейса. Они не
заменяют заголовок внутри Twig.
## 2. Provider
```php
Model::recent($userId, 6),
'summary' => Model::summary($userId),
'can_manage' => Permission::check('manage_notes'),
);
}
}
```
Provider вызывается при построении дашборда и не получает аргументов. Возвращайте
только данные представления, не HTML. Ограничивайте выборку, выбирайте нужные
колонки и избегайте отдельного SQL на каждый элемент.
`permission` в описании уже защищает сам вклад. Дополнительная проверка
`manage_*` в provider нужна для кнопок изменения внутри виджета.
## 3. Twig
Шаблон получает:
- `module_data` — массив provider;
- `module_widget` — нормализованное описание с module/layout code, label,
icon и sort order;
- общие переменные панели: `ADMINX_BASE`, `csrf_token`, пользователь и assets.
```twig
Заметки
Последние заметки
{{ module_data.summary.total|default(0) }} всего
{% for item in module_data.items|default([]) %}
{{ item.title }}
{% else %}
Заметок пока нет
{% endfor %}
```
У виджета обязательно должны быть пустое состояние и корректная работа без
необязательных ключей provider.
## 4. Размер в сетке
Дашборд использует 12 колонок. Обычный `.dashboard-section` занимает 4/12 на
широком экране, 6/12 на среднем и всю ширину на мобильном. Для стандартного
виджета `6/12` используйте общий класс `dashboard-half`:
```twig
...
```
На мобильном он автоматически займёт всю ширину. Для полного ряда задайте
`grid-column: 1 / -1` в LESS модуля. Не добавляйте имя нового модуля в
глобальный `dashboard.less`: общие размеры задаются примитивами, особые размеры
остаются в модуле.
## 5. Порядок и выключение
`sort_order` задаёт только первоначальное положение. После пользовательской
настройки действует сохранённый порядок из **Основные настройки → Интерфейс**.
На странице модуля действие **Размещение в интерфейсе** позволяет полностью
отключить его dashboard-вклад.
Описание может содержать список нескольких виджетов. Каждому задайте
уникальные `code`, `label`, `template` и подходящее право.
## Проверка
- роль без `permission` не видит виджет и provider не выполняется;
- пустые данные показывают аккуратное состояние;
- порядок и видимость сохраняются после перезагрузки;
- выключение модуля убирает виджет;
- desktop/tablet/mobile не дают горизонтальной прокрутки;
- ссылки, формы и Ajax повторно проверяют право на сервере.