1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-02 22:45:02 +03:00
ifhub.club/classes/actions/ActionBlog.class.php

932 lines
33 KiB
PHP
Raw Normal View History

<?php
2008-09-21 09:36:57 +03:00
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Класс обработки URL'ов вида /blog/
*
*/
class ActionBlog extends Action {
/**
* Главное меню
*
* @var unknown_type
*/
protected $sMenuHeadItemSelect='blog';
2008-09-21 09:36:57 +03:00
/**
* Какое меню активно
*
* @var unknown_type
*/
protected $sMenuItemSelect='blog';
/**
* Какое подменю активно
*
* @var unknown_type
*/
protected $sMenuSubItemSelect='good';
/**
* УРЛ блога который подставляется в меню
*
* @var unknown_type
*/
protected $sMenuSubBlogUrl;
/**
* Текущий пользователь
*
* @var unknown_type
*/
protected $oUserCurrent=null;
/**
* Число новых топиков в коллективных блогах
*
* @var unknown_type
*/
protected $iCountTopicsCollectiveNew=0;
/**
* Число новых топиков в персональных блогах
*
* @var unknown_type
*/
protected $iCountTopicsPersonalNew=0;
/**
* Число новых топиков в конкретном блоге
*
* @var unknown_type
*/
protected $iCountTopicsBlogNew=0;
/**
* Число новых топиков
*
* @var unknown_type
*/
protected $iCountTopicsNew=0;
/**
* Список URL с котрыми запрещено создавать блог
*
* @var unknown_type
*/
protected $aBadBlogUrl=array('new','good','bad','edit','add','admin');
2008-09-21 09:36:57 +03:00
/**
* Инизиализация экшена
*
*/
public function Init() {
/**
* Устанавливаем евент по дефолту, т.е. будем показывать хорошие топики из коллективных блогов
*/
$this->SetDefaultEvent('good');
$this->sMenuSubBlogUrl=DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/';
2008-09-21 09:36:57 +03:00
/**
* Достаём текущего пользователя
*/
$this->oUserCurrent=$this->User_GetUserCurrent();
/**
* Определяем какие блоки нужно выводить справа
*/
$this->Viewer_AddBlocks('right',array('stream','tags','blogs'));
2008-09-21 09:36:57 +03:00
/**
* Подсчитываем новые топики
*/
$this->iCountTopicsCollectiveNew=$this->Topic_GetCountTopicsCollectiveNew();
$this->iCountTopicsPersonalNew=$this->Topic_GetCountTopicsPersonalNew();
$this->iCountTopicsBlogNew=$this->iCountTopicsCollectiveNew;
$this->iCountTopicsNew=$this->iCountTopicsCollectiveNew+$this->iCountTopicsPersonalNew;
}
/**
* Регистрируем евенты, по сути определяем УРЛы вида /blog/.../
*
*/
2009-06-07 21:40:54 +03:00
protected function RegisterEvent() {
$this->AddEventPreg('/^good$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEvent('good','EventTopics');
$this->AddEventPreg('/^bad$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i','EventTopics');
2008-09-21 09:36:57 +03:00
$this->AddEvent('add','EventAddBlog');
$this->AddEvent('edit','EventEditBlog');
$this->AddEvent('admin','EventAdminBlog');
$this->AddEventPreg('/^(\d+)\.html$/i','EventShowTopicPersonal');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i','EventShowTopic');
2009-06-07 20:20:58 +03:00
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^bad$/i','/^(page(\d+))?$/i','EventShowBlog');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^new$/i','/^(page(\d+))?$/i','EventShowBlog');
2008-09-21 09:36:57 +03:00
}
/**********************************************************************************
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
**********************************************************************************
*/
/**
* Добавление нового блога
*
* @return unknown
*/
protected function EventAddBlog() {
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_create'));
2008-09-21 09:36:57 +03:00
/**
* Меню
*/
$this->sMenuSubItemSelect='add';
$this->sMenuItemSelect='add_blog';
/**
* Проверяем авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return Router::Action('error');
}
/**
* Проверяем хватает ли рейтинга юзеру чтоб создать блог
*/
if (!$this->ACL_CanCreateBlog($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_create_acl'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return Router::Action('error');
}
/**
* Запускаем проверку корректности ввода полей при добалении блога
*/
if (!$this->checkBlogFields()) {
return false;
}
$this->Security_ValidateSendForm();
2008-09-21 09:36:57 +03:00
/**
* Если всё ок то пытаемся создать блог
*/
$oBlog=new BlogEntity_Blog();
$oBlog->setOwnerId($this->oUserCurrent->getId());
$oBlog->setTitle(getRequest('blog_title'));
/**
* Парсим текст на предмет разных ХТМЛ тегов
*/
$sText=$this->Text_Parser(getRequest('blog_description'));
$oBlog->setDescription($sText);
$oBlog->setType(getRequest('blog_type'));
$oBlog->setDateAdd(date("Y-m-d H:i:s"));
$oBlog->setLimitRatingTopic(getRequest('blog_limit_rating_topic'));
$oBlog->setUrl(getRequest('blog_url'));
$oBlog->setAvatar(0);
$oBlog->setAvatarType(null);
/**
* Загрузка аватара, делаем ресайзы
*/
if (isset($_FILES['avatar']) and is_uploaded_file($_FILES['avatar']['tmp_name'])) {
$sFileTmp=$_FILES['avatar']['tmp_name'];
if ($sFileAvatar=func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}_48x48",3000,3000,48,48)) {
func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}_24x24",3000,3000,24,24);
func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}",3000,3000);
$oBlog->setAvatar(1);
$aFileInfo=pathinfo($sFileAvatar);
$oBlog->setAvatarType($aFileInfo['extension']);
} else {
$this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
return false;
}
}
2008-09-21 09:36:57 +03:00
/**
* Создаём блог
*/
if ($this->Blog_AddBlog($oBlog)) {
/**
* Получаем блог, это для получение полного пути блога, если он в будущем будет зависит от других сущностей(компании, юзер и т.п.)
*/
$oBlog->Blog_GetBlogById($oBlog->getId());
func_header_location($oBlog->getUrlFull());
2008-09-21 09:36:57 +03:00
} else {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
}
}
/**
* Редактирование блога
*
* @return unknown
*/
protected function EventEditBlog() {
/**
* Меню
*/
$this->sMenuSubItemSelect='';
$this->sMenuItemSelect='profile';
2008-09-21 09:36:57 +03:00
/**
* Проверяем передан ли в УРЛе номер блога
*/
$sBlogId=$this->GetParam(0);
if (!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
return parent::EventNotFound();
}
/**
* Проверяем тип блога
*/
if ($oBlog->getType()=='personal') {
return parent::EventNotFound();
}
2008-09-21 09:36:57 +03:00
/**
* Проверям авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return Router::Action('error');
}
/**
* Явлется ли авторизованный пользователь хозяином блога, либо его администратором
2008-09-21 09:36:57 +03:00
*/
$oBlogUser=$this->Blog_GetRelationBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId());
$bIsAdministratorBlog=$oBlogUser ? $oBlogUser->getIsAdministrator() : false;
if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
2008-09-21 09:36:57 +03:00
return parent::EventNotFound();
}
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_edit'));
$this->Viewer_Assign('oBlogEdit',$oBlog);
2008-09-21 09:36:57 +03:00
/**
* Устанавливаем шалон для вывода
*/
$this->SetTemplateAction('add');
/**
* Если нажали кнопку "Сохранить"
*/
if (isset($_REQUEST['submit_blog_add'])) {
$this->Security_ValidateSendForm();
2008-09-21 09:36:57 +03:00
/**
* Запускаем проверку корректности ввода полей при редактировании блога
*/
if (!$this->checkBlogFields($oBlog)) {
2008-09-21 09:36:57 +03:00
return false;
}
$oBlog->setTitle(getRequest('blog_title'));
/**
* Парсим описание блога на предмет ХТМЛ тегов
*/
$sText=$this->Text_Parser(getRequest('blog_description'));
$oBlog->setDescription($sText);
$oBlog->setType(getRequest('blog_type'));
$oBlog->setLimitRatingTopic(getRequest('blog_limit_rating_topic'));
//$oBlog->setUrl(getRequest('blog_url')); // запрещаем смену URL блога
/**
* Загрузка аватара, делаем ресайзы
*/
if (isset($_FILES['avatar']) and is_uploaded_file($_FILES['avatar']['tmp_name'])) {
$sFileTmp=$_FILES['avatar']['tmp_name'];
if ($sFileAvatar=func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}_48x48",3000,3000,48,48)) {
func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}_24x24",3000,3000,24,24);
func_img_resize($sFileTmp,DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId(),"avatar_blog_{$oBlog->getUrl()}",3000,3000);
$oBlog->setAvatar(1);
$aFileInfo=pathinfo($sFileAvatar);
$oBlog->setAvatarType($aFileInfo['extension']);
} else {
$this->Message_AddError($this->Lang_Get('blog_create_avatar_delete'),$this->Lang_Get('error'));
return false;
}
}
/**
* Удалить аватар
*/
if (isset($_REQUEST['avatar_delete'])) {
$oBlog->setAvatar(0);
@unlink(DIR_SERVER_ROOT.DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId()."/avatar_blog_{$oBlog->getUrl()}_48x48.".$oBlog->getAvatarType());
@unlink(DIR_SERVER_ROOT.DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId()."/avatar_blog_{$oBlog->getUrl()}_24x24.".$oBlog->getAvatarType());
@unlink(DIR_SERVER_ROOT.DIR_UPLOADS_IMAGES.'/'.$oBlog->getOwnerId()."/avatar_blog_{$oBlog->getUrl()}.".$oBlog->getAvatarType());
$oBlog->setAvatarType(null);
}
2008-09-21 09:36:57 +03:00
/**
* Обновляем блог
*/
if ($this->Blog_UpdateBlog($oBlog)) {
func_header_location($oBlog->getUrlFull());
2008-09-21 09:36:57 +03:00
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return Router::Action('error');
}
} else {
/**
* Загружаем данные в форму редактирования блога
*/
$_REQUEST['blog_title']=$oBlog->getTitle();
$_REQUEST['blog_url']=$oBlog->getUrl();
$_REQUEST['blog_type']=$oBlog->getType();
$_REQUEST['blog_description']=$oBlog->getDescription();
$_REQUEST['blog_limit_rating_topic']=$oBlog->getLimitRatingTopic();
$_REQUEST['blog_id']=$oBlog->getId();
}
}
/**
* Управление пользователями блога
*
* @return unknown
*/
protected function EventAdminBlog() {
/**
* Меню
*/
$this->sMenuItemSelect='admin';
$this->sMenuSubItemSelect='';
/**
* Проверяем передан ли в УРЛе номер блога
*/
$sBlogId=$this->GetParam(0);
if (!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
return parent::EventNotFound();
}
/**
* Проверям авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
return Router::Action('error');
}
/**
* Явлется ли авторизованный пользователь хозяином блога, либо его администратором
*/
$oBlogUser=$this->Blog_GetRelationBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId());
$bIsAdministratorBlog=$oBlogUser ? $oBlogUser->getIsAdministrator() : false;
if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
return parent::EventNotFound();
}
/**
* Обрабатываем сохранение формы
*/
if (isset($_REQUEST['submit_blog_admin'])) {
$this->Security_ValidateSendForm();
$aUserRank=getRequest('user_rank',array());
if (!is_array($aUserRank)) {
$aUserRank=array();
}
foreach ($aUserRank as $sUserId => $sRank) {
if (!($oBlogUser=$this->Blog_GetRelationBlogUserByBlogIdAndUserId($oBlog->getId(),$sUserId))) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
break;
}
switch ($sRank) {
case 'administrator':
$oBlogUser->setIsAdministrator(1);
$oBlogUser->setIsModerator(0);
break;
case 'moderator':
$oBlogUser->setIsAdministrator(0);
$oBlogUser->setIsModerator(1);
break;
default:
$oBlogUser->setIsAdministrator(0);
$oBlogUser->setIsModerator(0);
break;
}
$this->Blog_UpdateRelationBlogUser($oBlogUser);
$this->Message_AddNoticeSingle($this->Lang_Get('blog_admin_users_submit_ok'));
}
}
/**
* Получаем список подписчиков блога
*/
$aBlogUsers=$this->Blog_GetRelationBlog($oBlog->getId());
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_admin'));
$this->Viewer_Assign('oBlogEdit',$oBlog);
$this->Viewer_Assign('aBlogUsers',$aBlogUsers);
/**
* Устанавливаем шалон для вывода
*/
$this->SetTemplateAction('admin');
2008-09-21 09:36:57 +03:00
}
/**
* Проверка полей блога
*
* @return unknown
*/
protected function checkBlogFields($oBlog=null) {
2008-09-21 09:36:57 +03:00
/**
* Проверяем только если была отправлена форма с данными
*/
if (!isset($_REQUEST['submit_blog_add'])) {
$_REQUEST['blog_limit_rating_topic']=0;
return false;
}
$bOk=true;
/**
* Проверяем есть ли название блога
*/
if (!func_check(getRequest('blog_title'),'text',2,200)) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
$bOk=false;
}
/**
* Проверяем есть ли уже блог с таким названием
*/
if ($oBlogExists=$this->Blog_GetBlogByTitle(getRequest('blog_title'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error_unique'),$this->Lang_Get('error'));
$bOk=false;
}
}
if (!$oBlog) {
/**
* Проверяем есть ли URL блога, с заменой всех пробельных символов на "_"
* Проверка только в том случаи если создаём новый блог, т.к при редактировании URL нельзя менять
*/
$blogUrl=preg_replace("/\s+/",'_',getRequest('blog_url'));
$_REQUEST['blog_url']=$blogUrl;
if (!func_check(getRequest('blog_url'),'login',2,50)) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error'),$this->Lang_Get('error'));
$bOk=false;
}
2008-09-21 09:36:57 +03:00
}
/**
* Проверяем на счет плохих УРЛов
*/
if (in_array(getRequest('blog_url'),$this->aBadBlogUrl)) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error_badword').' '.join(',',$this->aBadBlogUrl),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
$bOk=false;
}
/**
* Проверяем есть ли уже блог с таким URL
*/
if ($oBlogExists=$this->Blog_GetBlogByUrl(getRequest('blog_url'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error_unique'),$this->Lang_Get('error'));
$bOk=false;
}
}
2008-09-21 09:36:57 +03:00
/**
* Проверяем есть ли описание блога
*/
if (!func_check(getRequest('blog_description'),'text',10,3000)) {
$this->Message_AddError($this->Lang_Get('blog_create_description_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
$bOk=false;
}
/**
* Проверяем доступные типы блога для создания, пока доступен только один тип - open
*/
if (!in_array(getRequest('blog_type'),array('open'))) {
$this->Message_AddError($this->Lang_Get('blog_create_type_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
$bOk=false;
}
/**
* Преобразуем ограничение по рейтингу в число
*/
if (!func_check(getRequest('blog_limit_rating_topic'),'float')) {
$this->Message_AddError($this->Lang_Get('blog_create_rating_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
$bOk=false;
}
return $bOk;
}
/**
2009-06-07 21:40:54 +03:00
* Показ всех топиков
2008-09-21 09:36:57 +03:00
*
*/
2009-06-07 21:40:54 +03:00
protected function EventTopics() {
$sShowType=$this->sCurrentEvent;
2008-09-21 09:36:57 +03:00
/**
* Меню
*/
2009-06-07 21:40:54 +03:00
$this->sMenuSubItemSelect=$sShowType;
2008-09-21 09:36:57 +03:00
/**
* Передан ли номер страницы
*/
2009-06-07 21:40:54 +03:00
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
2008-09-21 09:36:57 +03:00
/**
* Получаем список топиков
2009-06-05 16:57:11 +03:00
*/
2009-06-07 21:40:54 +03:00
$aResult=$this->Topic_GetTopicsCollective($iPage,BLOG_TOPIC_PER_PAGE,$sShowType);
2008-09-21 09:36:57 +03:00
$aTopics=$aResult['collection'];
/**
* Формируем постраничность
*/
2009-06-07 21:40:54 +03:00
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$sShowType);
/**
* Вызов хуков
*/
2009-06-07 21:40:54 +03:00
$this->Hook_Run('blog_show',array('sShowType'=>$sShowType));
2008-09-21 09:36:57 +03:00
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aTopics',$aTopics);
$this->Viewer_Assign('aPaging',$aPaging);
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('index');
2009-06-07 21:40:54 +03:00
}
2008-09-21 09:36:57 +03:00
/**
* Показ топика из персонального блога
*
* @param unknown_type $iTopicId
* @return unknown
*/
protected function EventShowTopicPersonal() {
$iTopicId=$this->GetEventMatch(1);
2008-09-21 09:36:57 +03:00
/**
* Меню
*/
$this->sMenuItemSelect='log';
$this->sMenuSubItemSelect='';
/**
* Проверяем есть ли такой топик
*/
2009-06-05 16:57:11 +03:00
if (!($oTopic=$this->Topic_GetTopicById($iTopicId))) {
2008-09-21 09:36:57 +03:00
return parent::EventNotFound();
}
/**
* Проверяем права на просмотр топика
*/
if (!$oTopic->getPublish() and (!$this->oUserCurrent or ($this->oUserCurrent->getId()!=$oTopic->getUserId() and !$this->oUserCurrent->isAdministrator()))) {
return parent::EventNotFound();
}
/**
* Если запросили не персональный топик то перенаправляем на страницу для вывода коллективного топика
2008-09-21 09:36:57 +03:00
*/
2009-06-05 16:57:11 +03:00
if ($oTopic->getBlog()->getType()!='personal') {
func_header_location($oTopic->getUrl());
2008-09-21 09:36:57 +03:00
}
/**
* Обрабатываем добавление коммента
*/
$this->SubmitComment($oTopic);
/**
* Достаём комменты к топику
*/
$aReturn=$this->Comment_GetCommentsByTopicId($oTopic->getId());
$iMaxIdComment=$aReturn['iMaxIdComment'];
2009-06-05 16:57:11 +03:00
$aComments=$aReturn['comments'];
2008-09-21 09:36:57 +03:00
/**
* Отмечаем дату прочтения топика
*/
if ($this->oUserCurrent) {
$oTopicRead=new TopicEntity_TopicRead();
$oTopicRead->setTopicId($oTopic->getId());
$oTopicRead->setUserId($this->oUserCurrent->getId());
$oTopicRead->setCommentCountLast($oTopic->getCountComment());
$oTopicRead->setCommentIdLast($iMaxIdComment);
$oTopicRead->setDateRead(date("Y-m-d H:i:s"));
$this->Topic_SetTopicRead($oTopicRead);
}
/**
* Вызов хуков
*/
$this->Hook_Run('topic_show',array("oTopic"=>$oTopic));
/**
* Выставляем SEO данные
*/
$sTextSeo=preg_replace("/<.*>/Ui",' ',$oTopic->getText());
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo,20));
$this->Viewer_SetHtmlKeywords($oTopic->getTags());
2008-09-21 09:36:57 +03:00
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('oTopic',$oTopic);
$this->Viewer_Assign('aComments',$aComments);
$this->Viewer_Assign('iMaxIdComment',$iMaxIdComment);
2009-06-05 16:57:11 +03:00
$this->Viewer_AddHtmlTitle($oTopic->getBlog()->getTitle());
2008-09-21 09:36:57 +03:00
$this->Viewer_AddHtmlTitle($oTopic->getTitle());
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/comments/'.$oTopic->getId().'/',$oTopic->getTitle());
2008-09-21 09:36:57 +03:00
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('topic');
}
/**
* Показ топика из коллективного блога
*
* @param unknown_type $sBlogUrl
* @param unknown_type $iTopicId
* @return unknown
*/
protected function EventShowTopic() {
$sBlogUrl=$this->sCurrentEvent;
$iTopicId=$this->GetParamEventMatch(0,1);
2008-09-21 09:36:57 +03:00
/**
* Меню
*/
$this->sMenuSubItemSelect='';
/**
* Проверяем есть ли такой топик
*/
2009-06-05 16:57:11 +03:00
if (!($oTopic=$this->Topic_GetTopicById($iTopicId))) {
2008-09-21 09:36:57 +03:00
return parent::EventNotFound();
}
/**
* Проверяем права на просмотр топика
*/
if (!$oTopic->getPublish() and (!$this->oUserCurrent or ($this->oUserCurrent->getId()!=$oTopic->getUserId() and !$this->oUserCurrent->isAdministrator()))) {
return parent::EventNotFound();
}
/**
* Если запросили топик из персонального блога то перенаправляем на страницу вывода коллективного топика
2008-09-21 09:36:57 +03:00
*/
2009-06-05 16:57:11 +03:00
if ($oTopic->getBlog()->getType()=='personal') {
func_header_location($oTopic->getUrl());
2008-09-21 09:36:57 +03:00
}
/**
* Если номер топика правильный но УРЛ блога косяный то корректируем его и перенаправляем на нужный адрес
*/
2009-06-05 16:57:11 +03:00
if ($oTopic->getBlog()->getUrl()!=$sBlogUrl) {
func_header_location($oTopic->getUrl());
2008-09-21 09:36:57 +03:00
}
/**
* Обрабатываем добавление коммента
*/
$this->SubmitComment($oTopic);
/**
* Достаём комменты к топику
*/
$aReturn=$this->Comment_GetCommentsByTopicId($oTopic->getId());
$iMaxIdComment=$aReturn['iMaxIdComment'];
2009-06-05 16:57:11 +03:00
$aComments=$aReturn['comments'];
2008-09-21 09:36:57 +03:00
/**
* Отмечаем дату прочтения топика
*/
if ($this->oUserCurrent) {
$oTopicRead=new TopicEntity_TopicRead();
$oTopicRead->setTopicId($oTopic->getId());
$oTopicRead->setUserId($this->oUserCurrent->getId());
$oTopicRead->setCommentCountLast($oTopic->getCountComment());
$oTopicRead->setCommentIdLast($iMaxIdComment);
$oTopicRead->setDateRead(date("Y-m-d H:i:s"));
$this->Topic_SetTopicRead($oTopicRead);
}
/**
* Вызов хуков
*/
$this->Hook_Run('topic_show',array("oTopic"=>$oTopic));
/**
* Выставляем SEO данные
*/
$sTextSeo=preg_replace("/<.*>/Ui",' ',$oTopic->getText());
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo,20));
$this->Viewer_SetHtmlKeywords($oTopic->getTags());
2008-09-21 09:36:57 +03:00
/**
* Загружаем переменные в шаблон
2009-06-05 16:57:11 +03:00
*/
2008-09-21 09:36:57 +03:00
$this->Viewer_Assign('oTopic',$oTopic);
2009-06-05 16:57:11 +03:00
$this->Viewer_Assign('aComments',$aComments);
$this->Viewer_Assign('iMaxIdComment',$iMaxIdComment);
2009-06-05 16:57:11 +03:00
$this->Viewer_AddHtmlTitle($oTopic->getBlog()->getTitle());
2008-09-21 09:36:57 +03:00
$this->Viewer_AddHtmlTitle($oTopic->getTitle());
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/comments/'.$oTopic->getId().'/',$oTopic->getTitle());
2008-09-21 09:36:57 +03:00
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('topic');
}
2009-06-07 20:20:58 +03:00
protected function EventShowBlog() {
$sBlogUrl=$this->sCurrentEvent;
$sShowType=in_array($this->GetParamEventMatch(0,0),array('bad','new')) ? $this->GetParamEventMatch(0,0) : 'good';
2008-09-21 09:36:57 +03:00
/**
* Проверяем есть ли блог с таким УРЛ
*/
2008-09-21 09:36:57 +03:00
if (!($oBlog=$this->Blog_GetBlogByUrl($sBlogUrl))) {
return parent::EventNotFound();
2009-06-07 20:20:58 +03:00
}
/**
* Меню
*/
2009-06-07 20:20:58 +03:00
$this->sMenuSubItemSelect=$sShowType;
$this->sMenuSubBlogUrl=$oBlog->getUrlFull();
2008-09-21 09:36:57 +03:00
/**
* Передан ли номер страницы
*/
2009-06-07 20:20:58 +03:00
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
2008-09-21 09:36:57 +03:00
/**
* Получаем список топиков
2009-06-07 20:20:58 +03:00
*/
$aResult=$this->Topic_GetTopicsByBlog($oBlog,$iPage,BLOG_TOPIC_PER_PAGE,$sShowType);
2008-09-21 09:36:57 +03:00
$aTopics=$aResult['collection'];
/**
* Формируем постраничность
2009-06-07 20:20:58 +03:00
*/
$sUrlAdd=$sShowType=='good' ? '' : $sShowType;
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,$oBlog->getUrlFull().$sUrlAdd);
2008-09-21 09:36:57 +03:00
/**
* Получаем число новых топиков в текущем блоге
*/
$this->iCountTopicsBlogNew=$this->Topic_GetCountTopicsByBlogNew($oBlog);
/**
* Выставляем SEO данные
*/
$sTextSeo=preg_replace("/<.*>/Ui",' ',$oBlog->getDescription());
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo,20));
2009-01-11 23:57:50 +02:00
/**
* Получаем список юзеров блога
*/
2009-06-07 20:20:58 +03:00
$aBlogUsers=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),0);
$aBlogModerators=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),1);
$aBlogAdministrators=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),2);
/**
* Вызов хуков
*/
2009-06-07 20:20:58 +03:00
$this->Hook_Run('blog_collective_show',array('oBlog'=>$oBlog,'sShowType'=>$sShowType));
2008-09-21 09:36:57 +03:00
/**
* Загружаем переменные в шаблон
*/
2009-01-11 23:57:50 +02:00
$this->Viewer_Assign('aBlogUsers',$aBlogUsers);
$this->Viewer_Assign('aBlogModerators',$aBlogModerators);
$this->Viewer_Assign('aBlogAdministrators',$aBlogAdministrators);
$this->Viewer_Assign('iCountBlogUsers',count($aBlogUsers));
$this->Viewer_Assign('iCountBlogModerators',count($aBlogModerators));
2009-06-07 20:20:58 +03:00
$this->Viewer_Assign('iCountBlogAdministrators',count($aBlogAdministrators)+1);
2008-09-21 09:36:57 +03:00
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign('aTopics',$aTopics);
2009-06-07 20:20:58 +03:00
$this->Viewer_Assign('oBlog',$oBlog);
2008-09-21 09:36:57 +03:00
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/blog/'.$oBlog->getUrl().'/',$oBlog->getTitle());
2008-09-21 09:36:57 +03:00
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('blog');
}
2009-06-07 20:20:58 +03:00
2008-09-21 09:36:57 +03:00
/**
* Обработка добавление комментария к топику
*
* @param unknown_type $oTopic
* @return unknown
*/
protected function SubmitComment($oTopic) {
/**
* Если нажали кнопку "Отправить"
*/
if (isset($_REQUEST['submit_comment'])) {
$this->Security_ValidateSendForm();
2008-09-21 09:36:57 +03:00
/**
* Проверяем авторизованл ли пользователь
*/
if (!$this->oUserCurrent) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return Router::Action('error');
}
/**
* Проверяем разрешено ли постить комменты
*/
if (!$this->ACL_CanPostComment($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
$this->Message_AddError($this->Lang_Get('topic_comment_acl'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return false;
}
/**
* Проверяем разрешено ли постить комменты по времени
*/
if (!$this->ACL_CanPostCommentTime($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
$this->Message_AddError($this->Lang_Get('topic_comment_limit'),$this->Lang_Get('error'));
return false;
}
/**
* Проверяем запрет на добавления коммента автором топика
*/
if ($oTopic->getForbidComment()) {
$this->Message_AddError($this->Lang_Get('topic_comment_notallow'),$this->Lang_Get('error'));
return false;
}
2008-09-21 09:36:57 +03:00
/**
* Проверяем текст комментария
*/
$sText=$this->Text_Parser(getRequest('comment_text'));
if (!func_check($sText,'text',2,10000)) {
$this->Message_AddError($this->Lang_Get('topic_comment_add_text_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return false;
}
2008-09-21 09:36:57 +03:00
/**
* Проверям на какой коммент отвечаем
*/
$sParentId=getRequest('reply',0);
if (!func_check($sParentId,'id')) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return false;
}
$oCommentParent=null;
if ($sParentId!=0) {
/**
* Проверяем существует ли комментарий на который отвечаем
*/
if (!($oCommentParent=$this->Comment_GetCommentById($sParentId))) {
return false;
}
/**
* Проверяем из одного топика ли новый коммент и тот на который отвечаем
*/
if ($oCommentParent->getTopicId()!=$oTopic->getId()) {
return false;
}
} else {
/**
* Корневой комментарий
*/
$sParentId=null;
}
/**
* Проверка на дублирующий коммент
*/
if ($this->Comment_GetCommentUnique($oTopic->getId(),$this->oUserCurrent->getId(),$sParentId,md5($sText))) {
$this->Message_AddError($this->Lang_Get('topic_comment_spam'),$this->Lang_Get('error'));
return false;
}
//exit();
2008-09-21 09:36:57 +03:00
/**
* Создаём коммент
*/
$oCommentNew=new CommentEntity_TopicComment();
$oCommentNew->setTopicId($oTopic->getId());
$oCommentNew->setUserId($this->oUserCurrent->getId());
/**
* Парсим коммент на предмет ХТМЛ тегов
*/
$oCommentNew->setText($sText);
$oCommentNew->setDate(date("Y-m-d H:i:s"));
$oCommentNew->setUserIp(func_getIp());
$oCommentNew->setPid($sParentId);
$oCommentNew->setTextHash(md5($sText));
2008-09-21 09:36:57 +03:00
/**
* Добавляем коммент
*/
if ($this->Comment_AddComment($oCommentNew)) {
if ($oTopic->getPublish()) {
/**
* Добавляем коммент в прямой эфир если топик не в черновиках
*/
$oTopicCommentOnline=new CommentEntity_TopicCommentOnline();
$oTopicCommentOnline->setTopicId($oCommentNew->getTopicId());
$oTopicCommentOnline->setCommentId($oCommentNew->getId());
$this->Comment_AddTopicCommentOnline($oTopicCommentOnline);
}
/**
* Сохраняем дату последнего коммента для юзера
*/
$this->oUserCurrent->setDateCommentLast(date("Y-m-d H:i:s"));
$this->User_Update($this->oUserCurrent);
2008-09-21 09:36:57 +03:00
/**
* Отправка уведомления автору топика
*/
$oUserTopic=$this->User_GetUserById($oTopic->getUserId());
if ($oCommentNew->getUserId()!=$oUserTopic->getId()) {
$this->Notify_SendCommentNewToAuthorTopic($oUserTopic,$oTopic,$oCommentNew,$this->oUserCurrent);
2008-09-21 09:36:57 +03:00
}
/**
* Отправляем уведомление тому на чей коммент ответили
2008-09-21 09:36:57 +03:00
*/
if ($oCommentParent and $oCommentParent->getUserId()!=$oTopic->getUserId() and $oCommentNew->getUserId()!=$oCommentParent->getUserId()) {
$oUserAuthorComment=$this->User_GetUserById($oCommentParent->getUserId());
$this->Notify_SendCommentReplyToAuthorParentComment($oUserAuthorComment,$oTopic,$oCommentNew,$this->oUserCurrent);
2008-09-21 09:36:57 +03:00
}
func_header_location($oTopic->getUrl().'#comment'.$oCommentNew->getId());
2008-09-21 09:36:57 +03:00
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
2008-09-21 09:36:57 +03:00
return false;
}
}
}
2008-09-21 09:36:57 +03:00
/**
* Выполняется при завершении работы экшена
*
*/
public function EventShutdown() {
/**
* Загружаем в шаблон необходимые переменные
*/
$this->Viewer_Assign('sMenuHeadItemSelect',$this->sMenuHeadItemSelect);
2008-09-21 09:36:57 +03:00
$this->Viewer_Assign('sMenuItemSelect',$this->sMenuItemSelect);
$this->Viewer_Assign('sMenuSubItemSelect',$this->sMenuSubItemSelect);
$this->Viewer_Assign('sMenuSubBlogUrl',$this->sMenuSubBlogUrl);
$this->Viewer_Assign('iCountTopicsCollectiveNew',$this->iCountTopicsCollectiveNew);
$this->Viewer_Assign('iCountTopicsPersonalNew',$this->iCountTopicsPersonalNew);
$this->Viewer_Assign('iCountTopicsBlogNew',$this->iCountTopicsBlogNew);
$this->Viewer_Assign('iCountTopicsNew',$this->iCountTopicsNew);
}
}
?>