ModuleCategory
Package | application.modules.category |
---|---|
Inheritance | class ModuleCategory » ModuleORM » Module » LsObject |
Since | 2.0 |
Source Code | /application/classes/modules/category/Category.class.php |
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
_aBehaviors | Список поведений в виде готовых объектов, формируется автоматически | LsObject | |
aBehaviors | array | Список поведений | LsObject |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oMapperORM | MapperORM | Объект маппера ORM | ModuleORM |
Public Methods
Method | Description | Defined By |
---|---|---|
AddBehaviorHook() | Добавляет хук поведения | LsObject |
AttachBehavior() | Присоединяет поведение к объекту | LsObject |
AttachCategoriesForTargetItems() | Цепляет для списка объектов категории | ModuleCategory |
CreateRelation() | Создает новую связь конкретного объекта с категориями | ModuleCategory |
CreateTargetType() | Создает новый тип объекта в БД для категорий | ModuleCategory |
DeleteItemsByFilter() | Удаляет сущности по фильтру | ModuleORM |
DetachBehavior() | Отсоединяет поведение от объекта | LsObject |
GetAggregateFunctionByFilter() | Получить значение агрегирующей функции | ModuleORM |
GetBehavior() | Возвращает объект поведения по его имени | LsObject |
GetBehaviors() | Возвращает все объекты поведения | LsObject |
GetByFilter() | Получить сущность по фильтру | ModuleORM |
GetCategoriesIdByCategory() | Возвращает список категорий по категории | ModuleCategory |
GetCategoriesTreeByTargetType() | Возвращает дерево категорий | ModuleCategory |
GetCategoriesTreeByType() | Возвращает дерево категорий | ModuleCategory |
GetCountItemsByFilter() | Получить количество сущностей по фильтру | ModuleORM |
GetCountItemsByJoinEntity() | ModuleORM | |
GetEntityCategories() | Возвращает список категорий сущности | ModuleCategory |
GetItemsByArray() | Возвращает список сущностей по фильтру | ModuleORM |
GetItemsByFilter() | Получить список сущностей по фильтру | ModuleORM |
GetItemsByJoinEntity() | ModuleORM | |
GetTargetIdsByCategoriesId() | Возвращает список ID таргетов по списку категорий | ModuleCategory |
GetTargetIdsByCategory() | Возвращает список ID таргетов по категории | ModuleCategory |
Init() | Инициализация | ModuleORM |
LoadTree() | Для сущностей со связью RELATION_TYPE_TREE возвращает список сущностей в виде дерева | ModuleORM |
ParserText() | Парсинг текста с учетом конкретной категории | ModuleCategory |
RebuildCategoryUrlFull() | Пересобирает полные URL дочерних категорий | ModuleCategory |
RemoveBehaviorHook() | Удаляет хук поведения | LsObject |
RemoveCategories() | Удаляет категории у объекта | ModuleCategory |
RemoveRelation() | Удаляет связь конкретного объекта с категориями | ModuleCategory |
RemoveTargetType() | Отключает тип объекта для категорий | ModuleCategory |
RewriteFilter() | Обработка фильтра ORM запросов | ModuleCategory |
RewriteGetItemsByFilter() | Переопределяем метод для возможности цеплять свои кастомные данные при ORM запросах - свойства | ModuleCategory |
RunBehaviorHook() | Запускает хук поведения на выполнение | LsObject |
SaveCategories() | Сохраняет категории для объекта | ModuleCategory |
SetInit() | Помечает модуль как инициализированный | Module |
Shutdown() | Метод срабатывает при завершении работы ядра | Module |
ValidateCategoryArray() | Валидирует список категория | ModuleCategory |
__call() | Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля. | ModuleORM |
__clone() | Блокируем копирование/клонирование объекта | Module |
__construct() | Конструктор, запускается автоматически при создании объекта | LsObject |
__get() | Обработка доступа к объекты поведения | LsObject |
buildTree() | Построение дерева | ModuleORM |
isInit() | Возвращает значение флага инициализации модуля | Module |
Protected Methods
Method | Description | Defined By |
---|---|---|
PrepareBehaviors() | Инициализация поведений | LsObject |
UpdateCountTarget() | Обновляет количество элементов у категорий (поле count_target в таблице категорий) | ModuleCategory |
_AddEntity() | Добавление сущности в БД | ModuleORM |
_DeleteEntity() | Удаление сущности из БД | ModuleORM |
_GetAncestorsOfEntity() | Для сущности со связью RELATION_TYPE_TREE возвращает список всех предков | ModuleORM |
_GetChildrenOfEntity() | Для сущности со связью RELATION_TYPE_TREE возвращает список прямых потомков | ModuleORM |
_GetDescendantsOfEntity() | Для сущности со связью RELATION_TYPE_TREE возвращает список всех потомков | ModuleORM |
_GetParentOfEntity() | Для сущности со связью RELATION_TYPE_TREE возвращает предка | ModuleORM |
_LoadMapperORM() | Загрузка маппера ORM | ModuleORM |
_NormalizeEntityRootName() | Приводит название сущности к единому формату полного имени класса | ModuleORM |
_ReloadEntity() | Обновляет данные сущности из БД | ModuleORM |
_SaveEntity() | Сохранение сущности в БД | ModuleORM |
_ShowColumnsFrom() | Список полей сущности | ModuleORM |
_ShowPrimaryIndexFrom() | Primary индекс сущности | ModuleORM |
_UpdateEntity() | Обновление сущности в БД | ModuleORM |
_deleteManyToManyRelation() | Выполняет удаление всех связей many_to_many сущности | ModuleORM |
_setIndexesFromField() | Returns assotiative array, indexed by PRIMARY KEY or another field. | ModuleORM |
_setIndexesGroupField() | Возвращает сгруппированный массив по нужному полю | ModuleORM |
_setIndexesGroupJoinField() | Возвращает сгруппированный массив по нужному полю из данных таблицы связей | ModuleORM |
_updateManyToManyRelation() | Выполняет обновление связи many_to_many у сущности | ModuleORM |
Method Details
public void AttachCategoriesForTargetItems(array $aEntityItems, string $sTargetType)
| ||
$aEntityItems | array | |
$sTargetType | string |
public function AttachCategoriesForTargetItems($aEntityItems, $sTargetType)
{
if (!is_array($aEntityItems)) {
$aEntityItems = array($aEntityItems);
}
$aEntitiesId = array();
foreach ($aEntityItems as $oEntity) {
$aEntitiesId[] = $oEntity->getId();
}
/**
* Получаем категории для всех объектов
*/
$sEntityCategory = $this->_NormalizeEntityRootName('Category');
$sEntityTarget = $this->_NormalizeEntityRootName('Target');
$aCategories = $this->GetCategoryItemsByFilter(array(
'#join' => array(
"JOIN " . Config::Get('db.table.category_target') . " category_target ON
t.id = category_target.category_id and
category_target.target_type = '{$sTargetType}' and
category_target.target_id IN ( ?a )
" => array($aEntitiesId)
),
'#select' => array(
't.*',
'category_target.target_id'
),
'#index-group' => 'target_id',
'#cache' => array(
null,
array(
$sEntityCategory . '_save',
$sEntityCategory . '_delete',
$sEntityTarget . '_save',
$sEntityTarget . '_delete'
)
)
));
/**
* Собираем данные
*/
foreach ($aEntityItems as $oEntity) {
if (isset($aCategories[$oEntity->_getPrimaryKeyValue()])) {
$oEntity->_setData(array('_categories' => $aCategories[$oEntity->_getPrimaryKeyValue()]));
} else {
$oEntity->_setData(array('_categories' => array()));
}
}
}
Цепляет для списка объектов категории
public bool CreateRelation(array $aCategoryId, int $iTargetId, int|string $iType)
| ||
$aCategoryId | array | |
$iTargetId | int | |
$iType | int|string | type_id или target_type |
{return} | bool |
public function CreateRelation($aCategoryId, $iTargetId, $iType)
{
if (!$aCategoryId or (is_array($aCategoryId) and !count($aCategoryId))) {
return false;
}
if (!is_array($aCategoryId)) {
$aCategoryId = array($aCategoryId);
}
if (is_numeric($iType)) {
$oType = $this->GetTypeById($iType);
} else {
$oType = $this->GetTypeByTargetType($iType);
}
if (!$oType) {
return false;
}
foreach ($aCategoryId as $iCategoryId) {
if (!$this->GetTargetByCategoryIdAndTargetIdAndTypeId($iCategoryId, $iTargetId, $oType->getId())) {
$oTarget = Engine::GetEntity('ModuleCategory_EntityTarget');
$oTarget->setCategoryId($iCategoryId);
$oTarget->setTargetId($iTargetId);
$oTarget->setTargetType($oType->getTargetType());
$oTarget->setTypeId($oType->getId());
$oTarget->Add();
}
}
return true;
}
Создает новую связь конкретного объекта с категориями
public bool|ModuleCategory_EntityType CreateTargetType(string $sType, string $sTitle, array $aParams=array (
), bool $bRewrite=false)
| ||
$sType | string | |
$sTitle | string | |
$aParams | array | |
$bRewrite | bool | |
{return} | bool|ModuleCategory_EntityType |
public function CreateTargetType($sType, $sTitle, $aParams = array(), $bRewrite = false)
{
/**
* Проверяем есть ли уже такой тип
*/
if ($oType = $this->GetTypeByTargetType($sType)) {
if (!$bRewrite) {
return false;
}
} else {
$oType = Engine::GetEntity('ModuleCategory_EntityType');
$oType->setTargetType($sType);
}
$oType->setState(self::TARGET_STATE_ACTIVE);
$oType->setTitle(htmlspecialchars($sTitle));
$oType->setParams($aParams);
if ($oType->Save()) {
return $oType;
}
return false;
}
Создает новый тип объекта в БД для категорий
public array|null GetCategoriesIdByCategory($oCategory $oCategory, bool $bIncludeChild=false)
| ||
$oCategory | $oCategory | |
$bIncludeChild | bool | Возвращать все дочернии категории |
{return} | array|null |
public function GetCategoriesIdByCategory($oCategory, $bIncludeChild = false)
{
if (is_object($oCategory)) {
$iCategoryId = $oCategory->getId();
} else {
$iCategoryId = $oCategory;
}
$aCategoryId = array($iCategoryId);
if ($bIncludeChild) {
/**
* Сначала получаем полный список категорий текущего типа
*/
if (!is_object($oCategory)) {
$oCategory = $this->GetCategoryById($iCategoryId);
}
if ($oCategory) {
if ($aChildren = $oCategory->getDescendants()) {
foreach ($aChildren as $oCategoryChild) {
$aCategoryId[] = $oCategoryChild->getId();
}
}
}
}
return $aCategoryId;
}
Возвращает список категорий по категории
public array GetCategoriesTreeByTargetType(string $sCode)
| ||
$sCode | string | Type code |
{return} | array |
public function GetCategoriesTreeByTargetType($sCode)
{
if ($oType = $this->GetTypeByTargetType($sCode)) {
return $this->GetCategoriesTreeByType($oType->getId());
}
return array();
}
Возвращает дерево категорий
public array GetCategoriesTreeByType(int $sId)
| ||
$sId | int | Type ID |
{return} | array |
public function GetCategoriesTreeByType($sId)
{
$aCategories = $this->LoadTreeOfCategory(array('type_id' => $sId));
return ModuleORM::buildTree($aCategories);
}
Возвращает дерево категорий
public array GetEntityCategories($oTarget $oTarget, $sTargetType $sTargetType)
| ||
$oTarget | $oTarget | |
$sTargetType | $sTargetType | |
{return} | array |
public function GetEntityCategories($oTarget, $sTargetType)
{
$aCategories = $oTarget->_getDataOne('_categories');
if (is_null($aCategories)) {
$this->AttachCategoriesForTargetItems($oTarget, $sTargetType);
return $oTarget->_getDataOne('_categories');
}
return $aCategories;
}
Возвращает список категорий сущности
public array GetTargetIdsByCategoriesId($aCategoryId $aCategoryId, $sTargetType $sTargetType, $iPage $iPage, $iPerPage $iPerPage)
| ||
$aCategoryId | $aCategoryId | |
$sTargetType | $sTargetType | |
$iPage | $iPage | |
$iPerPage | $iPerPage | |
{return} | array |
public function GetTargetIdsByCategoriesId($aCategoryId, $sTargetType, $iPage, $iPerPage)
{
if (!is_array($aCategoryId)) {
$aCategoryId = array($aCategoryId);
}
if (!count($aCategoryId)) {
return array();
}
$aTargetItems = $this->GetTargetItemsByFilter(array(
'category_id in' => $aCategoryId,
'target_type' => $sTargetType,
'#page' => array($iPage, $iPerPage),
'#index-from' => 'target_id'
));
return array_keys($aTargetItems['collection']);
}
Возвращает список ID таргетов по списку категорий
public array GetTargetIdsByCategory($oCategory $oCategory, $sTargetType $sTargetType, $iPage $iPage, $iPerPage $iPerPage, bool $bIncludeChild=false)
| ||
$oCategory | $oCategory | |
$sTargetType | $sTargetType | |
$iPage | $iPage | |
$iPerPage | $iPerPage | |
$bIncludeChild | bool | |
{return} | array |
public function GetTargetIdsByCategory($oCategory, $sTargetType, $iPage, $iPerPage, $bIncludeChild = false)
{
$aCategoryId = $this->GetCategoriesIdByCategory($oCategory, $bIncludeChild);
return $this->GetTargetIdsByCategoriesId($aCategoryId, $sTargetType, $iPage, $iPerPage);
}
Возвращает список ID таргетов по категории
public string ParserText(string $sText, ModuleCategory_EntityCategory $oCategory)
| ||
$sText | string | |
$oCategory | ModuleCategory_EntityCategory | |
{return} | string |
public function ParserText($sText, $oCategory)
{
$this->Text_AddParams(array('oCategory' => $oCategory));
$sResult = $this->Text_Parser($sText);
$this->Text_RemoveParams(array('oCategory'));
return $sResult;
}
Парсинг текста с учетом конкретной категории
public void RebuildCategoryUrlFull($oCategoryStart $oCategoryStart, bool $bStart=true)
| ||
$oCategoryStart | $oCategoryStart | |
$bStart | bool |
public function RebuildCategoryUrlFull($oCategoryStart, $bStart = true)
{
static $aRebuildIds;
if ($bStart) {
$aRebuildIds = array();
}
if (is_null($oCategoryStart->getId())) {
$aCategories = $this->GetCategoryItemsByFilter(array(
'#where' => array('pid is null' => array()),
'type_id' => $oCategoryStart->getTypeId()
));
} else {
$aCategories = $this->GetCategoryItemsByFilter(array(
'pid' => $oCategoryStart->getId(),
'type_id' => $oCategoryStart->getTypeId()
));
}
foreach ($aCategories as $oCategory) {
if ($oCategory->getId() == $oCategoryStart->getId()) {
continue;
}
if (in_array($oCategory->getId(), $aRebuildIds)) {
continue;
}
$aRebuildIds[] = $oCategory->getId();
$oCategory->setUrlFull($oCategoryStart->getUrlFull() . '/' . $oCategory->getUrl());
$oCategory->Update();
$this->RebuildCategoryUrlFull($oCategory, false);
}
}
Пересобирает полные URL дочерних категорий
public void RemoveCategories($oTarget $oTarget, $sTargetType $sTargetType, $mCallbackCountTarget $mCallbackCountTarget=NULL)
| ||
$oTarget | $oTarget | |
$sTargetType | $sTargetType | |
$mCallbackCountTarget | $mCallbackCountTarget |
public function RemoveCategories($oTarget, $sTargetType, $mCallbackCountTarget = null)
{
$aCategoryIdChanged = $this->RemoveRelation($oTarget->_getPrimaryKeyValue(), $sTargetType);
/**
* Подсчитываем количество новое элементов для каждой категории
*/
$this->UpdateCountTarget($aCategoryIdChanged, $sTargetType, $mCallbackCountTarget);
}
Удаляет категории у объекта
public bool|array RemoveRelation(int $iTargetId, int|string $iType)
| ||
$iTargetId | int | |
$iType | int|string | type_id или target_type |
{return} | bool|array |
public function RemoveRelation($iTargetId, $iType)
{
if (!is_numeric($iType)) {
if ($oType = $this->GetTypeByTargetType($iType)) {
$iType = $oType->getId();
} else {
return false;
}
}
$aRemovedCategory = array();
$aTargets = $this->GetTargetItemsByTargetIdAndTypeId($iTargetId, $iType);
foreach ($aTargets as $oTarget) {
$oTarget->Delete();
$aRemovedCategory[] = $oTarget->getCategoryId();
}
return $aRemovedCategory;
}
Удаляет связь конкретного объекта с категориями
public void RemoveTargetType(string $sType, int $iState=2)
| ||
$sType | string | |
$iState | int | self::TARGET_STATE_NOT_ACTIVE или self::TARGET_STATE_REMOVE |
public function RemoveTargetType($sType, $iState = self::TARGET_STATE_NOT_ACTIVE)
{
if ($oType = $this->GetTypeByTargetType($sType)) {
$oType->setState($iState);
$oType->Save();
}
}
Отключает тип объекта для категорий
public array RewriteFilter(array $aFilter, array $sEntityFull, string $sTargetType)
| ||
$aFilter | array | |
$sEntityFull | array | |
$sTargetType | string | |
{return} | array |
public function RewriteFilter($aFilter, $sEntityFull, $sTargetType)
{
$oEntitySample = Engine::GetEntity($sEntityFull);
if (!isset($aFilter['#join'])) {
$aFilter['#join'] = array();
}
if (!isset($aFilter['#select'])) {
$aFilter['#select'] = array();
}
if (array_key_exists('#category', $aFilter)) {
$aCategoryId = $aFilter['#category'];
if (!is_array($aCategoryId)) {
$aCategoryId = array($aCategoryId);
}
$sJoin = "JOIN " . Config::Get('db.table.category_target') . " category ON
t.`{$oEntitySample->_getPrimaryKey()}` = category.target_id and
category.target_type = '{$sTargetType}' and
category.category_id IN ( ?a ) ";
$aFilter['#join'][$sJoin] = array($aCategoryId);
if (count($aFilter['#select'])) {
$aFilter['#select'][] = "distinct t.`{$oEntitySample->_getPrimaryKey()}`";
} else {
$aFilter['#select'][] = "distinct t.`{$oEntitySample->_getPrimaryKey()}`";
$aFilter['#select'][] = 't.*';
}
}
return $aFilter;
}
Обработка фильтра ORM запросов
public void RewriteGetItemsByFilter(array $aResult, array $aFilter, string $sTargetType)
| ||
$aResult | array | |
$aFilter | array | |
$sTargetType | string |
public function RewriteGetItemsByFilter($aResult, $aFilter, $sTargetType)
{
if (!$aResult) {
return;
}
/**
* Список на входе может быть двух видов:
* 1 - одномерный массив
* 2 - двумерный, если применялась группировка (использование '#index-group')
*
* Поэтому сначала сформируем линейный список
*/
if (isset($aFilter['#index-group']) and $aFilter['#index-group']) {
$aEntitiesWork = array();
foreach ($aResult as $aItems) {
foreach ($aItems as $oItem) {
$aEntitiesWork[] = $oItem;
}
}
} else {
$aEntitiesWork = $aResult;
}
if (!$aEntitiesWork) {
return;
}
/**
* Проверяем необходимость цеплять категории
*/
if (isset($aFilter['#with']['#category'])) {
$this->AttachCategoriesForTargetItems($aEntitiesWork, $sTargetType);
}
}
Переопределяем метод для возможности цеплять свои кастомные данные при ORM запросах - свойства
public void SaveCategories($oTarget $oTarget, $sTargetType $sTargetType, $mCallbackCountTarget $mCallbackCountTarget=NULL)
| ||
$oTarget | $oTarget | |
$sTargetType | $sTargetType | |
$mCallbackCountTarget | $mCallbackCountTarget |
public function SaveCategories($oTarget, $sTargetType, $mCallbackCountTarget = null)
{
$aCategoriesId = $oTarget->_getDataOne('_categories_for_save');
if (!is_array($aCategoriesId)) {
return;
}
/**
* Удаляем текущие связи
*/
$aCategoryIdChanged = $this->RemoveRelation($oTarget->_getPrimaryKeyValue(), $sTargetType);
/**
* Создаем
*/
$this->CreateRelation($aCategoriesId, $oTarget->_getPrimaryKeyValue(), $sTargetType);
/**
* Полный список категорий, которые затронули изменения
*/
$aCategoryIdChanged = array_merge($aCategoryIdChanged, $aCategoriesId);
/**
* Подсчитываем количество новое элементов для каждой категории
*/
$this->UpdateCountTarget($aCategoryIdChanged, $sTargetType, $mCallbackCountTarget);
$oTarget->_setData(array('_categories_for_save' => null));
}
Сохраняет категории для объекта
protected void UpdateCountTarget($aCategoryId $aCategoryId, $sTargetType $sTargetType, null $mCallback=NULL)
| ||
$aCategoryId | $aCategoryId | |
$sTargetType | $sTargetType | |
$mCallback | null |
protected function UpdateCountTarget($aCategoryId, $sTargetType, $mCallback = null)
{
if (!is_array($aCategoryId)) {
$aCategoryId = array($aCategoryId);
}
if (!count($aCategoryId)) {
return;
}
$aCategories = $this->GetCategoryItemsByArrayId($aCategoryId);
foreach ($aCategories as $oCategory) {
if ($mCallback) {
if (is_string($mCallback)) {
$mCallback = array($this, $mCallback);
}
$iCount = call_user_func_array($mCallback, array($oCategory, $sTargetType));
} else {
$iCount = $this->GetCountItemsByFilter(array('category_id' => $oCategory->getId()),
'ModuleCategory_EntityTarget');
}
$oCategory->setCountTarget($iCount);
$oCategory->Update();
}
}
Обновляет количество элементов у категорий (поле count_target в таблице категорий)
public array|bool ValidateCategoryArray(array $aCategoryId, int $iType, bool $bReturnObjects=false)
| ||
$aCategoryId | array | |
$iType | int | |
$bReturnObjects | bool | |
{return} | array|bool |
public function ValidateCategoryArray($aCategoryId, $iType, $bReturnObjects = false)
{
if (!is_array($aCategoryId)) {
return false;
}
$aIds = array();
foreach ($aCategoryId as $iId) {
$aIds[] = (int)$iId;
}
if ($aIds and $aCategories = $this->GetCategoryItemsByFilter(array(
'id in' => $aIds,
'type_id' => $iType,
'#index-from-primary'
))
) {
if ($bReturnObjects) {
return $aCategories;
} else {
return array_keys($aCategories);
}
}
return false;
}
Валидирует список категория