ModuleTopic
Package | application.modules.topic |
---|---|
Inheritance | class ModuleTopic » Module » LsObject |
Since | 1.0 |
Source Code | /application/classes/modules/topic/Topic.class.php |
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
_aBehaviors | Список поведений в виде готовых объектов, формируется автоматически | LsObject | |
aBehaviors | array | Список поведений | LsObject |
aTopicTypes | array | Список типов топика | ModuleTopic |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oMapperTopic | ModuleTopic_MapperTopic | Объект маппера | ModuleTopic |
oUserCurrent | ModuleUser_EntityUser|null | Объект текущего пользователя | ModuleTopic |
Public Methods
Method | Description | Defined By |
---|---|---|
AddBehaviorHook() | Добавляет хук поведения | LsObject |
AddFavouriteTopic() | Добавляет топик в избранное | ModuleTopic |
AddTopic() | Добавляет топик | ModuleTopic |
AddTopicTag() | Добавление тега к топику | ModuleTopic |
AddTopicType() | Добавляет новый тип топика в БД | ModuleTopic |
AttachBehavior() | Присоединяет поведение к объекту | LsObject |
DeleteFavouriteTopic() | Удаляет топик из избранного | ModuleTopic |
DeleteFavouriteTopicByArrayId() | Удаляет топики из избранного по списку | ModuleTopic |
DeleteTopic() | Удаляет топик. | ModuleTopic |
DeleteTopicAdditionalData() | Удаляет свзяанные с топика данные | ModuleTopic |
DeleteTopicContentByTopicId() | Удаление контента топика по его номеру | ModuleTopic |
DeleteTopicReadByArrayId() | Удаляет записи о чтении записей по списку идентификаторов | ModuleTopic |
DeleteTopicTagsByTopicId() | Удаляет теги у топика | ModuleTopic |
DeleteTopicType() | Удаляет тип топика из БД | ModuleTopic |
DetachBehavior() | Отсоединяет поведение от объекта | LsObject |
GetBehavior() | Возвращает объект поведения по его имени | LsObject |
GetBehaviors() | Возвращает все объекты поведения | LsObject |
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 |
GetTopicRead() | Получаем дату прочтения топика юзером | ModuleTopic |
GetTopicTags() | Получает список тегов топиков | ModuleTopic |
GetTopicTagsByLike() | Получает список тегов по первым буквам тега | ModuleTopic |
GetTopicType() | Возвращает объект типа топика, поиск только среди активных типов | ModuleTopic |
GetTopicTypeByCode() | Возвращает объект типа топика по его коду | ModuleTopic |
GetTopicTypeById() | Возвращает объект типа топика по его ID | ModuleTopic |
GetTopicTypeItems() | 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 |
GetTopicsRatingByDate() | Получает топики по рейтингу и дате | ModuleTopic |
GetTopicsReadByArray() | Получить список просмотром/чтения топиков по списку айдишников | ModuleTopic |
GetTopicsReadByArraySolid() | Получить список просмотром/чтения топиков по списку айдишников, но используя единый кеш | ModuleTopic |
GetTopicsTop() | Получает список ВСЕХ рейтинговых топиков | ModuleTopic |
Init() | Инициализация | ModuleTopic |
IsAllowTopicType() | Проверяет разрешен ли данный тип топика | ModuleTopic |
MoveTopics() | Перемещает топики в другой блог | ModuleTopic |
MoveTopicsByArrayId() | Перемещает топики в другой блог | ModuleTopic |
Parser() | Парсинг текста с учетом конкретного топика | ModuleTopic |
RecalculateFavourite() | Пересчитывает счетчик избранных топиков | ModuleTopic |
RecalculateVote() | Пересчитывает счетчики голосований | ModuleTopic |
RemoveBehaviorHook() | Удаляет хук поведения | LsObject |
RunBehaviorHook() | Запускает хук поведения на выполнение | LsObject |
SendNotifyTopicNew() | Рассылает уведомления о новом топике подписчикам блога | ModuleTopic |
SetFavouriteTopicPublish() | Устанавливает переданный параметр публикации таргета (топика) | ModuleTopic |
SetInit() | Помечает модуль как инициализированный | Module |
SetTopicRead() | Обновляем/устанавливаем дату прочтения топика, если читаем его первый раз то добавляем | ModuleTopic |
Shutdown() | Метод срабатывает при завершении работы ядра | Module |
UpdateTopic() | Обновляет топик | ModuleTopic |
UpdateTopicByType() | ModuleTopic | |
UpdateTopicContent() | Обновляет контент топика в БД (таблица topic_content) | ModuleTopic |
UpdateTopicType() | Обновляет тип топика в БД | ModuleTopic |
__call() | Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля | LsObject |
__clone() | Блокируем копирование/клонирование объекта | Module |
__construct() | Конструктор, запускается автоматически при создании объекта | LsObject |
__get() | Обработка доступа к объекты поведения | LsObject |
increaseTopicCountComment() | Увеличивает у топика число комментов | ModuleTopic |
isInit() | Возвращает значение флага инициализации модуля | Module |
Protected Methods
Method | Description | Defined By |
---|---|---|
PrepareBehaviors() | Инициализация поведений | LsObject |
Property Details
Список типов топика
Объект маппера
Объект текущего пользователя
Method Details
public bool AddFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
| ||
$oFavouriteTopic | ModuleFavourite_EntityFavourite | Объект избранного |
{return} | bool |
public function AddFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
{
return $this->Favourite_AddFavourite($oFavouriteTopic);
}
Добавляет топик в избранное
public ModuleTopic_EntityTopic|bool AddTopic(ModuleTopic_EntityTopic $oTopic)
| ||
$oTopic | ModuleTopic_EntityTopic | Объект топика |
{return} | ModuleTopic_EntityTopic|bool |
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->Property_ValidateEntityPropertiesCheck($oTopic);
* т.к. она подготавливает данные полей для сохранений
* Валидация вызывается автоматически при вызове $oTopic->_Validate();
*/
$this->Property_UpdatePropertiesValue($oTopic->getPropertiesObject(), $oTopic);
//чистим зависимые кеши
$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;
}
Добавляет топик
public int AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag)
| ||
$oTopicTag | ModuleTopic_EntityTopicTag | Объект тега топика |
{return} | int |
public function AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag)
{
return $this->oMapperTopic->AddTopicTag($oTopicTag);
}
Добавление тега к топику
public ModuleTopic_EntityTopicType|bool AddTopicType(ModuleTopic_EntityTopicType $oType)
| ||
$oType | ModuleTopic_EntityTopicType | |
{return} | ModuleTopic_EntityTopicType|bool |
public function AddTopicType($oType)
{
if ($sId = $this->oMapperTopic->AddTopicType($oType)) {
$oType->setId($sId);
//чистим зависимые кеши
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('topic_type_new'));
/**
* Регистрируем новый тип в дополнительных полях
* todo: fix lang text
*/
$this->Property_CreateTargetType('topic_' . $oType->getCode(),
array('entity' => 'ModuleTopic_EntityTopic', 'name' => 'Топик - ' . $oType->getName()), true);
return $oType;
}
return false;
}
Добавляет новый тип топика в БД
public bool DeleteFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
| ||
$oFavouriteTopic | ModuleFavourite_EntityFavourite | Объект избранного |
{return} | bool |
public function DeleteFavouriteTopic(ModuleFavourite_EntityFavourite $oFavouriteTopic)
{
return $this->Favourite_DeleteFavourite($oFavouriteTopic);
}
Удаляет топик из избранного
public bool DeleteFavouriteTopicByArrayId(array $aTopicId)
| ||
$aTopicId | array | Список ID топиков |
{return} | bool |
public function DeleteFavouriteTopicByArrayId($aTopicId)
{
return $this->Favourite_DeleteFavouriteByTargetId($aTopicId, 'topic');
}
Удаляет топики из избранного по списку
public bool DeleteTopic(ModuleTopic_EntityTopic|int $oTopicId)
| ||
$oTopicId | ModuleTopic_EntityTopic|int | Объект топика или ID |
{return} | bool |
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->Property_RemovePropertiesValue(($oTopicId instanceof ModuleTopic_EntityTopic) ? $oTopicId : $this->GetTopicById($oTopicId));
/**
* Чистим зависимые кеши
*/
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('topic_update'));
$this->Cache_Delete("topic_{$sTopicId}");
/**
* Если топик успешно удален, удаляем связанные данные
*/
if ($this->oMapperTopic->DeleteTopic($sTopicId)) {
return $this->DeleteTopicAdditionalData($sTopicId);
}
return false;
}
Удаляет топик. Если тип таблиц в БД InnoDB, то удалятся всё связи по топику(комменты,голосования,избранное)
public bool DeleteTopicAdditionalData(int $iTopicId)
| ||
$iTopicId | int | ID топика |
{return} | bool |
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->Media_RemoveTarget('topic', $iTopicId, true);
/**
* Удаляем комментарии к топику.
* При удалении комментариев они удаляются из избранного,прямого эфира и голоса за них
*/
$this->Comment_DeleteCommentByTargetId($iTopicId, 'topic');
/**
* Удаляем топик из избранного
*/
$this->DeleteFavouriteTopicByArrayId($iTopicId);
/**
* Удаляем топик из прочитанного
*/
$this->DeleteTopicReadByArrayId($iTopicId);
/**
* Удаляем голосование к топику
*/
$this->Vote_DeleteVoteByTarget($iTopicId, 'topic');
/**
* Удаляем теги
*/
$this->DeleteTopicTagsByTopicId($iTopicId);
return true;
}
Удаляет свзяанные с топика данные
public bool DeleteTopicContentByTopicId(int $iTopicId)
| ||
$iTopicId | int | ID топика |
{return} | bool |
public function DeleteTopicContentByTopicId($iTopicId)
{
return $this->oMapperTopic->DeleteTopicContentByTopicId($iTopicId);
}
Удаление контента топика по его номеру
public bool DeleteTopicReadByArrayId(array|int $aTopicId)
| ||
$aTopicId | array|int | Список ID топиков |
{return} | bool |
public function DeleteTopicReadByArrayId($aTopicId)
{
if (!is_array($aTopicId)) {
$aTopicId = array($aTopicId);
}
return $this->oMapperTopic->DeleteTopicReadByArrayId($aTopicId);
}
Удаляет записи о чтении записей по списку идентификаторов
public bool DeleteTopicTagsByTopicId(int $sTopicId)
| ||
$sTopicId | int | ID топика |
{return} | bool |
public function DeleteTopicTagsByTopicId($sTopicId)
{
return $this->oMapperTopic->DeleteTopicTagsByTopicId($sTopicId);
}
Удаляет теги у топика
public bool DeleteTopicType($sTypeId $sTypeId)
| ||
$sTypeId | $sTypeId | |
{return} | bool |
public function DeleteTopicType($sTypeId)
{
return $this->oMapperTopic->DeleteTopicType($sTypeId);
}
Удаляет тип топика из БД
public int GetCountDraftTopicsByUserId(int $iUserId)
| ||
$iUserId | int | ID пользователя |
{return} | int |
public function GetCountDraftTopicsByUserId($iUserId)
{
return $this->GetCountTopicsByFilter(array(
'user_id' => $iUserId,
'topic_publish' => 0
));
}
Количество черновиков у пользователя
public int GetCountTopicsByBlogNew(ModuleBlog_EntityBlog $oBlog)
| ||
$oBlog | ModuleBlog_EntityBlog | Объект блога |
{return} | int |
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);
}
Получает число новых топиков из блога
public int GetCountTopicsByFilter(array $aFilter)
| ||
$aFilter | array | Фильтр |
{return} | int |
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;
}
Количество топиков по фильтру
public int GetCountTopicsCollectiveNew()
| ||
{return} | int |
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);
}
Получает число новых топиков в коллективных блогах
public int GetCountTopicsFavouriteByUserId(int $sUserId)
| ||
$sUserId | int | ID пользователя |
{return} | int |
public function GetCountTopicsFavouriteByUserId($sUserId)
{
$aCloseTopics = array();
return ($this->oUserCurrent && $sUserId == $this->oUserCurrent->getId())
? $this->Favourite_GetCountFavouritesByUserId($sUserId, 'topic', $aCloseTopics)
: $this->Favourite_GetCountFavouriteOpenTopicsByUserId($sUserId);
}
Возвращает число топиков в избранном
public array GetCountTopicsPersonalByUser(int $sUserId, int $iPublish)
| ||
$sUserId | int | ID пользователя |
$iPublish | int | Флаг публикации топика |
{return} | array |
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;
}
Возвращает количество топиков которые создал юзер
public int GetCountTopicsPersonalNew()
| ||
{return} | int |
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);
}
Получает число новых топиков в персональных блогах
public ModuleFavourite_EntityFavourite GetFavouriteTopic(int $sTopicId, int $sUserId)
| ||
$sTopicId | int | ID топика |
$sUserId | int | ID пользователя |
{return} | ModuleFavourite_EntityFavourite |
public function GetFavouriteTopic($sTopicId, $sUserId)
{
return $this->Favourite_GetFavourite($sTopicId, 'topic', $sUserId);
}
Получает привязку топика к ибранному(добавлен ли топик в избранное у юзера)
public array GetFavouriteTopicsByArray(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
public function GetFavouriteTopicsByArray($aTopicId, $sUserId)
{
return $this->Favourite_GetFavouritesByArray($aTopicId, 'topic', $sUserId);
}
Получить список избранного по списку айдишников
public array GetFavouriteTopicsByArraySolid(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
public function GetFavouriteTopicsByArraySolid($aTopicId, $sUserId)
{
return $this->Favourite_GetFavouritesByArraySolid($aTopicId, 'topic', $sUserId);
}
Получить список избранного по списку айдишников, но используя единый кеш
public array GetLastTopicsByUserId(int $sUserId, int $iTimeLimit, int $iCountLimit=1, array $aAllowData=array (
))
| ||
$sUserId | int | ID пользователя |
$iTimeLimit | int | Число секунд |
$iCountLimit | int | Количество |
$aAllowData | array | Список типов данных для подгрузки в топики |
{return} | array |
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 секунд назад
public array GetOpenTopicTags(int $iLimit, int|null $iUserId=NULL)
| ||
$iLimit | int | Количество |
$iUserId | int|null | ID пользователя, чью теги получаем |
{return} | array |
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)
public ModuleTopic_EntityTopic|null GetTopicById(int $sId)
| ||
$sId | int | ID топика |
{return} | ModuleTopic_EntityTopic|null |
public function GetTopicById($sId)
{
if (!is_numeric($sId)) {
return null;
}
$aTopics = $this->GetTopicsAdditionalData($sId);
if (isset($aTopics[$sId])) {
return $aTopics[$sId];
}
return null;
}
Получить топик по айдишнику
public array GetTopicItemsByArrayId(array $aTopocId)
| ||
$aTopocId | array | Список ID топиков |
{return} | array |
public function GetTopicItemsByArrayId($aTopocId)
{
return $this->GetTopicsByArrayId($aTopocId);
}
Алиас для корректной работы ORM
public ModuleTopic_EntityTopicRead|null GetTopicRead(int $sTopicId, int $sUserId)
| ||
$sTopicId | int | ID топика |
$sUserId | int | ID пользователя |
{return} | ModuleTopic_EntityTopicRead|null |
public function GetTopicRead($sTopicId, $sUserId)
{
$data = $this->GetTopicsReadByArray($sTopicId, $sUserId);
if (isset($data[$sTopicId])) {
return $data[$sTopicId];
}
return null;
}
Получаем дату прочтения топика юзером
public array GetTopicTags(int $iLimit, array $aExcludeTopic=array (
))
| ||
$iLimit | int | Количество |
$aExcludeTopic | array | Список ID топиков для исключения |
{return} | array |
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;
}
Получает список тегов топиков
public bool GetTopicTagsByLike(string $sTag, int $iLimit)
| ||
$sTag | string | Тэг |
$iLimit | int | Количество |
{return} | bool |
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;
}
Получает список тегов по первым буквам тега
public null GetTopicType(string $sType)
| ||
$sType | string | |
{return} | null |
public function GetTopicType($sType)
{
return isset($this->aTopicTypes[$sType]) ? $this->aTopicTypes[$sType] : null;
}
Возвращает объект типа топика, поиск только среди активных типов
public ModuleTopic_EntityTopicType|null GetTopicTypeByCode(string $sCode)
| ||
$sCode | string | |
{return} | ModuleTopic_EntityTopicType|null |
public function GetTopicTypeByCode($sCode)
{
return $this->oMapperTopic->GetTopicTypeByCode($sCode);
}
Возвращает объект типа топика по его коду
public ModuleTopic_EntityTopicType|null GetTopicTypeById(int $iId)
| ||
$iId | int | |
{return} | ModuleTopic_EntityTopicType|null |
public function GetTopicTypeById($iId)
{
return $this->oMapperTopic->GetTopicTypeById($iId);
}
Возвращает объект типа топика по его ID
public mixed GetTopicTypeItems(array $aFilter=array (
))
| ||
$aFilter | array | |
{return} | mixed |
public function GetTopicTypeItems($aFilter = array())
{
return $this->oMapperTopic->GetTopicTypeItems($aFilter);
}
public array GetTopicTypes(bool $bOnlyCode=false)
| ||
$bOnlyCode | bool | Вернуть только коды типов |
{return} | array |
public function GetTopicTypes($bOnlyCode = false)
{
return $bOnlyCode ? array_keys($this->aTopicTypes) : $this->aTopicTypes;
}
Возвращает список типов топика, возвращаются только активные типы
public ModuleTopic_EntityTopic|null GetTopicUnique(int $sUserId, string $sHash)
| ||
$sUserId | int | |
$sHash | string | |
{return} | ModuleTopic_EntityTopic|null |
public function GetTopicUnique($sUserId, $sHash)
{
$sId = $this->oMapperTopic->GetTopicUnique($sUserId, $sHash);
return $this->GetTopicById($sId);
}
Получает топик по уникальному хешу(текст топика)
public array GetTopicsAdditionalData(array $aTopicId, array|null $aAllowData=NULL)
| ||
$aTopicId | array | Список ID топиков |
$aAllowData | array|null | Список типов дополнительных данных, которые нужно подключать к топикам |
{return} | array |
public function GetTopicsAdditionalData($aTopicId, $aAllowData = null)
{
if (is_null($aAllowData)) {
$aAllowData = array(
'user' => array(),
'blog' => array('owner' => array(), 'relation_user'),
'vote',
'favourite',
'comment_new',
'properties'
);
}
func_array_simpleflip($aAllowData);
if (!is_array($aTopicId)) {
$aTopicId = array($aTopicId);
}
/**
* Получаем "голые" топики
*/
$aTopics = $this->GetTopicsByArrayId($aTopicId);
/**
* Формируем ID дополнительных данных, которые нужно получить
*/
$aUserId = array();
$aBlogId = array();
foreach ($aTopics as $oTopic) {
if (isset($aAllowData['user'])) {
$aUserId[] = $oTopic->getUserId();
}
if (isset($aAllowData['blog'])) {
$aBlogId[] = $oTopic->getBlogId();
}
}
/**
* Получаем дополнительные данные
*/
$aTopicsVote = array();
$aFavouriteTopics = 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());
}
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());
}
/**
* Добавляем данные к результату - списку топиков
*/
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($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($aAllowData['properties'])) {
$this->Property_RewriteGetItemsByFilter($aTopics, array('#properties' => true));
}
return $aTopics;
}
Получает дополнительные данные(объекты) для топиков по их ID
public array GetTopicsByArrayId(array $aTopicId)
| ||
$aTopicId | array | Список ID топиков |
{return} | array |
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;
}
Получить список топиков по списку айдишников
public array GetTopicsByArrayIdSolid(array $aTopicId)
| ||
$aTopicId | array | Список ID топиков |
{return} | array |
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;
}
Получить список топиков по списку айдишников, но используя единый кеш
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 |
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);
}
Список топиков из блога
public array GetTopicsByBlogId(int $iBlogId, int $iPage=1, int $iPerPage=20, array $aAllowData=array (
), bool $bIdsOnly=true)
| ||
$iBlogId | int | ID блога |
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$aAllowData | array | Список типов данных для подгрузки в топики |
$bIdsOnly | bool | Возвращать только ID или список объектов |
{return} | array |
public function GetTopicsByBlogId($iBlogId, $iPage = 1, $iPerPage = 20, $aAllowData = array(), $bIdsOnly = true)
{
$aFilter = array('blog_id' => $iBlogId);
if (!$aTopics = $this->GetTopicsByFilter($aFilter, $iPage, $iPerPage, $aAllowData)) {
return array();
}
return ($bIdsOnly)
? array_keys($aTopics['collection'])
: $aTopics;
}
Получает список топиков из указанного блога
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) |
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;
}
Список топиков по фильтру
public array GetTopicsByTag(string $sTag, int $iPage, int $iPerPage, bool $bAddAccessible=true)
| ||
$sTag | string | Тег |
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$bAddAccessible | bool | Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов. |
{return} | array |
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;
}
Получает список топиков по тегу
public array GetTopicsCollective(int $iPage, int $iPerPage, string $sShowType='good', string $sPeriod=NULL)
| ||
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$sShowType | string | Тип выборки топиков |
$sPeriod | string | Период в виде секунд или конкретной даты |
{return} | array |
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);
}
Список топиков из коллективных блогов
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 |
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);
}
Получает список ВСЕХ обсуждаемых топиков
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) |
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;
}
Получает список топиков из избранного
public array GetTopicsGood(int $iPage, int $iPerPage, bool $bAddAccessible=true)
| ||
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$bAddAccessible | bool | Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов. |
{return} | array |
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);
}
Получает список хороших топиков для вывода на главную страницу(из всех блогов, как коллективных так и персональных)
public array GetTopicsLast(int $iCount)
| ||
$iCount | int | Количество |
{return} | array |
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;
}
Получает заданое число последних топиков
public array GetTopicsNew(int $iPage, int $iPerPage, bool $bAddAccessible=true)
| ||
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$bAddAccessible | bool | Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов. |
{return} | array |
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);
}
Получает список новых топиков, ограничение новизны по дате из конфига
public array GetTopicsNewAll(int $iPage, int $iPerPage, bool $bAddAccessible=true)
| ||
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
$bAddAccessible | bool | Указывает на необходимость добавить в выдачу топики, из блогов доступных пользователю. При указании false, в выдачу будут переданы только топики из общедоступных блогов. |
{return} | array |
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);
}
Получает список ВСЕХ новых топиков
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 |
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);
}
список топиков из персональных блогов
public array GetTopicsPersonalByUser(int $sUserId, int $iPublish, int $iPage, int $iPerPage)
| ||
$sUserId | int | ID пользователя |
$iPublish | int | Флаг публикации топика |
$iPage | int | Номер страницы |
$iPerPage | int | Количество элементов на страницу |
{return} | array |
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);
}
Получает список топиков по юзеру
public array GetTopicsRatingByDate(string $sDate, int $iLimit=20)
| ||
$sDate | string | Дата |
$iLimit | int | Количество |
{return} | array |
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;
}
Получает топики по рейтингу и дате
public array GetTopicsReadByArray(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
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;
}
Получить список просмотром/чтения топиков по списку айдишников
public array GetTopicsReadByArraySolid(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
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;
}
Получить список просмотром/чтения топиков по списку айдишников, но используя единый кеш
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 |
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);
}
Получает список ВСЕХ рейтинговых топиков
public void Init()
|
public function Init()
{
$this->oMapperTopic = Engine::GetMapper(__CLASS__);
$this->oUserCurrent = $this->User_GetUserCurrent();
$aTopicTypeItems = $this->GetTopicTypeItems(array('state' => self::TOPIC_TYPE_STATE_ACTIVE));
foreach ($aTopicTypeItems as $oTypeItem) {
$this->aTopicTypes[$oTypeItem->getCode()] = $oTypeItem;
}
}
Инициализация
public bool IsAllowTopicType(string $sType)
| ||
$sType | string | Тип |
{return} | bool |
public function IsAllowTopicType($sType)
{
return array_key_exists($sType, $this->aTopicTypes);
}
Проверяет разрешен ли данный тип топика
public bool MoveTopics(int $sBlogId, int $sBlogIdNew)
| ||
$sBlogId | int | ID старого блога |
$sBlogIdNew | int | ID нового блога |
{return} | bool |
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;
}
Перемещает топики в другой блог
public bool MoveTopicsByArrayId(array $aTopics, int $sBlogId)
| ||
$aTopics | array | Список ID топиков |
$sBlogId | int | ID блога |
{return} | bool |
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;
}
Перемещает топики в другой блог
public string Parser(string $sText, ModuleTopic_EntityTopic $oTopic)
| ||
$sText | string | |
$oTopic | ModuleTopic_EntityTopic | |
{return} | string |
public function Parser($sText, $oTopic)
{
$this->Text_AddParams(array('oTopic' => $oTopic));
$sResult = $this->Text_Parser($sText);
$this->Text_RemoveParams(array('oTopic'));
return $sResult;
}
Парсинг текста с учетом конкретного топика
public bool RecalculateFavourite()
| ||
{return} | bool |
public function RecalculateFavourite()
{
return $this->oMapperTopic->RecalculateFavourite();
}
Пересчитывает счетчик избранных топиков
public bool RecalculateVote()
| ||
{return} | bool |
public function RecalculateVote()
{
return $this->oMapperTopic->RecalculateVote();
}
Пересчитывает счетчики голосований
public void SendNotifyTopicNew(ModuleBlog_EntityBlog $oBlog, ModuleTopic_EntityTopic $oTopic, ModuleUser_EntityUser $oUserTopic)
| ||
$oBlog | ModuleBlog_EntityBlog | Объект блога |
$oTopic | ModuleTopic_EntityTopic | Объект топика |
$oUserTopic | ModuleUser_EntityUser | Объект пользователя |
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);
}
}
Рассылает уведомления о новом топике подписчикам блога
public bool SetFavouriteTopicPublish(int $sTopicId, int $iPublish)
| ||
$sTopicId | int | ID топика |
$iPublish | int | Флаг публикации топика |
{return} | bool |
public function SetFavouriteTopicPublish($sTopicId, $iPublish)
{
return $this->Favourite_SetFavouriteTargetPublish($sTopicId, 'topic', $iPublish);
}
Устанавливает переданный параметр публикации таргета (топика)
public bool SetTopicRead(ModuleTopic_EntityTopicRead $oTopicRead)
| ||
$oTopicRead | ModuleTopic_EntityTopicRead | Объект факта чтения топика |
{return} | bool |
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;
}
Обновляем/устанавливаем дату прочтения топика, если читаем его первый раз то добавляем
public bool UpdateTopic(ModuleTopic_EntityTopic $oTopic)
| ||
$oTopic | ModuleTopic_EntityTopic | Объект топика |
{return} | bool |
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->Property_ValidateEntityPropertiesCheck($oTopic);
* т.к. она подготавливает данные полей для сохранений
* Валидация вызывается автоматически при вызове $oTopic->_Validate();
*/
$this->Property_UpdatePropertiesValue($oTopic->getPropertiesObject(), $oTopic);
//чистим зависимые кеши
$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;
}
Обновляет топик
public void UpdateTopicByType($sType, $sTypeNew)
| ||
$sType | ||
$sTypeNew |
public function UpdateTopicByType($sType, $sTypeNew)
{
$res = $this->oMapperTopic->UpdateTopicByType($sType, $sTypeNew);
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("topic_update"));
return $res;
}
public bool UpdateTopicContent(ModuleTopic_EntityTopic $oTopic)
| ||
$oTopic | ModuleTopic_EntityTopic | |
{return} | bool |
public function UpdateTopicContent($oTopic)
{
$bRes = $this->oMapperTopic->UpdateTopicContent($oTopic);
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,
array('topic_update', "topic_update_user_{$oTopic->getUserId()}"));
$this->Cache_Delete("topic_{$oTopic->getId()}");
return $bRes;
}
Обновляет контент топика в БД (таблица topic_content)
public bool UpdateTopicType(ModuleTopic_EntityTopicType $oType)
| ||
$oType | ModuleTopic_EntityTopicType | |
{return} | bool |
public function UpdateTopicType($oType)
{
return $this->oMapperTopic->UpdateTopicType($oType);
}
Обновляет тип топика в БД
public bool increaseTopicCountComment(int $sTopicId)
| ||
$sTopicId | int | ID топика |
{return} | bool |
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);
}
Увеличивает у топика число комментов