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

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBehaviors array Список поведений LsObject
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oMapperORM MapperORM Объект маппера ORM ModuleORM

Public Methods

Hide inherited methods

MethodDescriptionDefined 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

Hide inherited methods

MethodDescriptionDefined 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

AttachCategoriesForTargetItems() method
public void AttachCategoriesForTargetItems(array $aEntityItems, string $sTargetType)
$aEntityItems array
$sTargetType string
Source Code: /application/classes/modules/category/Category.class.php#143 (show)
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()));
        }
    }
}

Цепляет для списка объектов категории

CreateRelation() method
public bool CreateRelation(array $aCategoryId, int $iTargetId, int|string $iType)
$aCategoryId array
$iTargetId int
$iType int|string type_id или target_type
{return} bool
Source Code: /application/classes/modules/category/Category.class.php#342 (show)
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;
}

Создает новую связь конкретного объекта с категориями

CreateTargetType() method
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
Source Code: /application/classes/modules/category/Category.class.php#525 (show)
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;
}

Создает новый тип объекта в БД для категорий

GetCategoriesIdByCategory() method
public array|null GetCategoriesIdByCategory($oCategory $oCategory, bool $bIncludeChild=false)
$oCategory $oCategory
$bIncludeChild bool Возвращать все дочернии категории
{return} array|null
Source Code: /application/classes/modules/category/Category.class.php#405 (show)
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;
}

Возвращает список категорий по категории

GetCategoriesTreeByTargetType() method
public array GetCategoriesTreeByTargetType(string $sCode)
$sCode string Type code
{return} array
Source Code: /application/classes/modules/category/Category.class.php#212 (show)
public function GetCategoriesTreeByTargetType($sCode)
{
    if (
$oType $this->GetTypeByTargetType($sCode)) {
        return 
$this->GetCategoriesTreeByType($oType->getId());
    }
    return array();
}

Возвращает дерево категорий

GetCategoriesTreeByType() method
public array GetCategoriesTreeByType(int $sId)
$sId int Type ID
{return} array
Source Code: /application/classes/modules/category/Category.class.php#199 (show)
public function GetCategoriesTreeByType($sId)
{
    
$aCategories $this->LoadTreeOfCategory(array('type_id' => $sId));
    return 
ModuleORM::buildTree($aCategories);
}

Возвращает дерево категорий

GetEntityCategories() method
public array GetEntityCategories($oTarget $oTarget, $sTargetType $sTargetType)
$oTarget $oTarget
$sTargetType $sTargetType
{return} array
Source Code: /application/classes/modules/category/Category.class.php#45 (show)
public function GetEntityCategories($oTarget$sTargetType)
{
    
$aCategories $oTarget->_getDataOne('_categories');
    if (
is_null($aCategories)) {
        
$this->AttachCategoriesForTargetItems($oTarget$sTargetType);
        return 
$oTarget->_getDataOne('_categories');
    }
    return 
$aCategories;
}

Возвращает список категорий сущности

GetTargetIdsByCategoriesId() method
public array GetTargetIdsByCategoriesId($aCategoryId $aCategoryId, $sTargetType $sTargetType, $iPage $iPage, $iPerPage $iPerPage)
$aCategoryId $aCategoryId
$sTargetType $sTargetType
$iPage $iPage
$iPerPage $iPerPage
{return} array
Source Code: /application/classes/modules/category/Category.class.php#480 (show)
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 таргетов по списку категорий

GetTargetIdsByCategory() method
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
Source Code: /application/classes/modules/category/Category.class.php#508 (show)
public function GetTargetIdsByCategory($oCategory$sTargetType$iPage$iPerPage$bIncludeChild false)
{
    
$aCategoryId $this->GetCategoriesIdByCategory($oCategory$bIncludeChild);

    return 
$this->GetTargetIdsByCategoriesId($aCategoryId$sTargetType$iPage$iPerPage);
}

Возвращает список ID таргетов по категории

ParserText() method
public string ParserText(string $sText, ModuleCategory_EntityCategory $oCategory)
$sText string
$oCategory ModuleCategory_EntityCategory
{return} string
Source Code: /application/classes/modules/category/Category.class.php#569 (show)
public function ParserText($sText$oCategory)
{
    
$this->Text_AddParams(array('oCategory' => $oCategory));
    
$sResult $this->Text_Parser($sText);
    
$this->Text_RemoveParams(array('oCategory'));
    return 
$sResult;
}

Парсинг текста с учетом конкретной категории

RebuildCategoryUrlFull() method
public void RebuildCategoryUrlFull($oCategoryStart $oCategoryStart, bool $bStart=true)
$oCategoryStart $oCategoryStart
$bStart bool
Source Code: /application/classes/modules/category/Category.class.php#437 (show)
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($oCategoryfalse);
    }
}

Пересобирает полные URL дочерних категорий

RemoveCategories() method
public void RemoveCategories($oTarget $oTarget, $sTargetType $sTargetType, $mCallbackCountTarget $mCallbackCountTarget=NULL)
$oTarget $oTarget
$sTargetType $sTargetType
$mCallbackCountTarget $mCallbackCountTarget
Source Code: /application/classes/modules/category/Category.class.php#324 (show)
public function RemoveCategories($oTarget$sTargetType$mCallbackCountTarget null)
{
    
$aCategoryIdChanged $this->RemoveRelation($oTarget->_getPrimaryKeyValue(), $sTargetType);
    
/**
     * Подсчитываем количество новое элементов для каждой категории
     */
    
$this->UpdateCountTarget($aCategoryIdChanged$sTargetType$mCallbackCountTarget);
}

Удаляет категории у объекта

RemoveRelation() method
public bool|array RemoveRelation(int $iTargetId, int|string $iType)
$iTargetId int
$iType int|string type_id или target_type
{return} bool|array
Source Code: /application/classes/modules/category/Category.class.php#379 (show)
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;
}

Удаляет связь конкретного объекта с категориями

RemoveTargetType() method
public void RemoveTargetType(string $sType, int $iState=2)
$sType string
$iState int self::TARGET_STATE_NOT_ACTIVE или self::TARGET_STATE_REMOVE
Source Code: /application/classes/modules/category/Category.class.php#553 (show)
public function RemoveTargetType($sType$iState self::TARGET_STATE_NOT_ACTIVE)
{
    if (
$oType $this->GetTypeByTargetType($sType)) {
        
$oType->setState($iState);
        
$oType->Save();
    }
}

Отключает тип объекта для категорий

RewriteFilter() method
public array RewriteFilter(array $aFilter, array $sEntityFull, string $sTargetType)
$aFilter array
$sEntityFull array
$sTargetType string
{return} array
Source Code: /application/classes/modules/category/Category.class.php#64 (show)
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 запросов

RewriteGetItemsByFilter() method
public void RewriteGetItemsByFilter(array $aResult, array $aFilter, string $sTargetType)
$aResult array
$aFilter array
$sTargetType string
Source Code: /application/classes/modules/category/Category.class.php#103 (show)
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 запросах - свойства

SaveCategories() method
public void SaveCategories($oTarget $oTarget, $sTargetType $sTargetType, $mCallbackCountTarget $mCallbackCountTarget=NULL)
$oTarget $oTarget
$sTargetType $sTargetType
$mCallbackCountTarget $mCallbackCountTarget
Source Code: /application/classes/modules/category/Category.class.php#260 (show)
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));
}

Сохраняет категории для объекта

UpdateCountTarget() method
protected void UpdateCountTarget($aCategoryId $aCategoryId, $sTargetType $sTargetType, null $mCallback=NULL)
$aCategoryId $aCategoryId
$sTargetType $sTargetType
$mCallback null
Source Code: /application/classes/modules/category/Category.class.php#293 (show)
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 в таблице категорий)

ValidateCategoryArray() method
public array|bool ValidateCategoryArray(array $aCategoryId, int $iType, bool $bReturnObjects=false)
$aCategoryId array
$iType int
$bReturnObjects bool
{return} array|bool
Source Code: /application/classes/modules/category/Category.class.php#229 (show)
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;
}

Валидирует список категория