ModuleTopic
Package | modules.topic |
---|---|
Inheritance | class ModuleTopic » Module » LsObject |
Since | 1.0 |
Source Code | /classes/modules/topic/Topic.class.php |
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
aTopicTypes | array | Список типов топика | ModuleTopic |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oEngine | Engine | Объект ядра | Module |
oMapperTopic | ModuleTopic_MapperTopic | Объект маппера | ModuleTopic |
oUserCurrent | ModuleUser_EntityUser|null | Объект текущего пользователя | ModuleTopic |
Public Methods
Method | Description | Defined 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
Method | Description | Defined By |
---|---|---|
__clone() | Блокируем копирование/клонирование объекта | Module |
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->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 bool AddTopicQuestionVote(ModuleTopic_EntityTopicQuestionVote $oTopicQuestionVote)
| ||
$oTopicQuestionVote | ModuleTopic_EntityTopicQuestionVote | Объект голосования в топике-опросе |
{return} | bool |
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);
}
Добавляет факт голосования за топик-вопрос
public int AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag)
| ||
$oTopicTag | ModuleTopic_EntityTopicTag | Объект тега топика |
{return} | int |
public function AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag) {
return $this->oMapperTopic->AddTopicTag($oTopicTag);
}
Добавление тега к топику
public bool AddTopicType(string $sType)
| ||
$sType | string | Новый тип |
{return} | bool |
public function AddTopicType($sType) {
if (!in_array($sType,$this->aTopicTypes)) {
$this->aTopicTypes[]=$sType;
return true;
}
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->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, то удалятся всё связи по топику(комменты,голосования,избранное)
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->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;
}
Удаляет свзяанные с топика данные
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 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 array GetTopicPhotosByArrayId(array $aPhotoId)
| ||
$aPhotoId | array | Список ID фото |
{return} | array |
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 фоток
public ModuleTopic_EntityTopicQuestionVote|null GetTopicQuestionVote(int $sTopicId, int $sUserId)
| ||
$sTopicId | int | ID топика |
$sUserId | int | ID пользователя |
{return} | ModuleTopic_EntityTopicQuestionVote|null |
public function GetTopicQuestionVote($sTopicId,$sUserId) {
$data=$this->GetTopicsQuestionVoteByArray($sTopicId,$sUserId);
if (isset($data[$sTopicId])) {
return $data[$sTopicId];
}
return null;
}
Проверяет голосовал ли юзер за топик-вопрос
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 array GetTopicTypes()
| ||
{return} | array |
public function GetTopicTypes() {
return $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');
}
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
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=0, int $iPerPage=0, 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=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;
}
Получает список топиков из указанного блога
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 GetTopicsQuestionVoteByArray(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
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;
}
Получить список голосований в топике-опросе по списку айдишников
public array GetTopicsQuestionVoteByArraySolid(array $aTopicId, int $sUserId)
| ||
$aTopicId | array | Список ID топиков |
$sUserId | int | ID пользователя |
{return} | array |
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;
}
Получить список голосований в топике-опросе по списку айдишников, но используя единый кеш
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();
}
Инициализация
public bool IsAllowTopicType(string $sType)
| ||
$sType | string | Тип |
{return} | bool |
public function IsAllowTopicType($sType) {
return in_array($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 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->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 string|bool UploadTopicImageFile(array $aFile, ModuleUser_EntityUser $oUser)
| ||
$aFile | array | Массив $_FILES |
$oUser | ModuleUser_EntityUser | Объект пользователя |
{return} | string|bool |
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;
}
Загрузка изображений при написании топика
public string|int UploadTopicImageUrl(string $sUrl, ModuleUser_EntityUser $oUser)
| ||
$sUrl | string | URL изображения |
$oUser | ModuleUser_EntityUser | |
{return} | string|int |
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
public string|bool UploadTopicPhoto(array $aFile)
| ||
$aFile | array | Массив $_FILES |
{return} | string|bool |
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').$sPath, 0755, true);
}
$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);
}
Загрузить изображение
public ModuleTopic_EntityTopicPhoto|bool addTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
| ||
$oPhoto | ModuleTopic_EntityTopicPhoto | Объект фото к топику-фотосету |
{return} | ModuleTopic_EntityTopicPhoto|bool |
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;
}
Добавить к топику изображение
public void deleteTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
| ||
$oPhoto | ModuleTopic_EntityTopicPhoto | Объект фото |
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)));
}
}
Удалить изображение
public int getCountPhotosByTargetTmp(string $sTargetTmp)
| ||
$sTargetTmp | string | Временный ключ |
{return} | int |
public function getCountPhotosByTargetTmp($sTargetTmp) {
return $this->oMapperTopic->getCountPhotosByTargetTmp($sTargetTmp);
}
Получить число изображений из фотосета по id топика
public int getCountPhotosByTopicId(int $iTopicId)
| ||
$iTopicId | int | ID топика |
{return} | int |
public function getCountPhotosByTopicId($iTopicId) {
return $this->oMapperTopic->getCountPhotosByTopicId($iTopicId);
}
Получить число изображений из фотосета по id топика
public array getPhotosByTargetTmp(string $sTargetTmp)
| ||
$sTargetTmp | string | Временный ключ |
{return} | array |
public function getPhotosByTargetTmp($sTargetTmp) {
return $this->oMapperTopic->getPhotosByTargetTmp($sTargetTmp);
}
Получить список изображений из фотосета по временному коду
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 |
public function getPhotosByTopicId($iTopicId, $iFromId = null, $iCount = null) {
return $this->oMapperTopic->getPhotosByTopicId($iTopicId, $iFromId, $iCount);
}
Получить список изображений из фотосета по id топика
public ModuleTopic_EntityTopicPhoto|null getTopicPhotoById(int $sId)
| ||
$sId | int | ID фото |
{return} | ModuleTopic_EntityTopicPhoto|null |
public function getTopicPhotoById($sId) {
$aPhotos=$this->GetTopicPhotosByArrayId($sId);
if (isset($aPhotos[$sId])) {
return $aPhotos[$sId];
}
return null;
}
Получить изображение из фотосета по его id
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);
}
Увеличивает у топика число комментов
public void updateTopicPhoto(ModuleTopic_EntityTopicPhoto $oPhoto)
| ||
$oPhoto | ModuleTopic_EntityTopicPhoto | Объект фото |
public function updateTopicPhoto($oPhoto) {
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("photoset_photo_update"));
$this->oMapperTopic->updateTopicPhoto($oPhoto);
}
Обновить данные по изображению