4.1.2. Добавление секций в дереве
Дерево, находящееся в административной консоли в левом frame, используется для навигации между её секциями.
Все секции в дерево добавлены используя опцию Sections в том или ином unit config. Уже добавленные
секции можно изменять через опцию SectionAdjustments, находящуюся в unit config с большим
приоритетом, чем у того unit config, в котором секция описана. Ниже приведён
пример массива, при помощи которого можно добавить новую секцию:
'custom:section_name' => Array (
'parent' => 'custom:parent_section_name',
'icon' => 'custom:icon_name',
'label' => 'la_title_SectionName',
'url' => Array('t' => 'custom/path/to/template', 'pass' => 'm'),
'permissions' => Array('view', 'add', 'edit', 'delete'),
'priority' => 1,
'type' => stTREE,
),
Ключом в данном массиве является осмысленное название новой секции в дереве. Слово «custom» будет всегда, т.к. это название модуля.
Примечание
Секция в дереве будет видна только у того, у кого есть на это право доступа (permission).
Обязательные опции
название опции |
описание опции |
|---|---|
| parent (string) | Название секции в дереве, в которую будет добавлена эта секция. |
| icon (string) | Часть названия пиктограммы секции, которая будет использоваться при её отображении
в дереве и над grid (custom - это название модуля). Формат значения:
|
| label (string) | Фраза, перевод которой будет показываться в дереве (должна начинаться с |
| url (array) | Параметры для метода |
| permissions (array) | Список названий типов доступа, которые могут применяться к этой секции. Есть четыре стандартных типа доступа:
Если требуется добавить новый тип доступа, то его название должно начинаться с |
| priority (float) | Позиция секции в дереве (только относительно её родительской секции). Может быть дробной. Если определить несколько секций на одном уровне с одинаковым приоритетом, то показана будет только последняя из них. Следовательно у каждой секции должен быть отличный от других секций на её уровне приоритет, он же порядковый номер. |
Необязательные опции
название опции |
описание опции |
|---|---|
| onclick (string) | Название javascript функции, которая будет выполнена при нажатии на эту секцию.
От того, что эта функция вернёт будет зависеть то будет-ли выполнен переход по
ссылке построенной из опции |
| container (boolean) | Добавлено в версии 4.2.1. Указывает на то, что данная секция является только контейнером для других секций. В таком случае при нажатии на эту секция в дереве будет открыта первая секция, которая не является контейнером и является дочерней данной секции. |
| show_mode (int) | Позволяет регулировать видимость секции, возможные значения:
Добавлено в версии 5.0.0.
|
| SectionPrefix (string) | Позволяет задать префикс, который будет использоваться для проверки прав доступа к секции. Если не задан, то будет использоваться тот префикс, в котором данная секция объявлена. Примечание Также можно задать одноимённую опцию в конфигурационном файле. В таком случае заданный префикс для проверки прав доступа будет относиться ко всем секциям определённым в данном конфигурационном файле. |
Осторожно
Ошибка: значение ключа show_mode равное false в v4.3.9 не прячет секцию, а изменяет шаблон
в ней на index. Пока что рекомендуется использовать способ убирания секции, описанный ниже в статье.
Изменение секций
Бывают ситуации, при которых требуется изменить некоторые из параметров в объявлении секции или просто её убрать.
В случае, когда секция объявлена в таком unit config, который
запрещено изменять (напр. под папкой core), то следует воспользоваться одним из ниже приведённых подходов.
Предупреждение
Ни в коем случае не следует переопределять секцию в другом unit config. Если это сделать, то тогда потеряется связка самой секции с тем unit config, где она была изначально объявлена. Это повлечёт за собой неправильную проверку прав доступа при работе с данными, показываемыми в этой секции.
Использование события OnAfterConfigRead
Следует сделать after hook на событие OnAfterConfigRead того префикса, в unit config которого объявлена эта секция. Тело hook будет находиться в том обработчике событий, чей unit config хочет изменить определение секции. В теле hook уже можно свободно изменять требуемый unit config следующим образом:
/**
* [HOOK] Changes unit config of prefix "shipping"
*
* @param kEvent $event
*/
function OnModifyShippingConfig(&$event)
{
$sections = $this->Application->getUnitOption($event->MasterEvent->Prefix, 'Sections');
$sections['in-commerce:shippings']['show_mode'] = smDEBUG;
$this->Application->setUnitOption($event->MasterEvent->Prefix, 'Sections', $sections);
}
Данный подход можно глобально применять для динамического изменения почти любых данных в других unit config.
Использование опции SectionAdjustments
Другим и более предпочтительным способом является использование опции SectionAdjustments в unit config. При использовании данного способа можно массово изменять и убирать секции и при этом даже не знать где они были объявлены. Единственным условием является то, что unit config содержащий данную опцию должен обрабатываться после всех тех unit configs, в которых объявлены изменяемые секции.
Содержание данной опции также, как и опции Sections является массивом, в котором ключи - это
названия секций в дереве. В качестве значения каждой изменяемой секции нужно указать массив её изменённых
параметров или слово remove, в случае, когда секцию нужно убрать:
'SectionAdjustments' => Array (
'in-portal:configure_themes' => Array (
'priority' => 10.036,
'show_mode' => smDEBUG,
),
'in-portal:tools' => 'remove',
),