aValidateRules[]=array('topic_title','string','max'=>200,'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_create_title')); $this->aValidateRules[]=array('topic_text_source','string','max'=>Config::Get('module.topic.max_length'),'min'=>2,'allowEmpty'=>false,'label'=>$this->Lang_Get('topic_create_text')); $this->aValidateRules[]=array('topic_tags','tags','count'=>15,'label'=>$this->Lang_Get('topic_create_tags'),'allowEmpty'=>Config::Get('module.topic.allow_empty_tags')); $this->aValidateRules[]=array('blog_id','blog_id'); $this->aValidateRules[]=array('topic_text_source','topic_unique'); } /** * Проверка типа топика * * @param string $sValue Проверяемое значение * @param array $aParams Параметры * @return bool|string */ public function ValidateTopicType($sValue,$aParams) { if ($this->Topic_IsAllowTopicType($sValue)) { return true; } return $this->Lang_Get('topic_create_type_error'); } /** * Проверка топика на уникальность * * @param string $sValue Проверяемое значение * @param array $aParams Параметры * @return bool|string */ public function ValidateTopicUnique($sValue,$aParams) { $this->setTextHash(md5($this->getType().$sValue.$this->getTitle())); if ($oTopicEquivalent=$this->Topic_GetTopicUnique($this->getUserId(),$this->getTextHash())) { if ($iId=$this->getId() and $oTopicEquivalent->getId()==$iId) { return true; } return $this->Lang_Get('topic_create_text_error_unique'); } return true; } /** * Валидация ID блога * * @param string $sValue Проверяемое значение * @param array $aParams Параметры * @return bool|string */ public function ValidateBlogId($sValue,$aParams) { if ($sValue==0 and $oBlog=$this->Blog_GetPersonalBlogByUserId($this->getUserId())) { $this->setBlog($oBlog); $this->setBlogId($oBlog->getId()); return true; // персональный блог } if ($oBlog=$this->Blog_GetBlogById((int)$sValue)) { $this->setBlog($oBlog); $this->setBlogId($oBlog->getId()); return true; } return $this->Lang_Get('topic_create_blog_error_unknown'); } /** * Возвращает ID топика * * @return int|null */ public function getId() { return $this->_getDataOne('topic_id'); } /** * Возвращает ID блога * * @return int|null */ public function getBlogId() { return $this->_getDataOne('blog_id'); } /** * Возвращает ID пользователя * * @return int|null */ public function getUserId() { return $this->_getDataOne('user_id'); } /** * Возвращает тип топика * * @return string|null */ public function getType() { return $this->_getDataOne('topic_type'); } /** * Возвращает заголовок топика * * @return string|null */ public function getTitle() { return $this->_getDataOne('topic_title'); } /** * Возвращает текст топика * * @return string|null */ public function getText() { return $this->_getDataOne('topic_text'); } /** * Возвращает короткий текст топика (до ката) * * @return string|null */ public function getTextShort() { return $this->_getDataOne('topic_text_short'); } /** * Возвращает исходный текст топика, без примененя парсера тегов * * @return string|null */ public function getTextSource() { return $this->_getDataOne('topic_text_source'); } /** * Возвращает сериализованные строку дополнительный данных топика * * @return string */ public function getExtra() { return $this->_getDataOne('topic_extra') ? $this->_getDataOne('topic_extra') : serialize(''); } /** * Возвращает строку со списком тегов через запятую * * @return string|null */ public function getTags() { return $this->_getDataOne('topic_tags'); } /** * Возвращает дату создания топика * * @return string|null */ public function getDateAdd() { return $this->_getDataOne('topic_date_add'); } /** * Возвращает дату редактирования топика * * @return string|null */ public function getDateEdit() { return $this->_getDataOne('topic_date_edit'); } /** * Возвращает IP пользователя * * @return string|null */ public function getUserIp() { return $this->_getDataOne('topic_user_ip'); } /** * Возвращает статус опубликованности топика * * @return int|null */ public function getPublish() { return $this->_getDataOne('topic_publish'); } /** * Возвращает статус опубликованности черновика * * @return int|null */ public function getPublishDraft() { return $this->_getDataOne('topic_publish_draft'); } /** * Возвращает статус публикации топика на главной странице * * @return int|null */ public function getPublishIndex() { return $this->_getDataOne('topic_publish_index'); } /** * Возвращает рейтинг топика * * @return string */ public function getRating() { return number_format(round($this->_getDataOne('topic_rating'),2), 0, '.', ''); } /** * Возвращает число проголосовавших за топик * * @return int|null */ public function getCountVote() { return $this->_getDataOne('topic_count_vote'); } /** * Возвращает число проголосовавших за топик положительно * * @return int|null */ public function getCountVoteUp() { return $this->_getDataOne('topic_count_vote_up'); } /** * Возвращает число проголосовавших за топик отрицательно * * @return int|null */ public function getCountVoteDown() { return $this->_getDataOne('topic_count_vote_down'); } /** * Возвращает число воздержавшихся при голосовании за топик * * @return int|null */ public function getCountVoteAbstain() { return $this->_getDataOne('topic_count_vote_abstain'); } /** * Возвращает число прочтений топика * * @return int|null */ public function getCountRead() { return $this->_getDataOne('topic_count_read'); } /** * Возвращает количество комментариев к топику * * @return int|null */ public function getCountComment() { return $this->_getDataOne('topic_count_comment'); } /** * Возвращает текст ката * * @return string|null */ public function getCutText() { return $this->_getDataOne('topic_cut_text'); } /** * Возвращает статус запрета комментировать топик * * @return int|null */ public function getForbidComment() { return $this->_getDataOne('topic_forbid_comment'); } /** * Возвращает хеш топика для проверки топика на уникальность * * @return string|null */ public function getTextHash() { return $this->_getDataOne('topic_text_hash'); } /** * Возвращает массив тегов * * @return array */ public function getTagsArray() { if ($this->getTags()) { return explode(',',$this->getTags()); } return array(); } /** * Возвращает количество новых комментариев в топике для текущего пользователя * * @return int|null */ public function getCountCommentNew() { return $this->_getDataOne('count_comment_new'); } /** * Возвращает дату прочтения топика для текущего пользователя * * @return string|null */ public function getDateRead() { return $this->_getDataOne('date_read'); } /** * Возвращает объект пользователя, автора топик * * @return ModuleUser_EntityUser|null */ public function getUser() { if (!$this->_getDataOne('user')) { $this->_aData['user']=$this->User_GetUserById($this->getUserId()); } return $this->_getDataOne('user'); } /** * Возвращает объект блого, в котором находится топик * * @return ModuleBlog_EntityBlog|null */ public function getBlog() { return $this->_getDataOne('blog'); } /** * Возвращает полный URL до топика * * @return string */ public function getUrl() { if ($this->getBlog()->getType()=='personal') { return Router::GetPath('blog').$this->getId().'.html'; } else { return Router::GetPath('blog').$this->getBlog()->getUrl().'/'.$this->getId().'.html'; } } /** * Возвращает полный URL до страницы редактировани топика * * @return string */ public function getUrlEdit() { return Router::GetPath('content').'edit/'.$this->getId().'/'; } /** * Возвращает полный URL для удаления топика * * @return string */ public function getUrlDelete() { return Router::GetPath('content').'delete/'.$this->getId().'/'; } /** * Возвращает объект голосования за топик текущим пользователем * * @return ModuleVote_EntityVote|null */ public function getVote() { return $this->_getDataOne('vote'); } /** * Проверяет находится ли данный топик в избранном у текущего пользователя * * @return bool */ public function getIsFavourite() { if ($this->getFavourite()) { return true; } return false; } /** * Проверяет разрешение на удаление топика у текущего пользователя * * @return bool */ public function getIsAllowDelete() { if ($oUser=$this->User_GetUserCurrent()) { return $this->ACL_IsAllowDeleteTopic($this,$oUser); } return false; } /** * Проверяет разрешение на редактирование топика у текущего пользователя * * @return bool */ public function getIsAllowEdit() { if ($oUser=$this->User_GetUserCurrent()) { return $this->ACL_IsAllowEditTopic($this,$oUser); } return false; } /** * Проверяет разрешение на какое-либо действие для топика у текущего пользователя * * @return bool */ public function getIsAllowAction() { if ($this->User_GetUserCurrent()) { return $this->getIsAllowEdit() || $this->getIsAllowDelete(); } return false; } /** * Возвращает количество добавивших топик в избранное * * @return int|null */ public function getCountFavourite() { return $this->_getDataOne('topic_count_favourite'); } /** * Возвращает объект подписки на новые комментарии к топику * * @return ModuleSubscribe_EntitySubscribe|null */ public function getSubscribeNewComment() { if (!($oUserCurrent=$this->User_GetUserCurrent())) { return null; } return $this->Subscribe_GetSubscribeByTargetAndMail('topic_new_comment',$this->getId(),$oUserCurrent->getMail()); } /** * Возвращает тип объекта для дополнительных полей * Метод необходим для интеграции с дополнительными полями (модуль Property) * * @return string */ public function getPropertyTargetType() { return 'topic_'.$this->getType(); } /** * Возвращает объект типа топика * * @return ModuleTopic_EntityTopicType|null */ public function getTypeObject() { if (!$this->_getDataOne('type_object')) { $this->_aData['type_object']=$this->Topic_GetTopicTypeByCode($this->getType()); } return $this->_getDataOne('type_object'); } /** * Возвращает список опросов, которые есть у топика * * @return array|null */ public function getPolls() { if (!$this->_getDataOne('polls')) { $this->_aData['polls']=$this->Poll_GetPollItemsByTarget('topic',$this->getId()); } return $this->_getDataOne('polls'); } /*************************************************************************************************************************************************** * методы расширения типов топика *************************************************************************************************************************************************** */ /** * Извлекает сериализованные данные топика */ protected function extractExtra() { if (is_null($this->aExtra)) { $this->aExtra=@unserialize($this->getExtra()); } } /** * Устанавливает значение нужного параметра * * @param string $sName Название параметра/данных * @param mixed $data Данные */ protected function setExtraValue($sName,$data) { $this->extractExtra(); $this->aExtra[$sName]=$data; $this->setExtra($this->aExtra); } /** * Извлекает значение параметра * * @param string $sName Название параметра * @return null|mixed */ protected function getExtraValue($sName) { $this->extractExtra(); if (isset($this->aExtra[$sName])) { return $this->aExtra[$sName]; } return null; } /** * Возвращает URL для топика-ссылки * * @param bool $bShort Укарачивать урл или нет * @return null|string */ public function getLinkUrl($bShort=false) { if ($this->getType()!='link') { return null; } if ($this->getExtraValue('url')) { if ($bShort) { $sUrl=htmlspecialchars($this->getExtraValue('url')); if (preg_match("/^https?:\/\/(.*)$/i",$sUrl,$aMatch)) { $sUrl=$aMatch[1]; } $sUrlShort=substr($sUrl,0,30); if (strlen($sUrlShort)!=strlen($sUrl)) { return $sUrlShort.'...'; } return $sUrl; } $sUrl=$this->getExtraValue('url'); if (!preg_match("/^https?:\/\/(.*)$/i",$sUrl,$aMatch)) { $sUrl='http://'.$sUrl; } return $sUrl; } return null; } /** * Устанавливает URL для топика-ссылки * * @param string $data */ public function setLinkUrl($data) { if ($this->getType()!='link') { return; } $this->setExtraValue('url',$data); } /** * Возвращает количество переходов по ссылке в топике-ссылке * * @return int|null */ public function getLinkCountJump() { if ($this->getType()!='link') { return null; } return (int)$this->getExtraValue('count_jump'); } /** * Устанавливает количество переходов по ссылке в топике-ссылке * * @param string $data */ public function setLinkCountJump($data) { if ($this->getType()!='link') { return; } $this->setExtraValue('count_jump',$data); } //************************************************************************************************************************************************* /** * Устанваливает ID топика * * @param int $data */ public function setId($data) { $this->_aData['topic_id']=$data; } /** * Устанавливает ID блога * * @param int $data */ public function setBlogId($data) { $this->_aData['blog_id']=$data; } /** * Устанавливает ID пользователя * * @param int $data */ public function setUserId($data) { $this->_aData['user_id']=$data; } /** * Устанавливает тип топика * * @param string $data */ public function setType($data) { $this->_aData['topic_type']=$data; } /** * Устанавливает заголовок топика * * @param string $data */ public function setTitle($data) { $this->_aData['topic_title']=$data; } /** * Устанавливает текст топика * * @param string $data */ public function setText($data) { $this->_aData['topic_text']=$data; } /** * Устанавливает сериализованную строчку дополнительных данных * * @param string $data */ public function setExtra($data) { $this->_aData['topic_extra']=serialize($data); } /** * Устанавливает короткий текст топика до ката * * @param string $data */ public function setTextShort($data) { $this->_aData['topic_text_short']=$data; } /** * Устаналивает исходный текст топика * * @param string $data */ public function setTextSource($data) { $this->_aData['topic_text_source']=$data; } /** * Устанавливает список тегов в виде строки * * @param string $data */ public function setTags($data) { $this->_aData['topic_tags']=$data; } /** * Устанавливает дату создания топика * * @param string $data */ public function setDateAdd($data) { $this->_aData['topic_date_add']=$data; } /** * Устанавливает дату редактирования топика * * @param string $data */ public function setDateEdit($data) { $this->_aData['topic_date_edit']=$data; } /** * Устанавливает IP пользователя * * @param string $data */ public function setUserIp($data) { $this->_aData['topic_user_ip']=$data; } /** * Устанавливает флаг публикации топика * * @param string $data */ public function setPublish($data) { $this->_aData['topic_publish']=$data; } /** * Устанавливает флаг публикации черновика * * @param string $data */ public function setPublishDraft($data) { $this->_aData['topic_publish_draft']=$data; } /** * Устанавливает флаг публикации на главной странице * * @param string $data */ public function setPublishIndex($data) { $this->_aData['topic_publish_index']=$data; } /** * Устанавливает рейтинг топика * * @param string $data */ public function setRating($data) { $this->_aData['topic_rating']=$data; } /** * Устанавливает количество проголосовавших * * @param int $data */ public function setCountVote($data) { $this->_aData['topic_count_vote']=$data; } /** * Устанавливает количество проголосовавших в плюс * * @param int $data */ public function setCountVoteUp($data) { $this->_aData['topic_count_vote_up']=$data; } /** * Устанавливает количество проголосовавших в минус * * @param int $data */ public function setCountVoteDown($data) { $this->_aData['topic_count_vote_down']=$data; } /** * Устанавливает число воздержавшихся * * @param int $data */ public function setCountVoteAbstain($data) { $this->_aData['topic_count_vote_abstain']=$data; } /** * Устанавливает число прочтения топика * * @param int $data */ public function setCountRead($data) { $this->_aData['topic_count_read']=$data; } /** * Устанавливает количество комментариев * * @param int $data */ public function setCountComment($data) { $this->_aData['topic_count_comment']=$data; } /** * Устанавливает текст ката * * @param string $data */ public function setCutText($data) { $this->_aData['topic_cut_text']=$data; } /** * Устанавливает флаг запрета коментирования топика * * @param int $data */ public function setForbidComment($data) { $this->_aData['topic_forbid_comment']=$data; } /** * Устанавливает хеш топика * * @param string $data */ public function setTextHash($data) { $this->_aData['topic_text_hash']=$data; } /** * Устанавливает объект пользователя * * @param ModuleUser_EntityUser $data */ public function setUser($data) { $this->_aData['user']=$data; } /** * Устанавливает объект блога * * @param ModuleBlog_EntityBlog $data */ public function setBlog($data) { $this->_aData['blog']=$data; } /** * Устанавливает факт голосования пользователя в топике-опросе * * @param int $data */ public function setUserQuestionIsVote($data) { $this->_aData['user_question_is_vote']=$data; } /** * Устанавливает объект голосования за топик * * @param ModuleVote_EntityVote $data */ public function setVote($data) { $this->_aData['vote']=$data; } /** * Устанавливает количество новых комментариев * * @param int $data */ public function setCountCommentNew($data) { $this->_aData['count_comment_new']=$data; } /** * Устанавливает дату прочтения топика текущим пользователем * * @param string $data */ public function setDateRead($data) { $this->_aData['date_read']=$data; } /** * Устанавливает количество пользователей, добавивших топик в избранное * * @param int $data */ public function setCountFavourite($data) { $this->_aData['topic_count_favourite']=$data; } } ?>