/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @return bool */ public function UpdateBlog(ModuleBlog_EntityBlog $oBlog) { $sql = "UPDATE " . Config::Get('db.table.blog') . " \n\t\t\tSET \n\t\t\t\tblog_title= ?,\n\t\t\t\tblog_description= ?,\n\t\t\t\tblog_type= ?,\n\t\t\t\tblog_date_edit= ?,\n\t\t\t\tblog_rating= ?f,\n\t\t\t\tblog_count_vote = ?d,\n\t\t\t\tblog_count_user= ?d,\n\t\t\t\tblog_count_topic= ?d,\n\t\t\t\tblog_limit_rating_topic= ?f ,\n\t\t\t\tblog_url= ?,\n\t\t\t\tblog_avatar= ?\n\t\t\tWHERE\n\t\t\t\tblog_id = ?d\n\t\t"; if ($this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getRating(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getAvatar(), $oBlog->getId())) { return true; } return false; }
/** * Show topic * * @return string|null */ protected function EventShowTopic() { $this->sMenuHeadItemSelect = 'index'; $sBlogUrl = ''; $sTopicUrlMask = R::GetTopicUrlMask(); if ($this->oCurrentTopic) { $this->oCurrentBlog = $this->oCurrentTopic->getBlog(); if ($this->oCurrentBlog) { $sBlogUrl = $this->oCurrentBlog->getUrl(); } $this->sMenuItemSelect = 'blog'; } else { if ($this->GetParamEventMatch(0, 1)) { // из коллективного блога $sBlogUrl = $this->sCurrentEvent; $iTopicId = $this->GetParamEventMatch(0, 1); $this->sMenuItemSelect = 'blog'; } else { // из персонального блога $iTopicId = $this->GetEventMatch(1); $this->sMenuItemSelect = 'log'; } // * Проверяем есть ли такой топик if (!$iTopicId || !($this->oCurrentTopic = E::ModuleTopic()->GetTopicById($iTopicId))) { return parent::EventNotFound(); } } if (!$this->oCurrentTopic->getBlog()) { // Этого быть не должно, но если вдруг, то надо отработать return parent::EventNotFound(); } $this->sMenuSubItemSelect = ''; // Trusted user is admin or owner of topic if ($this->oUserCurrent && ($this->oUserCurrent->isAdministrator() || $this->oUserCurrent->isModerator() || $this->oUserCurrent->getId() == $this->oCurrentTopic->getUserId())) { $bTrustedUser = true; } else { $bTrustedUser = false; } if (!$bTrustedUser) { // Topic with future date if ($this->oCurrentTopic->getDate() > date('Y-m-d H:i:s')) { return parent::EventNotFound(); } // * Проверяем права на просмотр топика-черновика if (!$this->oCurrentTopic->getPublish()) { if (!Config::Get('module.topic.draft_link')) { return parent::EventNotFound(); } else { // Если режим просмотра по прямой ссылке включен, то проверяем параметры $bOk = false; if ($sDraftCode = F::GetRequestStr('draft', null, 'get')) { if (strpos($sDraftCode, ':')) { list($nUser, $sHash) = explode(':', $sDraftCode); if ($this->oCurrentTopic->GetUserId() == $nUser && $this->oCurrentTopic->getTextHash() == $sHash) { $bOk = true; } } } if (!$bOk) { return parent::EventNotFound(); } } } } // Если номер топика правильный, но URL блога неверный, то корректируем его и перенаправляем на нужный адрес if ($sBlogUrl !== '' && $this->oCurrentTopic->getBlog()->getUrl() !== $sBlogUrl) { R::Location($this->oCurrentTopic->getUrl()); } // Если запросили топик с определенной маской, не указаным названием блога, // но ссылка на топик и ЧПУ url разные, и это не запрос RSS // то перенаправляем на страницу для вывода топика (во избежание дублирования контента по разным URL) if ($sTopicUrlMask && $sBlogUrl == '' && $this->oCurrentTopic->getUrl() != R::GetPathWebCurrent() . (substr($this->oCurrentTopic->getUrl(), -1) === '/' ? '/' : '') && substr(R::RealUrl(true), 0, 4) !== 'rss/') { R::Location($this->oCurrentTopic->getUrl()); } // Checks rights to show content from the blog if (!$this->oCurrentTopic->getBlog()->CanReadBy($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('acl_cannot_show_content'), E::ModuleLang()->Get('not_access')); return R::Action('error'); } // Обрабатываем добавление коммента if (isset($_REQUEST['submit_comment'])) { $this->SubmitComment(); } // Достаём комменты к топику if (!Config::Get('module.comment.nested_page_reverse') && Config::Get('module.comment.use_nested') && Config::Get('module.comment.nested_per_page')) { $iPageDef = ceil(E::ModuleComment()->GetCountCommentsRootByTargetId($this->oCurrentTopic->getId(), 'topic') / Config::Get('module.comment.nested_per_page')); } else { $iPageDef = 1; } $iPage = intval(F::GetRequest('cmtpage', 0)); if ($iPage < 1) { $iPage = $iPageDef; } $aReturn = E::ModuleComment()->GetCommentsByTargetId($this->oCurrentTopic, 'topic', $iPage, Config::Get('module.comment.nested_per_page')); $iMaxIdComment = $aReturn['iMaxIdComment']; /** @var ModuleComment_EntityComment[] $aComments */ $aComments = $aReturn['comments']; if ($aComments && $iMaxIdComment && isset($aComments[$iMaxIdComment])) { $sLastCommentDate = $aComments[$iMaxIdComment]->getDate(); } else { $sLastCommentDate = null; } // Если используется постраничность для комментариев - формируем ее if (Config::Get('module.comment.use_nested') && Config::Get('module.comment.nested_per_page')) { $aPaging = E::ModuleViewer()->MakePaging($aReturn['count'], $iPage, Config::Get('module.comment.nested_per_page'), Config::Get('pagination.pages.count'), ''); if (!Config::Get('module.comment.nested_page_reverse') && $aPaging) { // переворачиваем страницы в обратном порядке $aPaging['aPagesLeft'] = array_reverse($aPaging['aPagesLeft']); $aPaging['aPagesRight'] = array_reverse($aPaging['aPagesRight']); } E::ModuleViewer()->Assign('aPagingCmt', $aPaging); } // issue 253 {@link https://github.com/altocms/altocms/issues/253} // Запрещаем оставлять комментарии к топику-черновику // if ($this->oUserCurrent) { if ($this->oUserCurrent && (int) $this->oCurrentTopic->getPublish()) { $bAllowToComment = E::ModuleBlog()->GetBlogsAllowTo('comment', $this->oUserCurrent, $this->oCurrentTopic->getBlog()->GetId(), true); } else { $bAllowToComment = false; } // Отмечаем прочтение топика if ($this->oUserCurrent) { $oTopicRead = E::ModuleTopic()->GetTopicRead($this->oCurrentTopic->getId(), $this->oUserCurrent->getid()); if (!$oTopicRead) { /** @var ModuleTopic_EntityTopicRead $oTopicRead */ $oTopicRead = E::GetEntity('Topic_TopicRead'); $oTopicRead->setTopicId($this->oCurrentTopic->getId()); $oTopicRead->setUserId($this->oUserCurrent->getId()); $oTopicRead->setCommentCountLast($this->oCurrentTopic->getCountComment()); $oTopicRead->setCommentIdLast($iMaxIdComment); $oTopicRead->setDateRead(F::Now()); E::ModuleTopic()->AddTopicRead($oTopicRead); } else { if ($oTopicRead->getCommentCountLast() != $this->oCurrentTopic->getCountComment() || $oTopicRead->getCommentIdLast() != $iMaxIdComment || !is_null($sLastCommentDate) && $oTopicRead->getDateRead() <= $sLastCommentDate) { $oTopicRead->setCommentCountLast($this->oCurrentTopic->getCountComment()); $oTopicRead->setCommentIdLast($iMaxIdComment); $oTopicRead->setDateRead(F::Now()); E::ModuleTopic()->UpdateTopicRead($oTopicRead); } } } // Выставляем SEO данные $sTextSeo = strip_tags($this->oCurrentTopic->getText()); E::ModuleViewer()->SetHtmlDescription(F::CutText($sTextSeo, Config::Get('view.html.description_max_words'))); E::ModuleViewer()->SetHtmlKeywords($this->oCurrentTopic->getTags()); E::ModuleViewer()->SetHtmlCanonical($this->oCurrentTopic->getUrl()); // Вызов хуков E::ModuleHook()->Run('topic_show', array('oTopic' => $this->oCurrentTopic)); // Загружаем переменные в шаблон E::ModuleViewer()->Assign('oTopic', $this->oCurrentTopic); E::ModuleViewer()->Assign('aComments', $aComments); E::ModuleViewer()->Assign('iMaxIdComment', $iMaxIdComment); E::ModuleViewer()->Assign('bAllowToComment', $bAllowToComment); // Устанавливаем title страницы E::ModuleViewer()->AddHtmlTitle($this->oCurrentTopic->getBlog()->getTitle()); E::ModuleViewer()->AddHtmlTitle($this->oCurrentTopic->getTitle()); E::ModuleViewer()->SetHtmlRssAlternate(R::GetPath('rss') . 'comments/' . $this->oCurrentTopic->getId() . '/', $this->oCurrentTopic->getTitle()); // Устанавливаем шаблон вывода $this->SetTemplateAction('topic'); // Additional tags for <head> $aHeadTags = $this->_getHeadTags($this->oCurrentTopic); if ($aHeadTags) { E::ModuleViewer()->SetHtmlHeadTags($aHeadTags); } return null; }
/** * Загружает аватар в блог * * @param array $aFile Массив $_FILES при загрузке аватара * @param ModuleBlog_EntityBlog $oBlog Блог * @return bool */ public function UploadBlogAvatar($aFile, $oBlog) { 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; } $sPath = $this->Image_GetIdDir($oBlog->getOwnerId()) . "blogs/" . $oBlog->getId() . "/"; $aParams = $this->Image_BuildParams('avatar'); $oImage = $this->Image_CreateImageObject($sFileTmp); /** * Если объект изображения не создан, * возвращаем ошибку */ if ($sError = $oImage->get_last_error()) { // Вывод сообщения об ошибки, произошедшей при создании объекта изображения // $this->Message_AddError($sError,$this->Lang_Get('error')); @unlink($sFileTmp); return false; } /** * Срезаем квадрат */ $oImage = $this->Image_CropSquare($oImage); $aSize = Config::Get('module.blog.avatar_size'); rsort($aSize, SORT_NUMERIC); $sSizeBig = array_shift($aSize); if ($oImage && ($sFileAvatar = $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}_{$sSizeBig}x{$sSizeBig}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $sSizeBig, $sSizeBig, false, $aParams, $oImage))) { foreach ($aSize as $iSize) { if ($iSize == 0) { $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), null, null, false, $aParams, $oImage); } else { $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}_{$iSize}x{$iSize}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $iSize, $iSize, false, $aParams, $oImage); } } @unlink($sFileTmp); /** * Если все нормально, возвращаем расширение загруженного аватара */ return $this->Image_GetWebPath($sFileAvatar); } @unlink($sFileTmp); /** * В случае ошибки, возвращаем false */ return false; }
/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * * @return bool */ public function UpdateBlog($oBlog) { $sql = "\n UPDATE ?_blog\n SET\n blog_title = ?,\n blog_description = ?,\n blog_type = ?,\n blog_date_edit = ?,\n blog_rating = ?f,\n blog_count_vote = ?d,\n blog_count_user = ?d,\n blog_count_topic = ?d,\n blog_limit_rating_topic = ?f ,\n blog_url = ?,\n blog_avatar = ?\n WHERE\n blog_id = ?d\n "; $bResult = $this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getRating(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getAvatar(), $oBlog->getId()); return $bResult !== false; }
/** * Обновляет блог в БД * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @return bool */ public function UpdateBlog(ModuleBlog_EntityBlog $oBlog) { $sql = "UPDATE " . Config::Get('db.table.blog') . "\n\t\t\tSET \n\t\t\t\tblog_title= ?,\n\t\t\t\tblog_description= ?,\n\t\t\t\tblog_type= ?,\n\t\t\t\tblog_date_edit= ?,\n\t\t\t\tblog_count_vote = ?d,\n\t\t\t\tblog_count_user= ?d,\n\t\t\t\tblog_count_topic= ?d,\n\t\t\t\tblog_limit_rating_topic= ?f ,\n\t\t\t\tblog_url= ?,\n\t\t\t\tblog_skip_index= ?d,\n\t\t\t\tblog_avatar= ?\n\t\t\tWHERE\n\t\t\t\tblog_id = ?d\n\t\t"; $res = $this->oDb->query($sql, $oBlog->getTitle(), $oBlog->getDescription(), $oBlog->getType(), $oBlog->getDateEdit(), $oBlog->getCountVote(), $oBlog->getCountUser(), $oBlog->getCountTopic(), $oBlog->getLimitRatingTopic(), $oBlog->getUrl(), $oBlog->getSkipIndex(), $oBlog->getAvatar(), $oBlog->getId()); return $this->IsSuccessful($res); }