In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Добавление секций в дереве

From In-Portal Developers Guide

Jump to: navigation, search

Alex (Talk)
(Необязательные опции: дополнение)
Next diff →

Revision as of 07:45, 18 February 2009

Работа с шаблонами и блоками Работа с шаблонами и блоками
Статьи в этой категории

Дерево, находящееся в административной консоли в левом 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" будет всегда, т.к. это название модуля.
Image:Infobox Icon.gif Секция в дереве будет видна только у того, у кого есть на это право доступа (permission).

Contents

Обязательные опции

название опции описание опции
parent (string) Название секции в дереве, в которую будет добавлена эта секция.
icon (string) Часть названия пиктограммы секции, которая будет использоваться при её отображении в дереве и над grid (custom - это название модуля). Формат значения: "<module_name>:<icon_name>" . Сама пиктограмма будет находиться в директории admin_templates/img/icons от указанного модуля. Таковым будет полное имя файла с пиктограммой:
  • icon24_<icon_name>.gif - для дерева;
  • icon46_<icon_name>.gif - для grid (над ним);
  • icon46_list_<icon_name>.gif - для шаблона sections_list.tpl (только в In-Portal).
label (string) Фраза, перевод которой будет показываться в дереве (должна начинаться с "la_title_").
url (array) Параметры для метода kApplication::HREF, который строит ссылку на секцию в дереве. Элемент массива с ключём "t" указывает на шаблон, который будет показан при выборе секции. Остальные элементы массива попадают в массив $params метода kApplication::HREF. Более подробно об их обработке написано в статье о переменной окружения.
permissions (array) Список названий типов доступа, которые могут применяться к этой секции. Есть четыре стандартных типа доступа:
  • view - право на просмотр записей в данной секции;
  • add - право на добавление новых записей в данной секции;
  • edit - право на редактировании ранее созданных записей в данной секции;
  • delete - право на удаление ранее созданных записей в данной секции.

Если требуется добавить новый тип доступа, то его название должно начинаться с "advanced:", напр. advanced:send_email. Если тот или иной тип доступа не доступен в данной секции, то его название в данной опции перечислять не надо.

priority (float) Позиция секции в дереве (только относительно её родительской секции). Может быть дробной. Если определить несколько секций на одном уровне с одинаковым приоритетом, то показана будет только последняя из них. Следовательно у каждой секции должен быть отличный от других секций на её уровне приоритет, он же порядковый номер.

Необязательные опции

название опции описание опции
onclick (string) Название javascript функции, которая будет выполнена при нажатии на эту секцию. От того, что эта функция вернёт будет зависеть то будет-ли выполнен переход по ссылке построенной из опции url.
container (boolean) Указывает на то, что данная секция является только контейнером для других секций. В таком случае при нажатии на эту секция в дереве будет открыта первая секция, которая не является контейнером и является дочерней данной секции. Опция добавлена в Core v 4.2.1.
show_mode (int) Позволяет регулировать видимость секции, возможные значения:
  • smDEBUG - показывать только в отладочном режиме (DEBUG MODE);
  • smSUPER_ADMIN - показывать только в Super Admin режиме и в отладочном режиме;
  • smNORMAL - показать ту секцию, которая ранее была задана с видимостью smSUPER_ADMIN (доступна начиная с Core v 5.0.0);
  • true - всегда показывать (значение по умолчанию);
  • false - никогда не показывать.
SectionPrefix (string) Позволяет задать префикс, который будет использоваться для проверки прав доступа к секции. Если не задан, то будет использоваться тот префикс, в котором данная секция объявлена. Также можно задать одноимённую опцию в конфигурационном файле. В таком случае заданный префикс для проверки прав доступа будет относиться ко всем секциям определённым в данном конфигурационном файле.

Изменение секций

Бывают ситуации, при которых требуется изменить некоторые из параметров в объявлении секции или просто её убрать. В случае, когда секция объявлена в таком unit config, который запрещено изменять (напр. под папкой "core"), то следует воспользоваться одним из ниже приведённых подходов.

Image:Infobox Icon.gif Ни в коем случае не следует переопределять секцию в другом 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',
),