Универсальные категории

В новой версии LS появится функционал универсальных категорий.
Плагины смогут привязывать древовидные категории к любым объектам (полная интеграция с 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 комментариев

avatar
'target' => $oArticle, 'entity' => 'PluginArticle_ModuleMain_EntityArticle'

Для чего ключ entity? Имя класса можно получить из $oArticle.
avatar
Об этом есть в топике:
entity — класс редактируемой сущности, он как раз используется если target = null
Другими словами объект $oArticle есть только при редактировании статьи, а при ее создании его еще нет, а класс нужно знать.
avatar
очень не хватало подкатегорий в старой версии ЛС! Очень жду релиза!
avatar
catalog.livestreetcms.com/addon/view/433/ пользуйтесь тем что есть сейчас. сам жду обновления LS но походу не дождусь
avatar
Этот плагин не совместим с другим полезным плагином — Simple Rating, ругается на переопределение файла blogs.tpl
avatar
я думаю это решаемо! поговорите с авторами обоих плагинов.
avatar
Скопируйте из первого файла во второй, а первый отключите.
avatar
спасибо, тоже пригодилось..эвакуатор, эвакуация, эвакуатор спб, эвакуатор санкт-петербург, эвакуатор петербург, эвакуация автомобилей, эвакуатор дешевогрузоперевозки спбвызов такси в спб,на вокзал,в аэропортдачные дома и бани из бруса под ключкузовной ремонт автомобилей спбкузовной ремонт автомобилей спбвыкуп автоаренда автовышек
avatar
А следующая версия движка в котором будет этот функционал какая?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.