ModuleTopic

Package modules.topic
Inheritance class ModuleTopic » Module » LsObject
Since 1.0
Source Code /classes/modules/topic/Topic.class.php
Модуль для работы с топиками

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
aTopicTypes array Список типов топика ModuleTopic
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oEngine Engine Объект ядра Module
oMapperTopic ModuleTopic_MapperTopic Объект маппера ModuleTopic
oUserCurrent ModuleUser_EntityUser|null Объект текущего пользователя ModuleTopic

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddFavouriteTopic() Добавляет топик в избранное ModuleTopic
AddTopic() Добавляет топик ModuleTopic
AddTopicQuestionVote() Добавляет факт голосования за топик-вопрос ModuleTopic
AddTopicTag() Добавление тега к топику ModuleTopic
AddTopicType() Добавляет в новый тип топика ModuleTopic
DeleteFavouriteTopic() Удаляет топик из избранного ModuleTopic
DeleteFavouriteTopicByArrayId() Удаляет топики из избранного по списку ModuleTopic
DeleteTopic() Удаляет топик. ModuleTopic
DeleteTopicAdditionalData() Удаляет свзяанные с топика данные ModuleTopic
DeleteTopicContentByTopicId() Удаление контента топика по его номеру ModuleTopic
DeleteTopicReadByArrayId() Удаляет записи о чтении записей по списку идентификаторов ModuleTopic
DeleteTopicTagsByTopicId() Удаляет теги у топика ModuleTopic
GetCountDraftTopicsByUserId() Количество черновиков у пользователя ModuleTopic
GetCountTopicsByBlogNew() Получает число новых топиков из блога ModuleTopic
GetCountTopicsByFilter() Количество топиков по фильтру ModuleTopic
GetCountTopicsCollectiveNew() Получает число новых топиков в коллективных блогах ModuleTopic
GetCountTopicsFavouriteByUserId() Возвращает число топиков в избранном ModuleTopic
GetCountTopicsPersonalByUser() Возвращает количество топиков которые создал юзер ModuleTopic
GetCountTopicsPersonalNew() Получает число новых топиков в персональных блогах ModuleTopic
GetFavouriteTopic() Получает привязку топика к ибранному(добавлен ли топик в избранное у юзера) ModuleTopic
GetFavouriteTopicsByArray() Получить список избранного по списку айдишников ModuleTopic
GetFavouriteTopicsByArraySolid() Получить список избранного по списку айдишников, но используя единый кеш ModuleTopic
GetLastTopicsByUserId() Возвращает список последних топиков пользователя, опубликованных не более чем $iTimeLimit секунд назад ModuleTopic
GetOpenTopicTags() Получает список тегов из топиков открытых блогов (open,personal) ModuleTopic
GetTopicById() Получить топик по айдишнику ModuleTopic
GetTopicItemsByArrayId() Алиас для корректной работы ORM ModuleTopic
GetTopicPhotosByArrayId() Возвращает список фотографий к топику-фотосет по списку id фоток ModuleTopic
GetTopicQuestionVote() Проверяет голосовал ли юзер за топик-вопрос ModuleTopic
GetTopicRead() Получаем дату прочтения топика юзером ModuleTopic
GetTopicTags() Получает список тегов топиков ModuleTopic
GetTopicTagsByLike() Получает список тегов по первым буквам тега ModuleTopic
GetTopicTypes() Возвращает список типов топика ModuleTopic
GetTopicUnique() Получает топик по уникальному хешу(текст топика) ModuleTopic
GetTopicsAdditionalData() Получает дополнительные данные(объекты) для топиков по их ID ModuleTopic
GetTopicsByArrayId() Получить список топиков по списку айдишников ModuleTopic
GetTopicsByArrayIdSolid() Получить список топиков по списку айдишников, но используя единый кеш ModuleTopic
GetTopicsByBlog() Список топиков из блога ModuleTopic
GetTopicsByBlogId() Получает список топиков из указанного блога ModuleTopic
GetTopicsByFilter() Список топиков по фильтру ModuleTopic
GetTopicsByTag() Получает список топиков по тегу ModuleTopic
GetTopicsCollective() Список топиков из коллективных блогов ModuleTopic
GetTopicsDiscussed() Получает список ВСЕХ обсуждаемых топиков ModuleTopic
GetTopicsFavouriteByUserId() Получает список топиков из избранного ModuleTopic
GetTopicsGood() Получает список хороших топиков для вывода на главную страницу(из всех блогов, как коллективных так и персональных) ModuleTopic
GetTopicsLast() Получает заданое число последних топиков ModuleTopic
GetTopicsNew() Получает список новых топиков, ограничение новизны по дате из конфига ModuleTopic
GetTopicsNewAll() Получает список ВСЕХ новых топиков ModuleTopic
GetTopicsPersonal() список топиков из персональных блогов ModuleTopic
GetTopicsPersonalByUser() Получает список топиков по юзеру ModuleTopic
GetTopicsQuestionVoteByArray() Получить список голосований в топике-опросе по списку айдишников ModuleTopic
GetTopicsQuestionVoteByArraySolid() Получить список голосований в топике-опросе по списку айдишников, но используя единый кеш ModuleTopic
GetTopicsRatingByDate() Получает топики по рейтингу и дате ModuleTopic
GetTopicsReadByArray() Получить список просмотром/чтения топиков по списку айдишников ModuleTopic
GetTopicsReadByArraySolid() Получить список просмотром/чтения топиков по списку айдишников, но используя единый кеш ModuleTopic
GetTopicsTop() Получает список ВСЕХ рейтинговых топиков ModuleTopic
Init() Инициализация ModuleTopic
IsAllowTopicType() Проверяет разрешен ли данный тип топика ModuleTopic
MoveTopics() Перемещает топики в другой блог ModuleTopic
MoveTopicsByArrayId() Перемещает топики в другой блог ModuleTopic
RecalculateFavourite() Пересчитывает счетчик избранных топиков ModuleTopic
RecalculateVote() Пересчитывает счетчики голосований ModuleTopic
SendNotifyTopicNew() Рассылает уведомления о новом топике подписчикам блога ModuleTopic
SetFavouriteTopicPublish() Устанавливает переданный параметр публикации таргета (топика) ModuleTopic
SetInit() Помечает модуль как инициализированный Module
SetTopicRead() Обновляем/устанавливаем дату прочтения топика, если читаем его первый раз то добавляем ModuleTopic
Shutdown() Метод срабатывает при завершении работы ядра Module
UpdateTopic() Обновляет топик ModuleTopic
UploadTopicImageFile() Загрузка изображений при написании топика ModuleTopic
UploadTopicImageUrl() Загрузка изображений по переданному URL ModuleTopic
UploadTopicPhoto() Загрузить изображение ModuleTopic
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Module
__construct() При создании модуля передаем объект ядра Module
addTopicPhoto() Добавить к топику изображение ModuleTopic
deleteTopicPhoto() Удалить изображение ModuleTopic
getCountPhotosByTargetTmp() Получить число изображений из фотосета по id топика ModuleTopic
getCountPhotosByTopicId() Получить число изображений из фотосета по id топика ModuleTopic
getPhotosByTargetTmp() Получить список изображений из фотосета по временному коду ModuleTopic
getPhotosByTopicId() Получить список изображений из фотосета по id топика ModuleTopic
getTopicPhotoById() Получить изображение из фотосета по его id ModuleTopic
increaseTopicCountComment() Увеличивает у топика число комментов ModuleTopic
isInit() Возвращает значение флага инициализации модуля Module
updateTopicPhoto() Обновить данные по изображению ModuleTopic

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
__clone() Блокируем копирование/клонирование объекта Module

Property Details

aTopicTypes property
protected array $aTopicTypes;

Список типов топика

oMapperTopic property
protected ModuleTopic_MapperTopic $oMapperTopic;

Объект маппера

oUserCurrent property
protected ModuleUser_EntityUser|null $oUserCurrent;

Объект текущего пользователя

Method Details

AddFavouriteTopic() method
public bool AddFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
$oFavouriteTopic ModuleFavourite_EntityFavourite Объект избранного
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1176 (show)
public function AddFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic) {
    return 
$this->Favourite_AddFavourite($oFavouriteTopic);
}

Добавляет топик в избранное

AddTopic() method
public ModuleTopic_EntityTopic|bool AddTopic(ModuleTopic_EntityTopic $oTopic)
$oTopic ModuleTopic_EntityTopic Объект топика
{return} ModuleTopic_EntityTopic|bool
Source Code: /classes/modules/topic/Topic.class.php#194 (show)
public function AddTopic(ModuleTopic_EntityTopic $oTopic) {
    if (
$sId=$this->oMapperTopic->AddTopic($oTopic)) {
        
$oTopic->setId($sId);
        if (
$oTopic->getPublish() and $oTopic->getTags()) {
            
$aTags=explode(',',$oTopic->getTags());
            foreach (
$aTags as $sTag) {
                
$oTag=Engine::GetEntity('Topic_TopicTag');
                
$oTag->setTopicId($oTopic->getId());
                
$oTag->setUserId($oTopic->getUserId());
                
$oTag->setBlogId($oTopic->getBlogId());
                
$oTag->setText($sTag);
                
$this->AddTopicTag($oTag);
            }
        }
        
//чистим зависимые кеши
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_new',"topic_update_user_{$oTopic->getUserId()}","topic_new_blog_{$oTopic->getBlogId()}"));
        return 
$oTopic;
    }
    return 
false;
}

Добавляет топик

AddTopicQuestionVote() method
public bool AddTopicQuestionVote(ModuleTopic_EntityTopicQuestionVote $oTopicQuestionVote)
$oTopicQuestionVote ModuleTopic_EntityTopicQuestionVote Объект голосования в топике-опросе
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1463 (show)
public function AddTopicQuestionVote(ModuleTopic_EntityTopicQuestionVote $oTopicQuestionVote) {
    
$this->Cache_Delete("topic_question_vote_{$oTopicQuestionVote->getTopicId()}_{$oTopicQuestionVote->getVoterId()}");
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_question_vote_user_{$oTopicQuestionVote->getVoterId()}"));
    return 
$this->oMapperTopic->AddTopicQuestionVote($oTopicQuestionVote);
}

Добавляет факт голосования за топик-вопрос

AddTopicTag() method
public int AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag)
$oTopicTag ModuleTopic_EntityTopicTag Объект тега топика
{return} int
Source Code: /classes/modules/topic/Topic.class.php#220 (show)
public function AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag) {
    return 
$this->oMapperTopic->AddTopicTag($oTopicTag);
}

Добавление тега к топику

AddTopicType() method
public bool AddTopicType(string $sType)
$sType string Новый тип
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#68 (show)
public function AddTopicType($sType) {
    if (!
in_array($sType,$this->aTopicTypes)) {
        
$this->aTopicTypes[]=$sType;
        return 
true;
    }
    return 
false;
}

Добавляет в новый тип топика

DeleteFavouriteTopic() method
public bool DeleteFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
$oFavouriteTopic ModuleFavourite_EntityFavourite Объект избранного
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1185 (show)
public function DeleteFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic) {
    return 
$this->Favourite_DeleteFavourite($oFavouriteTopic);
}

Удаляет топик из избранного

DeleteFavouriteTopicByArrayId() method
public bool DeleteFavouriteTopicByArrayId(array $aTopicId)
$aTopicId array Список ID топиков
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1204 (show)
public function DeleteFavouriteTopicByArrayId($aTopicId) {
    return 
$this->Favourite_DeleteFavouriteByTargetId($aTopicId'topic');
}

Удаляет топики из избранного по списку

DeleteTopic() method
public bool DeleteTopic(ModuleTopic_EntityTopic|int $oTopicId)
$oTopicId ModuleTopic_EntityTopic|int Объект топика или ID
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#239 (show)
public function DeleteTopic($oTopicId) {
    if (
$oTopicId instanceof ModuleTopic_EntityTopic) {
        
$sTopicId=$oTopicId->getId();
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_update_user_{$oTopicId->getUserId()}"));
    } else {
        
$sTopicId=$oTopicId;
    }
    
/**
     * Чистим зависимые кеши
     */
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update'));
    
$this->Cache_Delete("topic_{$sTopicId}");
    
/**
     * Если топик успешно удален, удаляем связанные данные
     */
    
if($bResult=$this->oMapperTopic->DeleteTopic($sTopicId)){
        return 
$this->DeleteTopicAdditionalData($sTopicId);
    }

    return 
false;
}

Удаляет топик. Если тип таблиц в БД InnoDB, то удалятся всё связи по топику(комменты,голосования,избранное)

DeleteTopicAdditionalData() method
public bool DeleteTopicAdditionalData(int $iTopicId)
$iTopicId int ID топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#266 (show)
public function DeleteTopicAdditionalData($iTopicId) {
    
/**
     * Чистим зависимые кеши
     */
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update'));
    
$this->Cache_Delete("topic_{$iTopicId}");
    
/**
     * Удаляем контент топика
     */
    
$this->DeleteTopicContentByTopicId($iTopicId);
    
/**
     * Удаляем комментарии к топику.
     * При удалении комментариев они удаляются из избранного,прямого эфира и голоса за них
     */
    
$this->Comment_DeleteCommentByTargetId($iTopicId,'topic');
    
/**
     * Удаляем топик из избранного
     */
    
$this->DeleteFavouriteTopicByArrayId($iTopicId);
    
/**
     * Удаляем топик из прочитанного
     */
    
$this->DeleteTopicReadByArrayId($iTopicId);
    
/**
     * Удаляем голосование к топику
     */
    
$this->Vote_DeleteVoteByTarget($iTopicId,'topic');
    
/**
     * Удаляем теги
     */
    
$this->DeleteTopicTagsByTopicId($iTopicId);
    
/**
     * Удаляем фото у топика фотосета
     */
    
if ($aPhotos=$this->getPhotosByTopicId($iTopicId)) {
        foreach (
$aPhotos as $oPhoto) {
            
$this->deleteTopicPhoto($oPhoto);
        }
    }
    return 
true;
}

Удаляет свзяанные с топика данные

DeleteTopicContentByTopicId() method
public bool DeleteTopicContentByTopicId(int $iTopicId)
$iTopicId int ID топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#369 (show)
public function DeleteTopicContentByTopicId($iTopicId) {
    return 
$this->oMapperTopic->DeleteTopicContentByTopicId($iTopicId);
}

Удаление контента топика по его номеру

DeleteTopicReadByArrayId() method
public bool DeleteTopicReadByArrayId(array|int $aTopicId)
$aTopicId array|int Список ID топиков
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1259 (show)
public function DeleteTopicReadByArrayId($aTopicId) {
    if(!
is_array($aTopicId)) $aTopicId = array($aTopicId);
    return 
$this->oMapperTopic->DeleteTopicReadByArrayId($aTopicId);
}

Удаляет записи о чтении записей по списку идентификаторов

DeleteTopicTagsByTopicId() method
public bool DeleteTopicTagsByTopicId(int $sTopicId)
$sTopicId int ID топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#229 (show)
public function DeleteTopicTagsByTopicId($sTopicId) {
    return 
$this->oMapperTopic->DeleteTopicTagsByTopicId($sTopicId);
}

Удаляет теги у топика

GetCountDraftTopicsByUserId() method
public int GetCountDraftTopicsByUserId(int $iUserId)
$iUserId int ID пользователя
{return} int
Source Code: /classes/modules/topic/Topic.class.php#555 (show)
public function GetCountDraftTopicsByUserId($iUserId) {
    return 
$this->GetCountTopicsByFilter(array(
                                             
'user_id' => $iUserId,
                                             
'topic_publish' => 0
                                         
));
}

Количество черновиков у пользователя

GetCountTopicsByBlogNew() method
public int GetCountTopicsByBlogNew(ModuleBlog_EntityBlog $oBlog)
$oBlog ModuleBlog_EntityBlog Объект блога
{return} int
Source Code: /classes/modules/topic/Topic.class.php#1066 (show)
public function GetCountTopicsByBlogNew($oBlog) {
    
$sDate=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
    
$aFilter=array(
        
'topic_publish' => 1,
        
'blog_id' => $oBlog->getId(),
        
'topic_new' => $sDate,

    );
    return 
$this->GetCountTopicsByFilter($aFilter);
}

Получает число новых топиков из блога

GetCountTopicsByFilter() method
public int GetCountTopicsByFilter(array $aFilter)
$aFilter array Фильтр
{return} int
Source Code: /classes/modules/topic/Topic.class.php#541 (show)
public function GetCountTopicsByFilter($aFilter) {
    
$s=serialize($aFilter);
    if (
false === ($data $this->Cache_Get("topic_count_{$s}"))) {
        
$data $this->oMapperTopic->GetCountTopics($aFilter);
        
$this->Cache_Set($data"topic_count_{$s}", array('topic_update','topic_new'), 60*60*24*1);
    }
    return     
$data;
}

Количество топиков по фильтру

GetCountTopicsCollectiveNew() method
public int GetCountTopicsCollectiveNew()
{return} int
Source Code: /classes/modules/topic/Topic.class.php#964 (show)
public function GetCountTopicsCollectiveNew() {
    
$sDate=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
    
$aFilter=array(
        
'blog_type' => array(
            
'open',
        ),
        
'topic_publish' => 1,
        
'topic_new' => $sDate,
    );
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetCountTopicsByFilter($aFilter);
}

Получает число новых топиков в коллективных блогах

GetCountTopicsFavouriteByUserId() method
public int GetCountTopicsFavouriteByUserId(int $sUserId)
$sUserId int ID пользователя
{return} int
Source Code: /classes/modules/topic/Topic.class.php#505 (show)
public function GetCountTopicsFavouriteByUserId($sUserId) {
    
$aCloseTopics = array();
    return (
$this->oUserCurrent && $sUserId==$this->oUserCurrent->getId())
        ? 
$this->Favourite_GetCountFavouritesByUserId($sUserId,'topic',$aCloseTopics)
        : 
$this->Favourite_GetCountFavouriteOpenTopicsByUserId($sUserId);
}

Возвращает число топиков в избранном

GetCountTopicsPersonalByUser() method
public array GetCountTopicsPersonalByUser(int $sUserId, int $iPublish)
$sUserId int ID пользователя
$iPublish int Флаг публикации топика
{return} array
Source Code: /classes/modules/topic/Topic.class.php#857 (show)
public function GetCountTopicsPersonalByUser($sUserId,$iPublish) {
    
$aFilter=array(
        
'topic_publish' => $iPublish,
        
'user_id' => $sUserId,
        
'blog_type' => array('open','personal'),
    );
    
/**
     * Если пользователь смотрит свой профиль, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $this->oUserCurrent->getId()==$sUserId) {
        
$aFilter['blog_type'][]='close';
    }
    
$s=serialize($aFilter);
    if (
false === ($data $this->Cache_Get("topic_count_user_{$s}"))) {
        
$data $this->oMapperTopic->GetCountTopics($aFilter);
        
$this->Cache_Set($data"topic_count_user_{$s}", array("topic_update_user_{$sUserId}"), 60*60*24);
    }
    return     
$data;
}

Возвращает количество топиков которые создал юзер

GetCountTopicsPersonalNew() method
public int GetCountTopicsPersonalNew()
{return} int
Source Code: /classes/modules/topic/Topic.class.php#815 (show)
public function GetCountTopicsPersonalNew() {
    
$sDate=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
        ),
        
'topic_publish' => 1,
        
'topic_new' => $sDate,
    );
    return 
$this->GetCountTopicsByFilter($aFilter);
}

Получает число новых топиков в персональных блогах

GetFavouriteTopic() method
public ModuleFavourite_EntityFavourite GetFavouriteTopic(int $sTopicId, int $sUserId)
$sTopicId int ID топика
$sUserId int ID пользователя
{return} ModuleFavourite_EntityFavourite
Source Code: /classes/modules/topic/Topic.class.php#1147 (show)
public function GetFavouriteTopic($sTopicId,$sUserId) {
    return 
$this->Favourite_GetFavourite($sTopicId,'topic',$sUserId);
}

Получает привязку топика к ибранному(добавлен ли топик в избранное у юзера)

GetFavouriteTopicsByArray() method
public array GetFavouriteTopicsByArray(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1157 (show)
public function GetFavouriteTopicsByArray($aTopicId,$sUserId) {
    return 
$this->Favourite_GetFavouritesByArray($aTopicId,'topic',$sUserId);
}

Получить список избранного по списку айдишников

GetFavouriteTopicsByArraySolid() method
public array GetFavouriteTopicsByArraySolid(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1167 (show)
public function GetFavouriteTopicsByArraySolid($aTopicId,$sUserId) {
    return 
$this->Favourite_GetFavouritesByArraySolid($aTopicId,'topic',$sUserId);
}

Получить список избранного по списку айдишников, но используя единый кеш

GetLastTopicsByUserId() method
public array GetLastTopicsByUserId(int $sUserId, int $iTimeLimit, int $iCountLimit=1, array $aAllowData=array ( ))
$sUserId int ID пользователя
$iTimeLimit int Число секунд
$iCountLimit int Количество
$aAllowData array Список типов данных для подгрузки в топики
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1509 (show)
public function GetLastTopicsByUserId($sUserId,$iTimeLimit,$iCountLimit=1,$aAllowData=array()) {
    
$aFilter = array(
        
'topic_publish' => 1,
        
'user_id' => $sUserId,
        
'topic_new' => date("Y-m-d H:i:s",time()-$iTimeLimit),
    );
    
$aTopics $this->GetTopicsByFilter($aFilter,1,$iCountLimit,$aAllowData);

    return 
$aTopics;
}

Возвращает список последних топиков пользователя, опубликованных не более чем $iTimeLimit секунд назад

GetOpenTopicTags() method
public array GetOpenTopicTags(int $iLimit, int|null $iUserId=NULL)
$iLimit int Количество
$iUserId int|null ID пользователя, чью теги получаем
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1122 (show)
public function GetOpenTopicTags($iLimit,$iUserId=null) {
    if (
false === ($data $this->Cache_Get("tag_{$iLimit}_{$iUserId}_open"))) {
        
$data $this->oMapperTopic->GetOpenTopicTags($iLimit,$iUserId);
        
$this->Cache_Set($data"tag_{$iLimit}_{$iUserId}_open", array('topic_update','topic_new'), 60*60*24*3);
    }
    return 
$data;
}

Получает список тегов из топиков открытых блогов (open,personal)

GetTopicById() method
public ModuleTopic_EntityTopic|null GetTopicById(int $sId)
$sId int ID топика
{return} ModuleTopic_EntityTopic|null
Source Code: /classes/modules/topic/Topic.class.php#378 (show)
public function GetTopicById($sId) {
    if (!
is_numeric($sId)) {
        return 
null;
    }
    
$aTopics=$this->GetTopicsAdditionalData($sId);
    if (isset(
$aTopics[$sId])) {
        return 
$aTopics[$sId];
    }
    return 
null;
}

Получить топик по айдишнику

GetTopicItemsByArrayId() method
public array GetTopicItemsByArrayId(array $aTopocId)
$aTopocId array Список ID топиков
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1853 (show)
public function GetTopicItemsByArrayId($aTopocId) {
    return 
$this->GetTopicsByArrayId($aTopocId);
}

Алиас для корректной работы ORM

GetTopicPhotosByArrayId() method
public array GetTopicPhotosByArrayId(array $aPhotoId)
$aPhotoId array Список ID фото
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1651 (show)
public function GetTopicPhotosByArrayId($aPhotoId) {
    if (!
$aPhotoId) {
        return array();
    }
    if (!
is_array($aPhotoId)) {
        
$aPhotoId=array($aPhotoId);
    }
    
$aPhotoId=array_unique($aPhotoId);
    
$aPhotos=array();
    
$s=join(',',$aPhotoId);
    if (
false === ($data $this->Cache_Get("photoset_photo_id_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicPhotosByArrayId($aPhotoId);
        foreach (
$data as $oPhoto) {
            
$aPhotos[$oPhoto->getId()]=$oPhoto;
        }
        
$this->Cache_Set($aPhotos"photoset_photo_id_{$s}", array("photoset_photo_update"), 60*60*24*1);
        return 
$aPhotos;
    }
    return 
$data;
}

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

GetTopicQuestionVote() method
public ModuleTopic_EntityTopicQuestionVote|null GetTopicQuestionVote(int $sTopicId, int $sUserId)
$sTopicId int ID топика
$sUserId int ID пользователя
{return} ModuleTopic_EntityTopicQuestionVote|null
Source Code: /classes/modules/topic/Topic.class.php#1360 (show)
public function GetTopicQuestionVote($sTopicId,$sUserId) {
    
$data=$this->GetTopicsQuestionVoteByArray($sTopicId,$sUserId);
    if (isset(
$data[$sTopicId])) {
        return 
$data[$sTopicId];
    }
    return 
null;
}

Проверяет голосовал ли юзер за топик-вопрос

GetTopicRead() method
public ModuleTopic_EntityTopicRead|null GetTopicRead(int $sTopicId, int $sUserId)
$sTopicId int ID топика
$sUserId int ID пользователя
{return} ModuleTopic_EntityTopicRead|null
Source Code: /classes/modules/topic/Topic.class.php#1246 (show)
public function GetTopicRead($sTopicId,$sUserId) {
    
$data=$this->GetTopicsReadByArray($sTopicId,$sUserId);
    if (isset(
$data[$sTopicId])) {
        return 
$data[$sTopicId];
    }
    return 
null;
}

Получаем дату прочтения топика юзером

GetTopicTags() method
public array GetTopicTags(int $iLimit, array $aExcludeTopic=array ( ))
$iLimit int Количество
$aExcludeTopic array Список ID топиков для исключения
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1107 (show)
public function GetTopicTags($iLimit,$aExcludeTopic=array()) {
    
$s=serialize($aExcludeTopic);
    if (
false === ($data $this->Cache_Get("tag_{$iLimit}_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicTags($iLimit,$aExcludeTopic);
        
$this->Cache_Set($data"tag_{$iLimit}_{$s}", array('topic_update','topic_new'), 60*60*24*3);
    }
    return 
$data;
}

Получает список тегов топиков

GetTopicTagsByLike() method
public bool GetTopicTagsByLike(string $sTag, int $iLimit)
$sTag string Тэг
$iLimit int Количество
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1214 (show)
public function GetTopicTagsByLike($sTag,$iLimit) {
    if (
false === ($data $this->Cache_Get("tag_like_{$sTag}_{$iLimit}"))) {
        
$data $this->oMapperTopic->GetTopicTagsByLike($sTag,$iLimit);
        
$this->Cache_Set($data"tag_like_{$sTag}_{$iLimit}", array("topic_update","topic_new"), 60*60*24*3);
    }
    return 
$data;
}

Получает список тегов по первым буквам тега

GetTopicTypes() method
public array GetTopicTypes()
{return} array
Source Code: /classes/modules/topic/Topic.class.php#59 (show)
public function GetTopicTypes() {
    return 
$this->aTopicTypes;
}

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

GetTopicUnique() method
public ModuleTopic_EntityTopic|null GetTopicUnique(int $sUserId, string $sHash)
$sUserId int
$sHash string
{return} ModuleTopic_EntityTopic|null
Source Code: /classes/modules/topic/Topic.class.php#1475 (show)
public function GetTopicUnique($sUserId,$sHash) {
    
$sId=$this->oMapperTopic->GetTopicUnique($sUserId,$sHash);
    return 
$this->GetTopicById($sId);
}

Получает топик по уникальному хешу(текст топика)

GetTopicsAdditionalData() method
public array GetTopicsAdditionalData(array $aTopicId, array|null $aAllowData=NULL)
$aTopicId array Список ID топиков
$aAllowData array|null Список типов дополнительных данных, которые нужно подключать к топикам
{return} array
Source Code: /classes/modules/topic/Topic.class.php#91 (show)
public function GetTopicsAdditionalData($aTopicId,$aAllowData=null) {
    if (
is_null($aAllowData)) {
        
$aAllowData=array('user'=>array(),'blog'=>array('owner'=>array(),'relation_user'),'vote','favourite','comment_new');
    }
    
func_array_simpleflip($aAllowData);
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
/**
     * Получаем "голые" топики
     */
    
$aTopics=$this->GetTopicsByArrayId($aTopicId);
    
/**
     * Формируем ID дополнительных данных, которые нужно получить
     */
    
$aUserId=array();
    
$aBlogId=array();
    
$aTopicIdQuestion=array();
    
$aPhotoMainId=array();
    foreach (
$aTopics as $oTopic) {
        if (isset(
$aAllowData['user'])) {
            
$aUserId[]=$oTopic->getUserId();
        }
        if (isset(
$aAllowData['blog'])) {
            
$aBlogId[]=$oTopic->getBlogId();
        }
        if (
$oTopic->getType()=='question')    {
            
$aTopicIdQuestion[]=$oTopic->getId();
        }
        if (
$oTopic->getType()=='photoset' and $oTopic->getPhotosetMainPhotoId())    {
            
$aPhotoMainId[]=$oTopic->getPhotosetMainPhotoId();
        }
    }
    
/**
     * Получаем дополнительные данные
     */
    
$aTopicsVote=array();
    
$aFavouriteTopics=array();
    
$aTopicsQuestionVote=array();
    
$aTopicsRead=array();
    
$aUsers=isset($aAllowData['user']) && is_array($aAllowData['user']) ? $this->User_GetUsersAdditionalData($aUserId,$aAllowData['user']) : $this->User_GetUsersAdditionalData($aUserId);
    
$aBlogs=isset($aAllowData['blog']) && is_array($aAllowData['blog']) ? $this->Blog_GetBlogsAdditionalData($aBlogId,$aAllowData['blog']) : $this->Blog_GetBlogsAdditionalData($aBlogId);
    if (isset(
$aAllowData['vote']) and $this->oUserCurrent) {
        
$aTopicsVote=$this->Vote_GetVoteByArray($aTopicId,'topic',$this->oUserCurrent->getId());
        
$aTopicsQuestionVote=$this->GetTopicsQuestionVoteByArray($aTopicIdQuestion,$this->oUserCurrent->getId());
    }
    if (isset(
$aAllowData['favourite']) and $this->oUserCurrent) {
        
$aFavouriteTopics=$this->GetFavouriteTopicsByArray($aTopicId,$this->oUserCurrent->getId());
    }
    if (isset(
$aAllowData['comment_new']) and $this->oUserCurrent) {
        
$aTopicsRead=$this->GetTopicsReadByArray($aTopicId,$this->oUserCurrent->getId());
    }
    
$aPhotosetMainPhotos=$this->GetTopicPhotosByArrayId($aPhotoMainId);
    
/**
     * Добавляем данные к результату - списку топиков
     */
    
foreach ($aTopics as $oTopic) {
        if (isset(
$aUsers[$oTopic->getUserId()])) {
            
$oTopic->setUser($aUsers[$oTopic->getUserId()]);
        } else {
            
$oTopic->setUser(null); // или $oTopic->setUser(new ModuleUser_EntityUser());
        
}
        if (isset(
$aBlogs[$oTopic->getBlogId()])) {
            
$oTopic->setBlog($aBlogs[$oTopic->getBlogId()]);
        } else {
            
$oTopic->setBlog(null); // или $oTopic->setBlog(new ModuleBlog_EntityBlog());
        
}
        if (isset(
$aTopicsVote[$oTopic->getId()])) {
            
$oTopic->setVote($aTopicsVote[$oTopic->getId()]);
        } else {
            
$oTopic->setVote(null);
        }
        if (isset(
$aFavouriteTopics[$oTopic->getId()])) {
            
$oTopic->setFavourite($aFavouriteTopics[$oTopic->getId()]);
        } else {
            
$oTopic->setFavourite(null);
        }
        if (isset(
$aTopicsQuestionVote[$oTopic->getId()])) {
            
$oTopic->setUserQuestionIsVote(true);
        } else {
            
$oTopic->setUserQuestionIsVote(false);
        }
        if (isset(
$aTopicsRead[$oTopic->getId()]))    {
            
$oTopic->setCountCommentNew($oTopic->getCountComment()-$aTopicsRead[$oTopic->getId()]->getCommentCountLast());
            
$oTopic->setDateRead($aTopicsRead[$oTopic->getId()]->getDateRead());
        } else {
            
$oTopic->setCountCommentNew(0);
            
$oTopic->setDateRead(date("Y-m-d H:i:s"));
        }
        if (isset(
$aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()])) {
            
$oTopic->setPhotosetMainPhoto($aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()]);
        } else {
            
$oTopic->setPhotosetMainPhoto(null);
        }
    }
    return 
$aTopics;
}

Получает дополнительные данные(объекты) для топиков по их ID

GetTopicsByArrayId() method
public array GetTopicsByArrayId(array $aTopicId)
$aTopicId array Список ID топиков
{return} array
Source Code: /classes/modules/topic/Topic.class.php#394 (show)
public function GetTopicsByArrayId($aTopicId) {
    if (!
$aTopicId) {
        return array();
    }
    if (
Config::Get('sys.cache.solid')) {
        return 
$this->GetTopicsByArrayIdSolid($aTopicId);
    }

    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopics=array();
    
$aTopicIdNotNeedQuery=array();
    
/**
     * Делаем мульти-запрос к кешу
     */
    
$aCacheKeys=func_build_cache_keys($aTopicId,'topic_');
    if (
false !== ($data $this->Cache_Get($aCacheKeys))) {
        
/**
         * проверяем что досталось из кеша
         */
        
foreach ($aCacheKeys as $sValue => $sKey ) {
            if (
array_key_exists($sKey,$data)) {
                if (
$data[$sKey]) {
                    
$aTopics[$data[$sKey]->getId()]=$data[$sKey];
                } else {
                    
$aTopicIdNotNeedQuery[]=$sValue;
                }
            }
        }
    }
    
/**
     * Смотрим каких топиков не было в кеше и делаем запрос в БД
     */
    
$aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopics));
    
$aTopicIdNeedQuery=array_diff($aTopicIdNeedQuery,$aTopicIdNotNeedQuery);
    
$aTopicIdNeedStore=$aTopicIdNeedQuery;
    if (
$data $this->oMapperTopic->GetTopicsByArrayId($aTopicIdNeedQuery)) {
        foreach (
$data as $oTopic) {
            
/**
             * Добавляем к результату и сохраняем в кеш
             */
            
$aTopics[$oTopic->getId()]=$oTopic;
            
$this->Cache_Set($oTopic"topic_{$oTopic->getId()}", array(), 60*60*24*4);
            
$aTopicIdNeedStore=array_diff($aTopicIdNeedStore,array($oTopic->getId()));
        }
    }
    
/**
     * Сохраняем в кеш запросы не вернувшие результата
     */
    
foreach ($aTopicIdNeedStore as $sId) {
        
$this->Cache_Set(null"topic_{$sId}", array(), 60*60*24*4);
    }
    
/**
     * Сортируем результат согласно входящему массиву
     */
    
$aTopics=func_array_sort_by_keys($aTopics,$aTopicId);
    return 
$aTopics;
}

Получить список топиков по списку айдишников

GetTopicsByArrayIdSolid() method
public array GetTopicsByArrayIdSolid(array $aTopicId)
$aTopicId array Список ID топиков
{return} array
Source Code: /classes/modules/topic/Topic.class.php#460 (show)
public function GetTopicsByArrayIdSolid($aTopicId) {
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopics=array();
    
$s=join(',',$aTopicId);
    if (
false === ($data $this->Cache_Get("topic_id_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicsByArrayId($aTopicId);
        foreach (
$data as $oTopic) {
            
$aTopics[$oTopic->getId()]=$oTopic;
        }
        
$this->Cache_Set($aTopics"topic_id_{$s}", array("topic_update"), 60*60*24*1);
        return 
$aTopics;
    }
    return 
$data;
}

Получить список топиков по списку айдишников, но используя единый кеш

GetTopicsByBlog() method
public array GetTopicsByBlog(ModuleBlog_EntityBlog $oBlog, int $iPage, int $iPerPage, string $sShowType='good', string $sPeriod=NULL)
$oBlog ModuleBlog_EntityBlog Объект блога
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$sShowType string Тип выборки топиков
$sPeriod string Период в виде секунд или конкретной даты
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1017 (show)
public function GetTopicsByBlog($oBlog,$iPage,$iPerPage,$sShowType='good',$sPeriod=null) {
    if (
is_numeric($sPeriod)) {
        
// количество последних секунд
        
$sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
    }
    
$aFilter=array(
        
'topic_publish' => 1,
        
'blog_id' => $oBlog->getId(),
    );
    if (
$sPeriod) {
        
$aFilter['topic_date_more'] = $sPeriod;
    }
    switch (
$sShowType) {
        case 
'good':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.collective_good'),
                
'type'  => 'top',
            );
            break;
        case 
'bad':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.collective_good'),
                
'type'  => 'down',
            );
            break;
        case 
'new':
            
$aFilter['topic_new']=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
            break;
        case 
'newall':
            
// нет доп фильтра
            
break;
        case 
'discussed':
            
$aFilter['order']=array('t.topic_count_comment desc','t.topic_id desc');
            break;
        case 
'top':
            
$aFilter['order']=array('t.topic_rating desc','t.topic_id desc');
            break;
        default:
            break;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Список топиков из блога

GetTopicsByBlogId() method
public array GetTopicsByBlogId(int $iBlogId, int $iPage=0, int $iPerPage=0, array $aAllowData=array ( ), bool $bIdsOnly=true)
$iBlogId int ID блога
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$aAllowData array Список типов данных для подгрузки в топики
$bIdsOnly bool Возвращать только ID или список объектов
{return} array
Source Code: /classes/modules/topic/Topic.class.php#887 (show)
public function GetTopicsByBlogId($iBlogId,$iPage=0,$iPerPage=0,$aAllowData=array(),$bIdsOnly=true) {
    
$aFilter=array('blog_id'=>$iBlogId);

    if(!
$aTopics $this->GetTopicsByFilter($aFilter,$iPage,$iPerPage,$aAllowData) ) {
        return 
false;
    }

    return (
$bIdsOnly)
        ? 
array_keys($aTopics['collection'])
        : 
$aTopics;
}

Получает список топиков из указанного блога

GetTopicsByFilter() method
public array('collection'=>array,'count'=>int) GetTopicsByFilter(array $aFilter, int $iPage=1, int $iPerPage=10, array|null $aAllowData=NULL)
$aFilter array Фильтр
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$aAllowData array|null Список типов данных для подгрузки в топики
{return} array('collection'=>array,'count'=>int)
Source Code: /classes/modules/topic/Topic.class.php#520 (show)
public function GetTopicsByFilter($aFilter,$iPage=1,$iPerPage=10,$aAllowData=null) {
    if (!
is_numeric($iPage) or $iPage<=0) {
        
$iPage=1;
    }
    
$s=serialize($aFilter);
    if (
false === ($data $this->Cache_Get("topic_filter_{$s}_{$iPage}_{$iPerPage}"))) {
        
$data = array(
            
'collection'=>$this->oMapperTopic->GetTopics($aFilter,$iCount,$iPage,$iPerPage),
            
'count'=>$iCount
        
);
        
$this->Cache_Set($data"topic_filter_{$s}_{$iPage}_{$iPerPage}", array('topic_update','topic_new'), 60*60*24*3);
    }
    
$data['collection']=$this->GetTopicsAdditionalData($data['collection'],$aAllowData);
    return 
$data;
}

Список топиков по фильтру

GetTopicsByTag() method
public array GetTopicsByTag(string $sTag, int $iPage, int $iPerPage, bool $bAddAccessible=true)
$sTag string Тег
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1087 (show)
public function GetTopicsByTag($sTag,$iPage,$iPerPage,$bAddAccessible=true) {
    
$aCloseBlogs = ($this->oUserCurrent && $bAddAccessible)
        ? 
$this->Blog_GetInaccessibleBlogsByUser($this->oUserCurrent)
        : 
$this->Blog_GetInaccessibleBlogsByUser();

    
$s serialize($aCloseBlogs);
    if (
false === ($data $this->Cache_Get("topic_tag_{$sTag}_{$iPage}_{$iPerPage}_{$s}"))) {
        
$data = array('collection'=>$this->oMapperTopic->GetTopicsByTag($sTag,$aCloseBlogs,$iCount,$iPage,$iPerPage),'count'=>$iCount);
        
$this->Cache_Set($data"topic_tag_{$sTag}_{$iPage}_{$iPerPage}_{$s}", array('topic_update','topic_new'), 60*60*24*2);
    }
    
$data['collection']=$this->GetTopicsAdditionalData($data['collection']);
    return 
$data;
}

Получает список топиков по тегу

GetTopicsCollective() method
public array GetTopicsCollective(int $iPage, int $iPerPage, string $sShowType='good', string $sPeriod=NULL)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$sShowType string Тип выборки топиков
$sPeriod string Период в виде секунд или конкретной даты
{return} array
Source Code: /classes/modules/topic/Topic.class.php#907 (show)
public function GetTopicsCollective($iPage,$iPerPage,$sShowType='good',$sPeriod=null) {
    if (
is_numeric($sPeriod)) {
        
// количество последних секунд
        
$sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
    }
    
$aFilter=array(
        
'blog_type' => array(
            
'open',
        ),
        
'topic_publish' => 1,
    );
    if (
$sPeriod) {
        
$aFilter['topic_date_more'] = $sPeriod;
    }
    switch (
$sShowType) {
        case 
'good':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.collective_good'),
                
'type'  => 'top',
            );
            break;
        case 
'bad':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.collective_good'),
                
'type'  => 'down',
            );
            break;
        case 
'new':
            
$aFilter['topic_new']=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
            break;
        case 
'newall':
            
// нет доп фильтра
            
break;
        case 
'discussed':
            
$aFilter['order']=array('t.topic_count_comment desc','t.topic_id desc');
            break;
        case 
'top':
            
$aFilter['order']=array('t.topic_rating desc','t.topic_id desc');
            break;
        default:
            break;
    }
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Список топиков из коллективных блогов

GetTopicsDiscussed() method
public array GetTopicsDiscussed(int $iPage, int $iPerPage, int|string $sPeriod=NULL, bool $bAddAccessible=true)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$sPeriod int|string Период в виде секунд или конкретной даты
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#664 (show)
public function GetTopicsDiscussed($iPage,$iPerPage,$sPeriod=null,$bAddAccessible=true) {
    if (
is_numeric($sPeriod)) {
        
// количество последних секунд
        
$sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
    }

    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open',
        ),
        
'topic_publish' => 1
    
);
    if (
$sPeriod) {
        
$aFilter['topic_date_more'] = $sPeriod;
    }
    
$aFilter['order']=' t.topic_count_comment desc, t.topic_id desc ';
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $bAddAccessible) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список ВСЕХ обсуждаемых топиков

GetTopicsFavouriteByUserId() method
public array('collection'=>array,'count'=>int) GetTopicsFavouriteByUserId(int $sUserId, int $iCurrPage, int $iPerPage)
$sUserId int ID пользователя
$iCurrPage int Номер текущей страницы
$iPerPage int Количество элементов на страницу
{return} array('collection'=>array,'count'=>int)
Source Code: /classes/modules/topic/Topic.class.php#485 (show)
public function GetTopicsFavouriteByUserId($sUserId,$iCurrPage,$iPerPage) {
    
$aCloseTopics =array();
    
/**
     * Получаем список идентификаторов избранных записей
     */
    
$data = ($this->oUserCurrent && $sUserId==$this->oUserCurrent->getId())
        ? 
$this->Favourite_GetFavouritesByUserId($sUserId,'topic',$iCurrPage,$iPerPage,$aCloseTopics)
        : 
$this->Favourite_GetFavouriteOpenTopicsByUserId($sUserId,$iCurrPage,$iPerPage);
    
/**
     * Получаем записи по переданому массиву айдишников
     */
    
$data['collection']=$this->GetTopicsAdditionalData($data['collection']);
    return 
$data;
}

Получает список топиков из избранного

GetTopicsGood() method
public array GetTopicsGood(int $iPage, int $iPerPage, bool $bAddAccessible=true)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#571 (show)
public function GetTopicsGood($iPage,$iPerPage,$bAddAccessible=true) {
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open'
        
),
        
'topic_publish' => 1,
        
'topic_rating'  => array(
            
'value' => Config::Get('module.blog.index_good'),
            
'type'  => 'top',
            
'publish_index'  => 1,
        )
    );
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $bAddAccessible) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }

    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список хороших топиков для вывода на главную страницу(из всех блогов, как коллективных так и персональных)

GetTopicsLast() method
public array GetTopicsLast(int $iCount)
$iCount int Количество
{return} array
Source Code: /classes/modules/topic/Topic.class.php#735 (show)
public function GetTopicsLast($iCount) {
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open',
        ),
        
'topic_publish' => 1,
    );
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    
$aReturn=$this->GetTopicsByFilter($aFilter,1,$iCount);
    if (isset(
$aReturn['collection'])) {
        return 
$aReturn['collection'];
    }
    return 
false;
}

Получает заданое число последних топиков

GetTopicsNew() method
public array GetTopicsNew(int $iPage, int $iPerPage, bool $bAddAccessible=true)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#605 (show)
public function GetTopicsNew($iPage,$iPerPage,$bAddAccessible=true) {
    
$sDate=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open',
        ),
        
'topic_publish' => 1,
        
'topic_new' => $sDate,
    );
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $bAddAccessible) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список новых топиков, ограничение новизны по дате из конфига

GetTopicsNewAll() method
public array GetTopicsNewAll(int $iPage, int $iPerPage, bool $bAddAccessible=true)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#635 (show)
public function GetTopicsNewAll($iPage,$iPerPage,$bAddAccessible=true) {
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open',
        ),
        
'topic_publish' => 1,
    );
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $bAddAccessible) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список ВСЕХ новых топиков

GetTopicsPersonal() method
public array GetTopicsPersonal(int $iPage, int $iPerPage, string $sShowType='good', string|int $sPeriod=NULL)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$sShowType string Тип выборки топиков
$sPeriod string|int Период в виде секунд или конкретной даты
{return} array
Source Code: /classes/modules/topic/Topic.class.php#766 (show)
public function GetTopicsPersonal($iPage,$iPerPage,$sShowType='good',$sPeriod=null) {
    if (
is_numeric($sPeriod)) {
        
// количество последних секунд
        
$sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
    }
    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
        ),
        
'topic_publish' => 1,
    );
    if (
$sPeriod) {
        
$aFilter['topic_date_more'] = $sPeriod;
    }
    switch (
$sShowType) {
        case 
'good':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.personal_good'),
                
'type'  => 'top',
            );
            break;
        case 
'bad':
            
$aFilter['topic_rating']=array(
                
'value' => Config::Get('module.blog.personal_good'),
                
'type'  => 'down',
            );
            break;
        case 
'new':
            
$aFilter['topic_new']=date("Y-m-d H:00:00",time()-Config::Get('module.topic.new_time'));
            break;
        case 
'newall':
            
// нет доп фильтра
            
break;
        case 
'discussed':
            
$aFilter['order']=array('t.topic_count_comment desc','t.topic_id desc');
            break;
        case 
'top':
            
$aFilter['order']=array('t.topic_rating desc','t.topic_id desc');
            break;
        default:
            break;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

список топиков из персональных блогов

GetTopicsPersonalByUser() method
public array GetTopicsPersonalByUser(int $sUserId, int $iPublish, int $iPage, int $iPerPage)
$sUserId int ID пользователя
$iPublish int Флаг публикации топика
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
{return} array
Source Code: /classes/modules/topic/Topic.class.php#835 (show)
public function GetTopicsPersonalByUser($sUserId,$iPublish,$iPage,$iPerPage) {
    
$aFilter=array(
        
'topic_publish' => $iPublish,
        
'user_id' => $sUserId,
        
'blog_type' => array('open','personal'),
    );
    
/**
     * Если пользователь смотрит свой профиль, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $this->oUserCurrent->getId()==$sUserId) {
        
$aFilter['blog_type'][]='close';
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список топиков по юзеру

GetTopicsQuestionVoteByArray() method
public array GetTopicsQuestionVoteByArray(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1374 (show)
public function GetTopicsQuestionVoteByArray($aTopicId,$sUserId) {
    if (!
$aTopicId) {
        return array();
    }
    if (
Config::Get('sys.cache.solid')) {
        return 
$this->GetTopicsQuestionVoteByArraySolid($aTopicId,$sUserId);
    }
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopicsQuestionVote=array();
    
$aTopicIdNotNeedQuery=array();
    
/**
     * Делаем мульти-запрос к кешу
     */
    
$aCacheKeys=func_build_cache_keys($aTopicId,'topic_question_vote_','_'.$sUserId);
    if (
false !== ($data $this->Cache_Get($aCacheKeys))) {
        
/**
         * проверяем что досталось из кеша
         */
        
foreach ($aCacheKeys as $sValue => $sKey ) {
            if (
array_key_exists($sKey,$data)) {
                if (
$data[$sKey]) {
                    
$aTopicsQuestionVote[$data[$sKey]->getTopicId()]=$data[$sKey];
                } else {
                    
$aTopicIdNotNeedQuery[]=$sValue;
                }
            }
        }
    }
    
/**
     * Смотрим каких топиков не было в кеше и делаем запрос в БД
     */
    
$aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopicsQuestionVote));
    
$aTopicIdNeedQuery=array_diff($aTopicIdNeedQuery,$aTopicIdNotNeedQuery);
    
$aTopicIdNeedStore=$aTopicIdNeedQuery;
    if (
$data $this->oMapperTopic->GetTopicsQuestionVoteByArray($aTopicIdNeedQuery,$sUserId)) {
        foreach (
$data as $oTopicVote) {
            
/**
             * Добавляем к результату и сохраняем в кеш
             */
            
$aTopicsQuestionVote[$oTopicVote->getTopicId()]=$oTopicVote;
            
$this->Cache_Set($oTopicVote"topic_question_vote_{$oTopicVote->getTopicId()}_{$oTopicVote->getVoterId()}", array(), 60*60*24*4);
            
$aTopicIdNeedStore=array_diff($aTopicIdNeedStore,array($oTopicVote->getTopicId()));
        }
    }
    
/**
     * Сохраняем в кеш запросы не вернувшие результата
     */
    
foreach ($aTopicIdNeedStore as $sId) {
        
$this->Cache_Set(null"topic_question_vote_{$sId}_{$sUserId}", array(), 60*60*24*4);
    }
    
/**
     * Сортируем результат согласно входящему массиву
     */
    
$aTopicsQuestionVote=func_array_sort_by_keys($aTopicsQuestionVote,$aTopicId);
    return 
$aTopicsQuestionVote;
}

Получить список голосований в топике-опросе по списку айдишников

GetTopicsQuestionVoteByArraySolid() method
public array GetTopicsQuestionVoteByArraySolid(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1440 (show)
public function GetTopicsQuestionVoteByArraySolid($aTopicId,$sUserId) {
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopicsQuestionVote=array();
    
$s=join(',',$aTopicId);
    if (
false === ($data $this->Cache_Get("topic_question_vote_{$sUserId}_id_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicsQuestionVoteByArray($aTopicId,$sUserId);
        foreach (
$data as $oTopicVote) {
            
$aTopicsQuestionVote[$oTopicVote->getTopicId()]=$oTopicVote;
        }
        
$this->Cache_Set($aTopicsQuestionVote"topic_question_vote_{$sUserId}_id_{$s}", array("topic_question_vote_user_{$sUserId}"), 60*60*24*1);
        return 
$aTopicsQuestionVote;
    }
    return 
$data;
}

Получить список голосований в топике-опросе по списку айдишников, но используя единый кеш

GetTopicsRatingByDate() method
public array GetTopicsRatingByDate(string $sDate, int $iLimit=20)
$sDate string Дата
$iLimit int Количество
{return} array
Source Code: /classes/modules/topic/Topic.class.php#990 (show)
public function GetTopicsRatingByDate($sDate,$iLimit=20) {
    
/**
     * Получаем список блогов, топики которых нужно исключить из выдачи
     */
    
$aCloseBlogs = ($this->oUserCurrent)
        ? 
$this->Blog_GetInaccessibleBlogsByUser($this->oUserCurrent)
        : 
$this->Blog_GetInaccessibleBlogsByUser();

    
$s=serialize($aCloseBlogs);

    if (
false === ($data $this->Cache_Get("topic_rating_{$sDate}_{$iLimit}_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicsRatingByDate($sDate,$iLimit,$aCloseBlogs);
        
$this->Cache_Set($data"topic_rating_{$sDate}_{$iLimit}_{$s}", array('topic_update'), 60*60*24*2);
    }
    
$data=$this->GetTopicsAdditionalData($data);
    return 
$data;
}

Получает топики по рейтингу и дате

GetTopicsReadByArray() method
public array GetTopicsReadByArray(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1270 (show)
public function GetTopicsReadByArray($aTopicId,$sUserId) {
    if (!
$aTopicId) {
        return array();
    }
    if (
Config::Get('sys.cache.solid')) {
        return 
$this->GetTopicsReadByArraySolid($aTopicId,$sUserId);
    }
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopicsRead=array();
    
$aTopicIdNotNeedQuery=array();
    
/**
     * Делаем мульти-запрос к кешу
     */
    
$aCacheKeys=func_build_cache_keys($aTopicId,'topic_read_','_'.$sUserId);
    if (
false !== ($data $this->Cache_Get($aCacheKeys))) {
        
/**
         * проверяем что досталось из кеша
         */
        
foreach ($aCacheKeys as $sValue => $sKey ) {
            if (
array_key_exists($sKey,$data)) {
                if (
$data[$sKey]) {
                    
$aTopicsRead[$data[$sKey]->getTopicId()]=$data[$sKey];
                } else {
                    
$aTopicIdNotNeedQuery[]=$sValue;
                }
            }
        }
    }
    
/**
     * Смотрим каких топиков не было в кеше и делаем запрос в БД
     */
    
$aTopicIdNeedQuery=array_diff($aTopicId,array_keys($aTopicsRead));
    
$aTopicIdNeedQuery=array_diff($aTopicIdNeedQuery,$aTopicIdNotNeedQuery);
    
$aTopicIdNeedStore=$aTopicIdNeedQuery;
    if (
$data $this->oMapperTopic->GetTopicsReadByArray($aTopicIdNeedQuery,$sUserId)) {
        foreach (
$data as $oTopicRead) {
            
/**
             * Добавляем к результату и сохраняем в кеш
             */
            
$aTopicsRead[$oTopicRead->getTopicId()]=$oTopicRead;
            
$this->Cache_Set($oTopicRead"topic_read_{$oTopicRead->getTopicId()}_{$oTopicRead->getUserId()}", array(), 60*60*24*4);
            
$aTopicIdNeedStore=array_diff($aTopicIdNeedStore,array($oTopicRead->getTopicId()));
        }
    }
    
/**
     * Сохраняем в кеш запросы не вернувшие результата
     */
    
foreach ($aTopicIdNeedStore as $sId) {
        
$this->Cache_Set(null"topic_read_{$sId}_{$sUserId}", array(), 60*60*24*4);
    }
    
/**
     * Сортируем результат согласно входящему массиву
     */
    
$aTopicsRead=func_array_sort_by_keys($aTopicsRead,$aTopicId);
    return 
$aTopicsRead;
}

Получить список просмотром/чтения топиков по списку айдишников

GetTopicsReadByArraySolid() method
public array GetTopicsReadByArraySolid(array $aTopicId, int $sUserId)
$aTopicId array Список ID топиков
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1336 (show)
public function GetTopicsReadByArraySolid($aTopicId,$sUserId) {
    if (!
is_array($aTopicId)) {
        
$aTopicId=array($aTopicId);
    }
    
$aTopicId=array_unique($aTopicId);
    
$aTopicsRead=array();
    
$s=join(',',$aTopicId);
    if (
false === ($data $this->Cache_Get("topic_read_{$sUserId}_id_{$s}"))) {
        
$data $this->oMapperTopic->GetTopicsReadByArray($aTopicId,$sUserId);
        foreach (
$data as $oTopicRead) {
            
$aTopicsRead[$oTopicRead->getTopicId()]=$oTopicRead;
        }
        
$this->Cache_Set($aTopicsRead"topic_read_{$sUserId}_id_{$s}", array("topic_read_user_{$sUserId}"), 60*60*24*1);
        return 
$aTopicsRead;
    }
    return 
$data;
}

Получить список просмотром/чтения топиков по списку айдишников, но используя единый кеш

GetTopicsTop() method
public array GetTopicsTop(int $iPage, int $iPerPage, int|string $sPeriod=NULL, bool $bAddAccessible=true)
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
$sPeriod int|string Период в виде секунд или конкретной даты
$bAddAccessible bool Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов.
{return} array
Source Code: /classes/modules/topic/Topic.class.php#702 (show)
public function GetTopicsTop($iPage,$iPerPage,$sPeriod=null,$bAddAccessible=true) {
    if (
is_numeric($sPeriod)) {
        
// количество последних секунд
        
$sPeriod=date("Y-m-d H:00:00",time()-$sPeriod);
    }

    
$aFilter=array(
        
'blog_type' => array(
            
'personal',
            
'open',
        ),
        
'topic_publish' => 1
    
);
    if (
$sPeriod) {
        
$aFilter['topic_date_more'] = $sPeriod;
    }
    
$aFilter['order']=array('t.topic_rating desc','t.topic_id desc');
    
/**
     * Если пользователь авторизирован, то добавляем в выдачу
     * закрытые блоги в которых он состоит
     */
    
if($this->oUserCurrent && $bAddAccessible) {
        
$aOpenBlogs $this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent);
        if(
count($aOpenBlogs)) $aFilter['blog_type']['close'] = $aOpenBlogs;
    }
    return 
$this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
}

Получает список ВСЕХ рейтинговых топиков

Init() method
public void Init()
Source Code: /classes/modules/topic/Topic.class.php#50 (show)
public function Init() {
    
$this->oMapperTopic=Engine::GetMapper(__CLASS__);
    
$this->oUserCurrent=$this->User_GetUserCurrent();
}

Инициализация

IsAllowTopicType() method
public bool IsAllowTopicType(string $sType)
$sType string Тип
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#81 (show)
public function IsAllowTopicType($sType) {
    return 
in_array($sType,$this->aTopicTypes);
}

Проверяет разрешен ли данный тип топика

MoveTopics() method
public bool MoveTopics(int $sBlogId, int $sBlogIdNew)
$sBlogId int ID старого блога
$sBlogIdNew int ID нового блога
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1546 (show)
public function MoveTopics($sBlogId,$sBlogIdNew) {
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_update""topic_new_blog_{$sBlogId}""topic_new_blog_{$sBlogIdNew}"));
    if (
$res=$this->oMapperTopic->MoveTopics($sBlogId,$sBlogIdNew)) {
        
// перемещаем теги
        
$this->oMapperTopic->MoveTopicsTags($sBlogId,$sBlogIdNew);
        
// меняем target parent у комментов
        
$this->Comment_MoveTargetParent($sBlogId'topic'$sBlogIdNew);
        
// меняем target parent у комментов в прямом эфире
        
$this->Comment_MoveTargetParentOnline($sBlogId'topic'$sBlogIdNew);
        return 
$res;
    }
    return 
false;
}

Перемещает топики в другой блог

MoveTopicsByArrayId() method
public bool MoveTopicsByArrayId(array $aTopics, int $sBlogId)
$aTopics array Список ID топиков
$sBlogId int ID блога
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1526 (show)
public function MoveTopicsByArrayId($aTopics,$sBlogId) {
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_update""topic_new_blog_{$sBlogId}"));
    if (
$res=$this->oMapperTopic->MoveTopicsByArrayId($aTopics,$sBlogId)) {
        
// перемещаем теги
        
$this->oMapperTopic->MoveTopicsTagsByArrayId($aTopics,$sBlogId);
        
// меняем target parent у комментов
        
$this->Comment_UpdateTargetParentByTargetId($sBlogId'topic'$aTopics);
        
// меняем target parent у комментов в прямом эфире
        
$this->Comment_UpdateTargetParentByTargetIdOnline($sBlogId'topic'$aTopics);
        return 
$res;
    }
    return 
false;
}

Перемещает топики в другой блог

RecalculateFavourite() method
public bool RecalculateFavourite()
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1836 (show)
public function RecalculateFavourite(){
    return 
$this->oMapperTopic->RecalculateFavourite();
}

Пересчитывает счетчик избранных топиков

RecalculateVote() method
public bool RecalculateVote()
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1844 (show)
public function RecalculateVote(){
    return 
$this->oMapperTopic->RecalculateVote();
}

Пересчитывает счетчики голосований

SendNotifyTopicNew() method
public void SendNotifyTopicNew(ModuleBlog_EntityBlog $oBlog, ModuleTopic_EntityTopic $oTopic, ModuleUser_EntityUser $oUserTopic)
$oBlog ModuleBlog_EntityBlog Объект блога
$oTopic ModuleTopic_EntityTopic Объект топика
$oUserTopic ModuleUser_EntityUser Объект пользователя
Source Code: /classes/modules/topic/Topic.class.php#1486 (show)
public function SendNotifyTopicNew($oBlog,$oTopic,$oUserTopic) {
    
$aBlogUsersResult=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),null,null); // нужно постранично пробегаться по всем
    
$aBlogUsers=$aBlogUsersResult['collection'];
    foreach (
$aBlogUsers as $oBlogUser) {
        if (
$oBlogUser->getUserId()==$oUserTopic->getId()) {
            continue;
        }
        
$this->Notify_SendTopicNewToSubscribeBlog($oBlogUser->getUser(),$oTopic,$oBlog,$oUserTopic);
    }
    
//отправляем создателю блога
    
if ($oBlog->getOwnerId()!=$oUserTopic->getId()) {
        
$this->Notify_SendTopicNewToSubscribeBlog($oBlog->getOwner(),$oTopic,$oBlog,$oUserTopic);
    }
}

Рассылает уведомления о новом топике подписчикам блога

SetFavouriteTopicPublish() method
public bool SetFavouriteTopicPublish(int $sTopicId, int $iPublish)
$sTopicId int ID топика
$iPublish int Флаг публикации топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1195 (show)
public function SetFavouriteTopicPublish($sTopicId,$iPublish) {
    return 
$this->Favourite_SetFavouriteTargetPublish($sTopicId,'topic',$iPublish);
}

Устанавливает переданный параметр публикации таргета (топика)

SetTopicRead() method
public bool SetTopicRead(ModuleTopic_EntityTopicRead $oTopicRead)
$oTopicRead ModuleTopic_EntityTopicRead Объект факта чтения топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1227 (show)
public function SetTopicRead(ModuleTopic_EntityTopicRead $oTopicRead) {
    if (
$this->GetTopicRead($oTopicRead->getTopicId(),$oTopicRead->getUserId())) {
        
$this->Cache_Delete("topic_read_{$oTopicRead->getTopicId()}_{$oTopicRead->getUserId()}");
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_read_user_{$oTopicRead->getUserId()}"));
        
$this->oMapperTopic->UpdateTopicRead($oTopicRead);
    } else {
        
$this->Cache_Delete("topic_read_{$oTopicRead->getTopicId()}_{$oTopicRead->getUserId()}");
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_read_user_{$oTopicRead->getUserId()}"));
        
$this->oMapperTopic->AddTopicRead($oTopicRead);
    }
    return 
true;
}

Обновляем/устанавливаем дату прочтения топика, если читаем его первый раз то добавляем

UpdateTopic() method
public bool UpdateTopic(ModuleTopic_EntityTopic $oTopic)
$oTopic ModuleTopic_EntityTopic Объект топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#313 (show)
public function UpdateTopic(ModuleTopic_EntityTopic $oTopic) {
    
/**
     * Получаем топик ДО изменения
     */
    
$oTopicOld=$this->GetTopicById($oTopic->getId());
    
$oTopic->setDateEdit(date("Y-m-d H:i:s"));
    if (
$this->oMapperTopic->UpdateTopic($oTopic)) {
        
/**
         * Если топик изменил видимость(publish) или локацию (BlogId) или список тегов
         */
        
if (($oTopic->getPublish()!=$oTopicOld->getPublish()) || ($oTopic->getBlogId()!=$oTopicOld->getBlogId()) || ($oTopic->getTags()!=$oTopicOld->getTags())) {
            
/**
             * Обновляем теги
             */
            
$this->DeleteTopicTagsByTopicId($oTopic->getId());
            if (
$oTopic->getPublish() and $oTopic->getTags()) {
                
$aTags=explode(',',$oTopic->getTags());
                foreach (
$aTags as $sTag) {
                    
$oTag=Engine::GetEntity('Topic_TopicTag');
                    
$oTag->setTopicId($oTopic->getId());
                    
$oTag->setUserId($oTopic->getUserId());
                    
$oTag->setBlogId($oTopic->getBlogId());
                    
$oTag->setText($sTag);
                    
$this->AddTopicTag($oTag);
                }
            }
        }
        if (
$oTopic->getPublish()!=$oTopicOld->getPublish()) {
            
/**
             * Обновляем избранное
             */
            
$this->SetFavouriteTopicPublish($oTopic->getId(),$oTopic->getPublish());
            
/**
             * Удаляем комментарий топика из прямого эфира
             */
            
if ($oTopic->getPublish()==0) {
                
$this->Comment_DeleteCommentOnlineByTargetId($oTopic->getId(),'topic');
            }
            
/**
             * Изменяем видимость комментов
             */
            
$this->Comment_SetCommentsPublish($oTopic->getId(),'topic',$oTopic->getPublish());
        }
        
//чистим зависимые кеши            
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update',"topic_update_user_{$oTopic->getUserId()}"));
        
$this->Cache_Delete("topic_{$oTopic->getId()}");
        return 
true;
    }
    return 
false;
}

Обновляет топик

UploadTopicImageFile() method
public string|bool UploadTopicImageFile(array $aFile, ModuleUser_EntityUser $oUser)
$aFile array Массив $_FILES
$oUser ModuleUser_EntityUser Объект пользователя
{return} string|bool
Source Code: /classes/modules/topic/Topic.class.php#1566 (show)
public function UploadTopicImageFile($aFile,$oUser) {
    if(!
is_array($aFile) || !isset($aFile['tmp_name'])) {
        return 
false;
    }

    
$sFileTmp=Config::Get('sys.cache.dir').func_generator();
    if (!
move_uploaded_file($aFile['tmp_name'],$sFileTmp)) {
        return 
false;
    }
    
$sDirUpload=$this->Image_GetIdDir($oUser->getId());
    
$aParams=$this->Image_BuildParams('topic');

    if (
$sFileImage=$this->Image_Resize($sFileTmp,$sDirUpload,func_generator(6),Config::Get('view.img_max_width'),Config::Get('view.img_max_height'),Config::Get('view.img_resize_width'),null,true,$aParams)) {
        @
unlink($sFileTmp);
        return 
$this->Image_GetWebPath($sFileImage);
    }
    @
unlink($sFileTmp);
    return 
false;
}

Загрузка изображений при написании топика

UploadTopicImageUrl() method
public string|int UploadTopicImageUrl(string $sUrl, ModuleUser_EntityUser $oUser)
$sUrl string URL изображения
$oUser ModuleUser_EntityUser
{return} string|int
Source Code: /classes/modules/topic/Topic.class.php#1592 (show)
public function UploadTopicImageUrl($sUrl$oUser) {
    
/**
     * Проверяем, является ли файл изображением
     */
    
if(!@getimagesize($sUrl)) {
        return 
ModuleImage::UPLOAD_IMAGE_ERROR_TYPE;
    }
    
/**
     * Открываем файловый поток и считываем файл поблочно,
     * контролируя максимальный размер изображения
     */
    
$oFile=fopen($sUrl,'r');
    if(!
$oFile) {
        return 
ModuleImage::UPLOAD_IMAGE_ERROR_READ;
    }

    
$iMaxSizeKb=Config::Get('view.img_max_size_url');
    
$iSizeKb=0;
    
$sContent='';
    while (!
feof($oFile) and $iSizeKb<$iMaxSizeKb) {
        
$sContent.=fread($oFile ,1024*1);
        
$iSizeKb++;
    }
    
/**
     * Если конец файла не достигнут,
     * значит файл имеет недопустимый размер
     */
    
if(!feof($oFile)) {
        return 
ModuleImage::UPLOAD_IMAGE_ERROR_SIZE;
    }
    
fclose($oFile);
    
/**
     * Создаем tmp-файл, для временного хранения изображения
     */
    
$sFileTmp=Config::Get('sys.cache.dir').func_generator();

    
$fp=fopen($sFileTmp,'w');
    
fwrite($fp,$sContent);
    
fclose($fp);

    
$sDirSave=$this->Image_GetIdDir($oUser->getId());
    
$aParams=$this->Image_BuildParams('topic');
    
/**
     * Передаем изображение на обработку
     */
    
if ($sFileImg=$this->Image_Resize($sFileTmp,$sDirSave,func_generator(),Config::Get('view.img_max_width'),Config::Get('view.img_max_height'),Config::Get('view.img_resize_width'),null,true,$aParams)) {
        @
unlink($sFileTmp);
        return 
$this->Image_GetWebPath($sFileImg);
    }

    @
unlink($sFileTmp);
    return 
ModuleImage::UPLOAD_IMAGE_ERROR;
}

Загрузка изображений по переданному URL

UploadTopicPhoto() method
public string|bool UploadTopicPhoto(array $aFile)
$aFile array Массив $_FILES
{return} string|bool
Source Code: /classes/modules/topic/Topic.class.php#1771 (show)
public function UploadTopicPhoto($aFile) {
    if(!
is_array($aFile) || !isset($aFile['tmp_name'])) {
        return 
false;
    }

    
$sFileName func_generator(10);
    
$sPath Config::Get('path.uploads.images').'/topic/'.date('Y/m/d').'/';

    if (!
is_dir(Config::Get('path.root.server').$sPath)) {
        
mkdir(Config::Get('path.root.server').$sPath0755true);
    }

    
$sFileTmp Config::Get('path.root.server').$sPath.$sFileName;
    if (!
move_uploaded_file($aFile['tmp_name'],$sFileTmp)) {
        return 
false;
    }


    
$aParams=$this->Image_BuildParams('photoset');

    
$oImage =$this->Image_CreateImageObject($sFileTmp);
    
/**
     * Если объект изображения не создан,
     * возвращаем ошибку
     */
    
if($sError=$oImage->get_last_error()) {
        
// Вывод сообщения об ошибки, произошедшей при создании объекта изображения
        
$this->Message_AddError($sError,$this->Lang_Get('error'));
        @
unlink($sFileTmp);
        return 
false;
    }
    
/**
     * Превышает максимальные размеры из конфига
     */
    
if (($oImage->get_image_params('width')>Config::Get('view.img_max_width')) or ($oImage->get_image_params('height')>Config::Get('view.img_max_height'))) {
        
$this->Message_AddError($this->Lang_Get('topic_photoset_error_size'),$this->Lang_Get('error'));
        @
unlink($sFileTmp);
        return 
false;
    }
    
/**
     * Добавляем к загруженному файлу расширение
     */
    
$sFile=$sFileTmp.'.'.$oImage->get_image_params('format');
    
rename($sFileTmp,$sFile);

    
$aSizes=Config::Get('module.topic.photoset.size');
    foreach (
$aSizes as $aSize) {
        
/**
         * Для каждого указанного в конфиге размера генерируем картинку
         */
        
$sNewFileName $sFileName.'_'.$aSize['w'];
        
$oImage $this->Image_CreateImageObject($sFile);
        if (
$aSize['crop']) {
            
$this->Image_CropProportion($oImage$aSize['w'], $aSize['h'], true);
            
$sNewFileName .= 'crop';
        }
        
$this->Image_Resize($sFile,$sPath,$sNewFileName,Config::Get('view.img_max_width'),Config::Get('view.img_max_height'),$aSize['w'],$aSize['h'],true,$aParams,$oImage);
    }
    return 
$this->Image_GetWebPath($sFile);
}

Загрузить изображение

addTopicPhoto() method
public ModuleTopic_EntityTopicPhoto|bool addTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
$oPhoto ModuleTopic_EntityTopicPhoto Объект фото к топику-фотосету
{return} ModuleTopic_EntityTopicPhoto|bool
Source Code: /classes/modules/topic/Topic.class.php#1677 (show)
public function addTopicPhoto($oPhoto) {
    if (
$sId=$this->oMapperTopic->addTopicPhoto($oPhoto)) {
        
$oPhoto->setId($sId);
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("photoset_photo_update"));
        return 
$oPhoto;
    }
    return 
false;
}

Добавить к топику изображение

deleteTopicPhoto() method
public void deleteTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
$oPhoto ModuleTopic_EntityTopicPhoto Объект фото
Source Code: /classes/modules/topic/Topic.class.php#1750 (show)
public function deleteTopicPhoto($oPhoto) {
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("photoset_photo_update"));
    
$this->oMapperTopic->deleteTopicPhoto($oPhoto->getId());

    
$this->Image_RemoveFile($this->Image_GetServerPath($oPhoto->getWebPath()));
    
$aSizes=Config::Get('module.topic.photoset.size');
    
// Удаляем все сгенерированные миниатюры основываясь на данных из конфига.
    
foreach ($aSizes as $aSize) {
        
$sSize $aSize['w'];
        if (
$aSize['crop']) {
            
$sSize .= 'crop';
        }
        
$this->Image_RemoveFile($this->Image_GetServerPath($oPhoto->getWebPath($sSize)));
    }
}

Удалить изображение

getCountPhotosByTargetTmp() method
public int getCountPhotosByTargetTmp(string $sTargetTmp)
$sTargetTmp string Временный ключ
{return} int
Source Code: /classes/modules/topic/Topic.class.php#1733 (show)
public function getCountPhotosByTargetTmp($sTargetTmp) {
    return 
$this->oMapperTopic->getCountPhotosByTargetTmp($sTargetTmp);
}

Получить число изображений из фотосета по id топика

getCountPhotosByTopicId() method
public int getCountPhotosByTopicId(int $iTopicId)
$iTopicId int ID топика
{return} int
Source Code: /classes/modules/topic/Topic.class.php#1724 (show)
public function getCountPhotosByTopicId($iTopicId) {
    return 
$this->oMapperTopic->getCountPhotosByTopicId($iTopicId);
}

Получить число изображений из фотосета по id топика

getPhotosByTargetTmp() method
public array getPhotosByTargetTmp(string $sTargetTmp)
$sTargetTmp string Временный ключ
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1715 (show)
public function getPhotosByTargetTmp($sTargetTmp) {
    return 
$this->oMapperTopic->getPhotosByTargetTmp($sTargetTmp);
}

Получить список изображений из фотосета по временному коду

getPhotosByTopicId() method
public array getPhotosByTopicId(int $iTopicId, int|null $iFromId=NULL, int|null $iCount=NULL)
$iTopicId int ID топика
$iFromId int|null ID с которого начинать выборку
$iCount int|null Количество
{return} array
Source Code: /classes/modules/topic/Topic.class.php#1706 (show)
public function getPhotosByTopicId($iTopicId$iFromId null$iCount null) {
    return 
$this->oMapperTopic->getPhotosByTopicId($iTopicId$iFromId$iCount);
}

Получить список изображений из фотосета по id топика

getTopicPhotoById() method
public ModuleTopic_EntityTopicPhoto|null getTopicPhotoById(int $sId)
$sId int ID фото
{return} ModuleTopic_EntityTopicPhoto|null
Source Code: /classes/modules/topic/Topic.class.php#1691 (show)
public function getTopicPhotoById($sId) {
    
$aPhotos=$this->GetTopicPhotosByArrayId($sId);
    if (isset(
$aPhotos[$sId])) {
        return 
$aPhotos[$sId];
    }
    return 
null;
}

Получить изображение из фотосета по его id

increaseTopicCountComment() method
public bool increaseTopicCountComment(int $sTopicId)
$sTopicId int ID топика
{return} bool
Source Code: /classes/modules/topic/Topic.class.php#1135 (show)
public function increaseTopicCountComment($sTopicId) {
    
$this->Cache_Delete("topic_{$sTopicId}");
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("topic_update"));
    return 
$this->oMapperTopic->increaseTopicCountComment($sTopicId);
}

Увеличивает у топика число комментов

updateTopicPhoto() method
public void updateTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
$oPhoto ModuleTopic_EntityTopicPhoto Объект фото
Source Code: /classes/modules/topic/Topic.class.php#1741 (show)
public function updateTopicPhoto($oPhoto) {
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("photoset_photo_update"));
    
$this->oMapperTopic->updateTopicPhoto($oPhoto);
}

Обновить данные по изображению