1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-05 07:54:24 +03:00
ifhub.club/classes/actions/ActionBlog.class.php
Mzhelskiy Maxim d6ef266711
2009-06-07 19:32:58 +00:00

865 lines
31 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* 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';
/**
* Какое меню активно
*
* @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');
/**
* Инизиализация экшена
*
*/
public function Init() {
/**
* Устанавливаем евент по дефолту, т.е. будем показывать хорошие топики из коллективных блогов
*/
$this->SetDefaultEvent('good');
$this->sMenuSubBlogUrl=DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/';
/**
* Достаём текущего пользователя
*/
$this->oUserCurrent=$this->User_GetUserCurrent();
/**
* Определяем какие блоки нужно выводить справа
*/
$this->Viewer_AddBlocks('right',array('stream','tags','blogs'));
/**
* Подсчитываем новые топики
*/
$this->iCountTopicsCollectiveNew=$this->Topic_GetCountTopicsCollectiveNew();
$this->iCountTopicsPersonalNew=$this->Topic_GetCountTopicsPersonalNew();
$this->iCountTopicsBlogNew=$this->iCountTopicsCollectiveNew;
$this->iCountTopicsNew=$this->iCountTopicsCollectiveNew+$this->iCountTopicsPersonalNew;
}
/**
* Регистрируем евенты, по сути определяем УРЛы вида /blog/.../
*
*/
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');
$this->AddEvent('add','EventAddBlog');
$this->AddEvent('edit','EventEditBlog');
$this->AddEvent('admin','EventAdminBlog');
$this->AddEventPreg('/^(\d+)\.html$/i','/^$/i','EventShowTopic');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i','EventShowTopic');
$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');
}
/**********************************************************************************
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
**********************************************************************************
*/
/**
* Добавление нового блога
*
* @return unknown
*/
protected function EventAddBlog() {
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_create'));
/**
* Меню
*/
$this->sMenuSubItemSelect='add';
$this->sMenuItemSelect='add_blog';
/**
* Проверяем авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
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'));
return Router::Action('error');
}
/**
* Запускаем проверку корректности ввода полей при добалении блога
*/
if (!$this->checkBlogFields()) {
return false;
}
$this->Security_ValidateSendForm();
/**
* Если всё ок то пытаемся создать блог
*/
$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;
}
}
/**
* Создаём блог
*/
if ($this->Blog_AddBlog($oBlog)) {
/**
* Получаем блог, это для получение полного пути блога, если он в будущем будет зависит от других сущностей(компании, юзер и т.п.)
*/
$oBlog->Blog_GetBlogById($oBlog->getId());
func_header_location($oBlog->getUrlFull());
} else {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
}
/**
* Редактирование блога
*
* @return unknown
*/
protected function EventEditBlog() {
/**
* Меню
*/
$this->sMenuSubItemSelect='';
$this->sMenuItemSelect='profile';
/**
* Проверяем передан ли в УРЛе номер блога
*/
$sBlogId=$this->GetParam(0);
if (!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
return parent::EventNotFound();
}
/**
* Проверяем тип блога
*/
if ($oBlog->getType()=='personal') {
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();
}
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_edit'));
$this->Viewer_Assign('oBlogEdit',$oBlog);
/**
* Устанавливаем шалон для вывода
*/
$this->SetTemplateAction('add');
/**
* Если нажали кнопку "Сохранить"
*/
if (isset($_REQUEST['submit_blog_add'])) {
$this->Security_ValidateSendForm();
/**
* Запускаем проверку корректности ввода полей при редактировании блога
*/
if (!$this->checkBlogFields($oBlog)) {
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);
}
/**
* Обновляем блог
*/
if ($this->Blog_UpdateBlog($oBlog)) {
func_header_location($oBlog->getUrlFull());
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
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');
}
/**
* Проверка полей блога
*
* @return unknown
*/
protected function checkBlogFields($oBlog=null) {
/**
* Проверяем только если была отправлена форма с данными
*/
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'));
$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;
}
}
/**
* Проверяем на счет плохих УРЛов
*/
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'));
$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;
}
}
/**
* Проверяем есть ли описание блога
*/
if (!func_check(getRequest('blog_description'),'text',10,3000)) {
$this->Message_AddError($this->Lang_Get('blog_create_description_error'),$this->Lang_Get('error'));
$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'));
$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'));
$bOk=false;
}
return $bOk;
}
/**
* Показ всех топиков
*
*/
protected function EventTopics() {
$sShowType=$this->sCurrentEvent;
/**
* Меню
*/
$this->sMenuSubItemSelect=$sShowType;
/**
* Передан ли номер страницы
*/
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
/**
* Получаем список топиков
*/
$aResult=$this->Topic_GetTopicsCollective($iPage,BLOG_TOPIC_PER_PAGE,$sShowType);
$aTopics=$aResult['collection'];
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/'.ROUTE_PAGE_BLOG.'/'.$sShowType);
/**
* Вызов хуков
*/
$this->Hook_Run('blog_show',array('sShowType'=>$sShowType));
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aTopics',$aTopics);
$this->Viewer_Assign('aPaging',$aPaging);
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('index');
}
/**
* Показ топика
*
* @param unknown_type $sBlogUrl
* @param unknown_type $iTopicId
* @return unknown
*/
protected function EventShowTopic() {
$sBlogUrl='';
if ($this->GetParamEventMatch(0,1)) {
// из коллективного блога
$sBlogUrl=$this->sCurrentEvent;
$iTopicId=$this->GetParamEventMatch(0,1);
$this->sMenuItemSelect='blog';
} else {
// из персонального блога
$iTopicId=$this->GetEventMatch(1);
$this->sMenuItemSelect='log';
}
$this->sMenuSubItemSelect='';
/**
* Проверяем есть ли такой топик
*/
if (!($oTopic=$this->Topic_GetTopicById($iTopicId))) {
return parent::EventNotFound();
}
/**
* Проверяем права на просмотр топика
*/
if (!$oTopic->getPublish() and (!$this->oUserCurrent or ($this->oUserCurrent->getId()!=$oTopic->getUserId() and !$this->oUserCurrent->isAdministrator()))) {
return parent::EventNotFound();
}
/**
* Если запросили топик из персонального блога то перенаправляем на страницу вывода коллективного топика
*/
if ($sBlogUrl!='' and $oTopic->getBlog()->getType()=='personal') {
func_header_location($oTopic->getUrl());
}
/**
* Если запросили не персональный топик то перенаправляем на страницу для вывода коллективного топика
*/
if ($sBlogUrl=='' and $oTopic->getBlog()->getType()!='personal') {
func_header_location($oTopic->getUrl());
}
/**
* Если номер топика правильный но УРЛ блога косяный то корректируем его и перенаправляем на нужный адрес
*/
if ($sBlogUrl!='' and $oTopic->getBlog()->getUrl()!=$sBlogUrl) {
func_header_location($oTopic->getUrl());
}
/**
* Обрабатываем добавление коммента
*/
$this->SubmitComment($oTopic);
/**
* Достаём комменты к топику
*/
$aReturn=$this->Comment_GetCommentsByTopicId($oTopic->getId());
$iMaxIdComment=$aReturn['iMaxIdComment'];
$aComments=$aReturn['comments'];
/**
* Отмечаем дату прочтения топика
*/
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());
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('oTopic',$oTopic);
$this->Viewer_Assign('aComments',$aComments);
$this->Viewer_Assign('iMaxIdComment',$iMaxIdComment);
$this->Viewer_AddHtmlTitle($oTopic->getBlog()->getTitle());
$this->Viewer_AddHtmlTitle($oTopic->getTitle());
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/comments/'.$oTopic->getId().'/',$oTopic->getTitle());
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('topic');
}
protected function EventShowBlog() {
$sBlogUrl=$this->sCurrentEvent;
$sShowType=in_array($this->GetParamEventMatch(0,0),array('bad','new')) ? $this->GetParamEventMatch(0,0) : 'good';
/**
* Проверяем есть ли блог с таким УРЛ
*/
if (!($oBlog=$this->Blog_GetBlogByUrl($sBlogUrl))) {
return parent::EventNotFound();
}
/**
* Меню
*/
$this->sMenuSubItemSelect=$sShowType;
$this->sMenuSubBlogUrl=$oBlog->getUrlFull();
/**
* Передан ли номер страницы
*/
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
/**
* Получаем список топиков
*/
$aResult=$this->Topic_GetTopicsByBlog($oBlog,$iPage,BLOG_TOPIC_PER_PAGE,$sShowType);
$aTopics=$aResult['collection'];
/**
* Формируем постраничность
*/
$sUrlAdd=$sShowType=='good' ? '' : $sShowType;
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,$oBlog->getUrlFull().$sUrlAdd);
/**
* Получаем число новых топиков в текущем блоге
*/
$this->iCountTopicsBlogNew=$this->Topic_GetCountTopicsByBlogNew($oBlog);
/**
* Выставляем SEO данные
*/
$sTextSeo=preg_replace("/<.*>/Ui",' ',$oBlog->getDescription());
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo,20));
/**
* Получаем список юзеров блога
*/
$aBlogUsers=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),0);
$aBlogModerators=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),1);
$aBlogAdministrators=$this->Blog_GetBlogUsersByBlogId($oBlog->getId(),2);
/**
* Вызов хуков
*/
$this->Hook_Run('blog_collective_show',array('oBlog'=>$oBlog,'sShowType'=>$sShowType));
/**
* Загружаем переменные в шаблон
*/
$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));
$this->Viewer_Assign('iCountBlogAdministrators',count($aBlogAdministrators)+1);
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign('aTopics',$aTopics);
$this->Viewer_Assign('oBlog',$oBlog);
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_SetHtmlRssAlternate(DIR_WEB_ROOT.'/'.ROUTE_PAGE_RSS.'/blog/'.$oBlog->getUrl().'/',$oBlog->getTitle());
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('blog');
}
/**
* Обработка добавление комментария к топику
*
* @param unknown_type $oTopic
* @return unknown
*/
protected function SubmitComment($oTopic) {
/**
* Если нажали кнопку "Отправить"
*/
if (isset($_REQUEST['submit_comment'])) {
$this->Security_ValidateSendForm();
/**
* Проверяем авторизованл ли пользователь
*/
if (!$this->oUserCurrent) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'),$this->Lang_Get('error'));
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'));
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;
}
/**
* Проверяем текст комментария
*/
$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'));
return false;
}
/**
* Проверям на какой коммент отвечаем
*/
$sParentId=getRequest('reply',0);
if (!func_check($sParentId,'id')) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
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();
/**
* Создаём коммент
*/
$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));
/**
* Добавляем коммент
*/
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);
/**
* Отправка уведомления автору топика
*/
$oUserTopic=$this->User_GetUserById($oTopic->getUserId());
if ($oCommentNew->getUserId()!=$oUserTopic->getId()) {
$this->Notify_SendCommentNewToAuthorTopic($oUserTopic,$oTopic,$oCommentNew,$this->oUserCurrent);
}
/**
* Отправляем уведомление тому на чей коммент ответили
*/
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);
}
func_header_location($oTopic->getUrl().'#comment'.$oCommentNew->getId());
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return false;
}
}
}
/**
* Выполняется при завершении работы экшена
*
*/
public function EventShutdown() {
/**
* Загружаем в шаблон необходимые переменные
*/
$this->Viewer_Assign('sMenuHeadItemSelect',$this->sMenuHeadItemSelect);
$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);
}
}
?>