Универсальные категории
В новой версии LS появится функционал универсальных категорий.
Плагины смогут привязывать древовидные категории к любым объектам (полная интеграция с ORM), управления такими категориями доступно из админки. Из коробки категории будут работать для блогов (как сейчас на сайте livestreet.ru).
Для сущности:
Для модуля:
Обязательным параметром является
Для сущности доступны и другие параметры, полный список с описанием доступен в классе поведения:
Далее необходимо на форму создания/редактирования объекта добавить выбор категории:
Добавление в шаблон происходит за счет блока
Если в параметрах поведения стоит
И в завершении осталось в главный файл плагина добавить включение/отключение необходимого типа категорий:
Для поиска по категориям также задействуем фильтр:
Дополнительно поведение добавляет в сущность новые методы для работы с категориями (category — название поведения):
Интеграция категорий реализована в тестовом плагине «Article», который доступен с админ-панелью.
Плагины смогут привязывать древовидные категории к любым объектам (полная интеграция с ORM), управления такими категориями доступно из админки. Из коробки категории будут работать для блогов (как сейчас на сайте livestreet.ru).
Интеграция в плагинах
Интеграция функционала категорий основана на механизме поведений. Поэтому для начала необходимо в класс объекта (сущность, к которой привязываем категории) и класс модуля добавить описание поведений.Для сущности:
protected $aBehaviors=array( // Настройка категорий 'category'=>array( 'class'=>'ModuleCategory_BehaviorEntity', 'target_type'=>'article', 'form_field'=>'category', 'multiple'=>true, ), );
Для модуля:
protected $aBehaviors=array( // Настройка категорий 'category'=> array( 'class'=>'ModuleCategory_BehaviorModule', 'target_type'=>'article', ), );
Обязательным параметром является
target_type
, который задает тип/код категорий. Тип должен быть уникальный. Для сущности доступны и другие параметры, полный список с описанием доступен в классе поведения:
protected $aParams=array( // Уникальный код 'target_type'=>'', // Имя инпута (select) на форме, который содержит список категорий 'form_field'=>'categories', // Автоматически брать текущую категорию из реквеста 'form_fill_current_from_request'=>true, // Возможность выбирать несколько категорий 'multiple'=>false, // Автоматическая валидация категорий (актуально при ORM) 'validate_enable'=>true, // Поле сущности, в котором хранятся категории. Если null, то используется имя из form_field 'validate_field'=>null, // Обязательное заполнение категории 'validate_require'=>false, // Получать значение валидации не из сущности, а из реквеста (используется поле form_field) 'validate_from_request'=>false, // Минимальное количество категорий, доступное для выбора 'validate_min'=>1, // Максимальное количество категорий, доступное для выбора 'validate_max'=>5, // Возможность выбрать только те категории, у которых нет дочерних 'validate_only_without_children'=>false, // Колбек для подсчета количества объектов у категории. Необходим, например, если необходимо учитывать объекты только с определенным статусом (доступен для публикации). // Указывать можно строкой с полным вызовом метода модуля, например, "PluginArticle_Main_GetCountArticle" // В качестве параметров передается список ID категорий и тип 'callback_count_target'=>null, );
Далее необходимо на форму создания/редактирования объекта добавить выбор категории:
{* Подключаем блок для управления категориями *} {insert name="block" block="categoryUpdate" params=[ 'plugin' => 'admin', 'target' => $oArticle, 'entity' => 'PluginArticle_ModuleMain_EntityArticle' ]}
Добавление в шаблон происходит за счет блока
categoryUpdate
. target
— объект редактируемой сущности, может быть null (при создании). entity
— класс редактируемой сущности, он как раз используется если target = null
. Если интерфейс редактирования сущности находится в админ-панеле, то это нужно явно указать через 'plugin' => 'admin'
.Если в параметрах поведения стоит
'validate_from_request'=>false
, то в коде создания/редактирования сущности перед валидацией необходимо заполнить поле, например, $oArticle->setCategory(getRequest('category'));
. Если 'validate_from_request'=>true
, то делать этого не нужно, значение категорий автоматически будет браться из реквеста.И в завершении осталось в главный файл плагина добавить включение/отключение необходимого типа категорий:
public function Activate() { // .... /** * Создаем новый тип для категорий */ if (!$this->Category_CreateTargetType('article','Статьи',array(),true)) { return false; } } public function Deactivate() { // .... $this->Category_RemoveTargetType('article',ModuleCategory::TARGET_STATE_NOT_ACTIVE); return true; }
Использование
Использовать категории достаточно просто. Основной упор сделан на взаимодейстсвие с ORM сущностями, что позволяет удобно и без заморочек использовать категории. Для автоматической подгрузки категорий в список сущностей достаточно в фильтр в опцию#with
передать значение #category
:$this->PluginArticle_Main_GetArticleItemsByFilter(array('#with'=>array('#category','user')));
Для поиска по категориям также задействуем фильтр:
// Получить статьи из категорий 1, 2 и 3 $this->PluginArticle_Main_GetArticleItemsByFilter(array('#category'=>array(1,2,3)));
Дополнительно поведение добавляет в сущность новые методы для работы с категориями (category — название поведения):
// Возвращает список категорий сущности $oArticle->category->getCategories(); // Возвращает количество категорий $oArticle->category->getCountCategories(); // Возвращает одну категорию сущности $oArticle->category->getCategory(); // Возвращает тип/код объекта для категорий $oArticle->category->getCategoryTargetType();
Интеграция категорий реализована в тестовом плагине «Article», который доступен с админ-панелью.
В последнее время в нашей жизни все большую роль играет различная электроника. Это и компьютеры, и бытовая техника, и телефоны. Все это приводит к большему риску различных поломок электроники, и здесь выручить может «Компьютерная помощь», например на сайте http://remont-pc.com.ua/uslugi/vosstanovlenie-dannyh.html
9 комментариев
Для чего ключ entity? Имя класса можно получить из $oArticle.
Другими словами объект $oArticle есть только при редактировании статьи, а при ее создании его еще нет, а класс нужно знать.