mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-08 01:14:24 +03:00
2052 lines
86 KiB
PHP
2052 lines
86 KiB
PHP
<?php
|
||
/*
|
||
* LiveStreet CMS
|
||
* Copyright © 2013 OOO "ЛС-СОФТ"
|
||
*
|
||
* ------------------------------------------------------
|
||
*
|
||
* Official site: www.livestreetcms.com
|
||
* Contact e-mail: office@livestreetcms.com
|
||
*
|
||
* GNU General Public License, version 2:
|
||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||
*
|
||
* ------------------------------------------------------
|
||
*
|
||
* @link http://www.livestreetcms.com
|
||
* @copyright 2013 OOO "ЛС-СОФТ"
|
||
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
|
||
*
|
||
*/
|
||
|
||
/**
|
||
* Экшен обработки URL'ов вида /blog/
|
||
*
|
||
* @package application.actions
|
||
* @since 1.0
|
||
*/
|
||
class ActionBlog extends Action
|
||
{
|
||
/**
|
||
* Главное меню
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sMenuHeadItemSelect = 'blog';
|
||
/**
|
||
* Какое меню активно
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sMenuItemSelect = 'blog';
|
||
/**
|
||
* Какое подменю активно
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sMenuSubItemSelect = 'good';
|
||
/**
|
||
* УРЛ блога который подставляется в меню
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sMenuSubBlogUrl;
|
||
/**
|
||
* Текущий пользователь
|
||
*
|
||
* @var ModuleUser_EntityUser|null
|
||
*/
|
||
protected $oUserCurrent = null;
|
||
/**
|
||
* Число новых топиков в коллективных блогах
|
||
*
|
||
* @var int
|
||
*/
|
||
protected $iCountTopicsCollectiveNew = 0;
|
||
/**
|
||
* Число новых топиков в персональных блогах
|
||
*
|
||
* @var int
|
||
*/
|
||
protected $iCountTopicsPersonalNew = 0;
|
||
/**
|
||
* Число новых топиков в конкретном блоге
|
||
*
|
||
* @var int
|
||
*/
|
||
protected $iCountTopicsBlogNew = 0;
|
||
/**
|
||
* Общее число новых топиков
|
||
*
|
||
* @var int
|
||
*/
|
||
protected $iCountTopicsNew = 0;
|
||
/**
|
||
* Число новых топиков в выбранном разделе
|
||
*
|
||
* @var int
|
||
*/
|
||
protected $iCountTopicsSubNew = 0;
|
||
/**
|
||
* URL-префикс для навигации по топикам
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sNavTopicsSubUrl = '';
|
||
/**
|
||
* Список URL с котрыми запрещено создавать блог
|
||
*
|
||
* @var array
|
||
*/
|
||
protected $aBadBlogUrl = array(
|
||
'new',
|
||
'good',
|
||
'bad',
|
||
'discussed',
|
||
'top',
|
||
'edit',
|
||
'add',
|
||
'admin',
|
||
'delete',
|
||
'invite',
|
||
'ajaxaddcomment',
|
||
'ajaxaddbloginvite',
|
||
'ajaxresponsecomment',
|
||
'ajaxrebloginvite',
|
||
'ajaxbloginfo',
|
||
'ajaxblogjoin'
|
||
);
|
||
|
||
/**
|
||
* Инизиализация экшена
|
||
*
|
||
*/
|
||
public function Init()
|
||
{
|
||
/**
|
||
* Устанавливаем евент по дефолту, т.е. будем показывать хорошие топики из коллективных блогов
|
||
*/
|
||
$this->SetDefaultEvent('good');
|
||
$this->sMenuSubBlogUrl = Router::GetPath('blog');
|
||
/**
|
||
* Достаём текущего пользователя
|
||
*/
|
||
$this->oUserCurrent = $this->User_GetUserCurrent();
|
||
/**
|
||
* Подсчитываем новые топики
|
||
*/
|
||
$this->iCountTopicsCollectiveNew = $this->Topic_GetCountTopicsCollectiveNew();
|
||
$this->iCountTopicsPersonalNew = $this->Topic_GetCountTopicsPersonalNew();
|
||
$this->iCountTopicsBlogNew = $this->iCountTopicsCollectiveNew;
|
||
$this->iCountTopicsNew = $this->iCountTopicsCollectiveNew + $this->iCountTopicsPersonalNew;
|
||
$this->iCountTopicsSubNew = $this->iCountTopicsCollectiveNew;
|
||
$this->sNavTopicsSubUrl = Router::GetPath('blog');
|
||
/**
|
||
* Загружаем в шаблон JS текстовки
|
||
*/
|
||
$this->Lang_AddLangJs(array(
|
||
'blog.join.join',
|
||
'blog.join.leave'
|
||
));
|
||
}
|
||
|
||
/**
|
||
* Регистрируем евенты, по сути определяем УРЛы вида /blog/.../
|
||
*
|
||
*/
|
||
protected function RegisterEvent()
|
||
{
|
||
$this->AddEventPreg('/^good$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
$this->AddEvent('good', array('EventTopics', 'topics'));
|
||
$this->AddEventPreg('/^bad$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
$this->AddEventPreg('/^new$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
$this->AddEventPreg('/^newall$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
$this->AddEventPreg('/^discussed$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
$this->AddEventPreg('/^top$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventTopics', 'topics'));
|
||
|
||
$this->AddEvent('add', 'EventAddBlog');
|
||
$this->AddEvent('edit', 'EventEditBlog');
|
||
$this->AddEvent('delete', 'EventDeleteBlog');
|
||
$this->AddEventPreg('/^admin$/i', '/^\d+$/i', '/^(page([1-9]\d{0,5}))?$/i', 'EventAdminBlog');
|
||
$this->AddEvent('invite', 'EventInviteBlog');
|
||
|
||
$this->AddEvent('ajaxaddcomment', 'AjaxAddComment');
|
||
$this->AddEvent('ajaxresponsecomment', 'AjaxResponseComment');
|
||
$this->AddEvent('ajaxaddbloginvite', 'AjaxAddBlogInvite');
|
||
$this->AddEvent('ajaxrebloginvite', 'AjaxReBlogInvite');
|
||
$this->AddEvent('ajaxremovebloginvite', 'AjaxRemoveBlogInvite');
|
||
$this->AddEvent('ajaxbloginfo', 'AjaxBlogInfo');
|
||
$this->AddEvent('ajaxblogjoin', 'AjaxBlogJoin');
|
||
|
||
$this->AddEventPreg('/^(\d+)\.html$/i', '/^$/i', array('EventShowTopic', 'topic'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^(\d+)\.html$/i', array('EventShowTopic', 'topic'));
|
||
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventShowBlog', 'blog'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^bad$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventShowBlog', 'blog'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^new$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventShowBlog', 'blog'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^newall$/i', '/^(page([1-9]\d{0,5}))?$/i',
|
||
array('EventShowBlog', 'blog'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^discussed$/i', '/^(page([1-9]\d{0,5}))?$/i',
|
||
array('EventShowBlog', 'blog'));
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^top$/i', '/^(page([1-9]\d{0,5}))?$/i', array('EventShowBlog', 'blog'));
|
||
|
||
$this->AddEventPreg('/^[\w\-\_]+$/i', '/^users$/i', '/^(page([1-9]\d{0,5}))?$/i', 'EventShowUsers');
|
||
}
|
||
|
||
|
||
/**********************************************************************************
|
||
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
|
||
**********************************************************************************
|
||
*/
|
||
|
||
/**
|
||
* Добавление нового блога
|
||
*
|
||
*/
|
||
protected function EventAddBlog()
|
||
{
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog.add.title'));
|
||
/**
|
||
* Меню
|
||
*/
|
||
$this->sMenuSubItemSelect = 'add';
|
||
$this->sMenuItemSelect = '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)) {
|
||
$this->Message_AddErrorSingle($this->Rbac_GetMsgLast());
|
||
return Router::Action('error');
|
||
}
|
||
$this->Hook_Run('blog_add_show');
|
||
/**
|
||
* Прогружаем категории блогов
|
||
*/
|
||
$aCategories = $this->Blog_GetCategoriesTree();
|
||
$this->Viewer_Assign('aBlogCategories', $aCategories);
|
||
/**
|
||
* Создаем объект блога
|
||
*/
|
||
$oBlog = Engine::GetEntity('Blog');
|
||
/**
|
||
* Запускаем проверку корректности ввода полей при добалении блога.
|
||
* Дополнительно проверяем, что был отправлен POST запрос.
|
||
*/
|
||
if (!$this->checkBlogFields($oBlog)) {
|
||
return false;
|
||
}
|
||
/**
|
||
* Если всё ок то пытаемся создать блог
|
||
*/
|
||
$oBlog->setOwnerId($this->oUserCurrent->getId());
|
||
$oBlog->setTitle(strip_tags(getRequestStr('blog_title')));
|
||
/**
|
||
* Парсим текст на предмет разных ХТМЛ тегов
|
||
*/
|
||
$sText = $this->Text_Parser(getRequestStr('blog_description'));
|
||
$oBlog->setDescription($sText);
|
||
$oBlog->setType(getRequestStr('blog_type'));
|
||
$oBlog->setDateAdd(date("Y-m-d H:i:s"));
|
||
$oBlog->setLimitRatingTopic(getRequestStr('blog_limit_rating_topic'));
|
||
$oBlog->setUrl(getRequestStr('blog_url'));
|
||
$oBlog->setAvatar(null);
|
||
/**
|
||
* Загрузка аватара, делаем ресайзы
|
||
*/
|
||
if (isset($_FILES['avatar']) and is_uploaded_file($_FILES['avatar']['tmp_name'])) {
|
||
if (true !== $sResult = $this->Blog_UploadBlogAvatar($_FILES['avatar'], $oBlog)) {
|
||
$this->Message_AddError(is_bool($sResult) ? $this->Lang_Get('blog.add.fields.avatar.error') : $sResult,
|
||
$this->Lang_Get('error'));
|
||
return false;
|
||
}
|
||
}
|
||
/**
|
||
* Создаём блог
|
||
*/
|
||
$this->Hook_Run('blog_add_before', array('oBlog' => $oBlog));
|
||
if ($this->Blog_AddBlog($oBlog)) {
|
||
$this->Hook_Run('blog_add_after', array('oBlog' => $oBlog));
|
||
/**
|
||
* Сохраняем категории
|
||
*/
|
||
if (Config::Get('module.blog.category_allow') and ($this->oUserCurrent->isAdministrator() or !Config::Get('module.blog.category_only_admin'))) {
|
||
$oBlog->category->CallbackAfterSave();
|
||
}
|
||
/**
|
||
* Получаем блог, это для получение полного пути блога, если он в будущем будет зависит от других сущностей(компании, юзер и т.п.)
|
||
*/
|
||
$oBlog = $this->Blog_GetBlogById($oBlog->getId());
|
||
/**
|
||
* Фиксируем ID у media файлов
|
||
*/
|
||
$this->Media_ReplaceTargetTmpById('blog', $oBlog->getId());
|
||
/**
|
||
* Добавляем событие в ленту
|
||
*/
|
||
$this->Stream_write($oBlog->getOwnerId(), 'add_blog', $oBlog->getId());
|
||
Router::Location($oBlog->getUrlFull());
|
||
} else {
|
||
$this->Message_AddError($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Редактирование блога
|
||
*
|
||
*/
|
||
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');
|
||
}
|
||
/**
|
||
* Проверка на право редактировать блог
|
||
*/
|
||
if (!$this->ACL_IsAllowEditBlog($oBlog, $this->oUserCurrent)) {
|
||
return parent::EventNotFound();
|
||
}
|
||
|
||
$this->Hook_Run('blog_edit_show', array('oBlog' => $oBlog));
|
||
/**
|
||
* Прогружаем категории блогов
|
||
*/
|
||
$aCategories = $this->Blog_GetCategoriesTree();
|
||
$this->Viewer_Assign('aBlogCategories', $aCategories);
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
|
||
$this->Viewer_AddHtmlTitle($this->Lang_Get('common.edit'));
|
||
|
||
$this->Viewer_Assign('oBlogEdit', $oBlog);
|
||
/**
|
||
* Устанавливаем шалон для вывода
|
||
*/
|
||
$this->SetTemplateAction('add');
|
||
/**
|
||
* Если нажали кнопку "Сохранить"
|
||
*/
|
||
if (isPost('submit_blog_add')) {
|
||
/**
|
||
* Запускаем проверку корректности ввода полей при редактировании блога
|
||
*/
|
||
if (!$this->checkBlogFields($oBlog)) {
|
||
return false;
|
||
}
|
||
$oBlog->setTitle(strip_tags(getRequestStr('blog_title')));
|
||
/**
|
||
* Парсим описание блога на предмет ХТМЛ тегов
|
||
*/
|
||
$sText = $this->Text_Parser(getRequestStr('blog_description'));
|
||
$oBlog->setDescription($sText);
|
||
/**
|
||
* Сбрасываем кеш, если поменяли тип блога
|
||
* Нужна доработка, т.к. в этом блоге могут быть топики других юзеров
|
||
*/
|
||
if ($oBlog->getType() != getRequestStr('blog_type')) {
|
||
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,
|
||
array("topic_update_user_{$oBlog->getOwnerId()}"));
|
||
}
|
||
$oBlog->setType(getRequestStr('blog_type'));
|
||
$oBlog->setLimitRatingTopic(getRequestStr('blog_limit_rating_topic'));
|
||
if ($this->oUserCurrent->isAdministrator()) {
|
||
$oBlog->setUrl(getRequestStr('blog_url')); // разрешаем смену URL блога только админу
|
||
}
|
||
/**
|
||
* Загрузка аватара, делаем ресайзы
|
||
*/
|
||
if (isset($_FILES['avatar']) and is_uploaded_file($_FILES['avatar']['tmp_name'])) {
|
||
if (true !== $sResult = $this->Blog_UploadBlogAvatar($_FILES['avatar'], $oBlog)) {
|
||
$this->Message_AddError(is_bool($sResult) ? $this->Lang_Get('blog.add.fields.avatar.error') : $sResult,
|
||
$this->Lang_Get('error'));
|
||
return false;
|
||
}
|
||
}
|
||
/**
|
||
* Удалить аватар
|
||
*/
|
||
if (isset($_REQUEST['avatar_delete'])) {
|
||
$this->Blog_DeleteBlogAvatar($oBlog);
|
||
$oBlog->setAvatar(null);
|
||
}
|
||
/**
|
||
* Обновляем блог
|
||
*/
|
||
$this->Hook_Run('blog_edit_before', array('oBlog' => $oBlog));
|
||
if ($this->Blog_UpdateBlog($oBlog)) {
|
||
$this->Hook_Run('blog_edit_after', array('oBlog' => $oBlog));
|
||
/**
|
||
* Сохраняем категории
|
||
*/
|
||
if (Config::Get('module.blog.category_allow') and ($this->oUserCurrent->isAdministrator() or !Config::Get('module.blog.category_only_admin'))) {
|
||
$oBlog->category->CallbackAfterSave();
|
||
}
|
||
|
||
Router::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();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Управление пользователями блога
|
||
*
|
||
*/
|
||
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');
|
||
}
|
||
/**
|
||
* Проверка на право управлением пользователями блога
|
||
*/
|
||
if (!$this->ACL_IsAllowAdminBlog($oBlog, $this->oUserCurrent)) {
|
||
return parent::EventNotFound();
|
||
}
|
||
/**
|
||
* Обрабатываем сохранение формы
|
||
*/
|
||
if (isPost('submit_blog_admin')) {
|
||
$this->Security_ValidateSendForm();
|
||
|
||
$aUserRank = getRequest('user_rank', array());
|
||
if (!is_array($aUserRank)) {
|
||
$aUserRank = array();
|
||
}
|
||
foreach ($aUserRank as $sUserId => $sRank) {
|
||
$sRank = (string)$sRank;
|
||
if (!($oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $sUserId))) {
|
||
$this->Message_AddError($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
break;
|
||
}
|
||
/**
|
||
* Увеличиваем число читателей блога
|
||
*/
|
||
if (in_array($sRank, array(
|
||
'administrator',
|
||
'moderator',
|
||
'reader'
|
||
)) and $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN
|
||
) {
|
||
$oBlog->setCountUser($oBlog->getCountUser() + 1);
|
||
}
|
||
|
||
switch ($sRank) {
|
||
case 'administrator':
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR);
|
||
break;
|
||
case 'moderator':
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_MODERATOR);
|
||
break;
|
||
case 'reader':
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER);
|
||
break;
|
||
case 'ban':
|
||
if ($oBlogUser->getUserRole() != ModuleBlog::BLOG_USER_ROLE_BAN) {
|
||
$oBlog->setCountUser($oBlog->getCountUser() - 1);
|
||
}
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_BAN);
|
||
break;
|
||
default:
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_GUEST);
|
||
}
|
||
$this->Blog_UpdateRelationBlogUser($oBlogUser);
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.admin.alerts.submit_success'));
|
||
}
|
||
$this->Blog_UpdateBlog($oBlog);
|
||
}
|
||
/**
|
||
* Текущая страница
|
||
*/
|
||
$iPage = $this->GetParamEventMatch(1, 2) ? $this->GetParamEventMatch(1, 2) : 1;
|
||
/**
|
||
* Получаем список подписчиков блога
|
||
*/
|
||
$aResult = $this->Blog_GetBlogUsersByBlogId(
|
||
$oBlog->getId(),
|
||
array(
|
||
ModuleBlog::BLOG_USER_ROLE_BAN,
|
||
ModuleBlog::BLOG_USER_ROLE_USER,
|
||
ModuleBlog::BLOG_USER_ROLE_MODERATOR,
|
||
ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR
|
||
), $iPage, Config::Get('module.blog.users_per_page')
|
||
);
|
||
$aBlogUsers = $aResult['collection'];
|
||
/**
|
||
* Формируем постраничность
|
||
*/
|
||
$aPaging = $this->Viewer_MakePaging($aResult['count'], $iPage, Config::Get('module.blog.users_per_page'),
|
||
Config::Get('pagination.pages.count'), Router::GetPath('blog') . "admin/{$oBlog->getId()}");
|
||
$this->Viewer_Assign('aPaging', $aPaging);
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
|
||
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog.admin.title'));
|
||
|
||
$this->Viewer_Assign('oBlogEdit', $oBlog);
|
||
$this->Viewer_Assign('aBlogUsers', $aBlogUsers);
|
||
/**
|
||
* Устанавливаем шалон для вывода
|
||
*/
|
||
$this->SetTemplateAction('admin');
|
||
/**
|
||
* Если блог закрытый, получаем приглашенных
|
||
* и добавляем блок-форму для приглашения
|
||
*/
|
||
if ($oBlog->getType() == 'close') {
|
||
$aBlogUsersInvited = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(), ModuleBlog::BLOG_USER_ROLE_INVITE,
|
||
null);
|
||
$this->Viewer_Assign('aBlogUsersInvited', $aBlogUsersInvited['collection']);
|
||
$this->Viewer_AddBlock('right', 'blocks/block.blogInvite.tpl');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверка полей блога
|
||
*
|
||
* @param ModuleBlog_EntityBlog|null $oBlog
|
||
* @return bool
|
||
*/
|
||
protected function checkBlogFields($oBlog = null)
|
||
{
|
||
/**
|
||
* Проверяем только если была отправлена форма с данными (методом POST)
|
||
*/
|
||
if (!isPost('submit_blog_add')) {
|
||
$_REQUEST['blog_limit_rating_topic'] = 0;
|
||
return false;
|
||
}
|
||
$this->Security_ValidateSendForm();
|
||
|
||
$bOk = true;
|
||
/**
|
||
* Проверяем есть ли название блога
|
||
*/
|
||
if (!func_check(getRequestStr('blog_title'), 'text', 2, 200)) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.title.error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
} else {
|
||
/**
|
||
* Проверяем есть ли уже блог с таким названием
|
||
*/
|
||
if ($oBlogExists = $this->Blog_GetBlogByTitle(getRequestStr('blog_title'))) {
|
||
if (!$oBlog or $oBlog->getId() != $oBlogExists->getId()) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.title.error_unique'),
|
||
$this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверяем есть ли URL блога, с заменой всех пробельных символов на "_"
|
||
*/
|
||
if (!$oBlog or !$oBlog->getId() or $this->oUserCurrent->isAdministrator()) {
|
||
$blogUrl = preg_replace("/\s+/", '_', getRequestStr('blog_url'));
|
||
$_REQUEST['blog_url'] = $blogUrl;
|
||
if (!func_check(getRequestStr('blog_url'), 'login', 2, 50)) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
}
|
||
/**
|
||
* Проверяем на счет плохих УРЛов
|
||
*/
|
||
if (in_array(getRequestStr('blog_url'), $this->aBadBlogUrl)) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error_badword') . ' ' . join(',',
|
||
$this->aBadBlogUrl), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем есть ли уже блог с таким URL
|
||
*/
|
||
if ($oBlogExists = $this->Blog_GetBlogByUrl(getRequestStr('blog_url'))) {
|
||
if (!$oBlog or $oBlog->getId() != $oBlogExists->getId()) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error_unique'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
}
|
||
/**
|
||
* Проверяем есть ли описание блога
|
||
*/
|
||
if (!func_check(getRequestStr('blog_description'), 'text', 10, 3000)) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.description.error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем доступные типы блога для создания
|
||
*/
|
||
if (!$this->Blog_IsAllowBlogType(getRequestStr('blog_type'))) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.type.error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Преобразуем ограничение по рейтингу в число
|
||
*/
|
||
if (!func_check(getRequestStr('blog_limit_rating_topic'), 'float')) {
|
||
$this->Message_AddError($this->Lang_Get('blog.add.fields.rating.error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем категорию блога
|
||
*/
|
||
if (Config::Get('module.blog.category_allow')) {
|
||
if (true !== ($mRes = $oBlog->category->ValidateCategoriesCheck(getRequest('category')))) {
|
||
$this->Message_AddError($mRes, $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Выполнение хуков
|
||
*/
|
||
$this->Hook_Run('check_blog_fields', array('bOk' => &$bOk));
|
||
return $bOk;
|
||
}
|
||
|
||
/**
|
||
* Показ всех топиков
|
||
*
|
||
*/
|
||
protected function EventTopics()
|
||
{
|
||
$sPeriod = 1; // по дефолту 1 день
|
||
if (in_array(getRequestStr('period'), array(1, 7, 30, 'all'))) {
|
||
$sPeriod = getRequestStr('period');
|
||
}
|
||
$sShowType = $this->sCurrentEvent;
|
||
if (!in_array($sShowType, array('discussed', 'top'))) {
|
||
$sPeriod = 'all';
|
||
}
|
||
/**
|
||
* Меню
|
||
*/
|
||
$this->sMenuSubItemSelect = $sShowType == 'newall' ? 'new' : $sShowType;
|
||
/**
|
||
* Передан ли номер страницы
|
||
*/
|
||
$iPage = $this->GetParamEventMatch(0, 2) ? $this->GetParamEventMatch(0, 2) : 1;
|
||
if ($iPage == 1 and !getRequest('period')) {
|
||
$this->Viewer_SetHtmlCanonical(Router::GetPath('blog') . $sShowType . '/');
|
||
}
|
||
/**
|
||
* Получаем список топиков
|
||
*/
|
||
$aResult = $this->Topic_GetTopicsCollective($iPage, Config::Get('module.topic.per_page'), $sShowType,
|
||
$sPeriod == 'all' ? null : $sPeriod * 60 * 60 * 24);
|
||
/**
|
||
* Если нет топиков за 1 день, то показываем за неделю (7)
|
||
*/
|
||
if (in_array($sShowType,
|
||
array('discussed', 'top')) and !$aResult['count'] and $iPage == 1 and !getRequest('period')
|
||
) {
|
||
$sPeriod = 7;
|
||
$aResult = $this->Topic_GetTopicsCollective($iPage, Config::Get('module.topic.per_page'), $sShowType,
|
||
$sPeriod == 'all' ? null : $sPeriod * 60 * 60 * 24);
|
||
}
|
||
$aTopics = $aResult['collection'];
|
||
/**
|
||
* Вызов хуков
|
||
*/
|
||
$this->Hook_Run('topics_list_show', array('aTopics' => $aTopics));
|
||
/**
|
||
* Формируем постраничность
|
||
*/
|
||
$aPaging = $this->Viewer_MakePaging($aResult['count'], $iPage, Config::Get('module.topic.per_page'),
|
||
Config::Get('pagination.pages.count'), Router::GetPath('blog') . $sShowType,
|
||
in_array($sShowType, array('discussed', 'top')) ? array('period' => $sPeriod) : array());
|
||
/**
|
||
* Вызов хуков
|
||
*/
|
||
$this->Hook_Run('blog_show', array('sShowType' => $sShowType));
|
||
/**
|
||
* Загружаем переменные в шаблон
|
||
*/
|
||
$this->Viewer_Assign('aTopics', $aTopics);
|
||
$this->Viewer_Assign('aPaging', $aPaging);
|
||
if (in_array($sShowType, array('discussed', 'top'))) {
|
||
$this->Viewer_Assign('sPeriodSelectCurrent', $sPeriod);
|
||
$this->Viewer_Assign('sPeriodSelectRoot', Router::GetPath('blog') . $sShowType . '/');
|
||
}
|
||
/**
|
||
* Устанавливаем шаблон вывода
|
||
*/
|
||
$this->SetTemplateAction('index');
|
||
}
|
||
|
||
/**
|
||
* Показ топика
|
||
*
|
||
*/
|
||
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 (!$this->ACL_IsAllowShowTopic($oTopic, $this->oUserCurrent)) {
|
||
return parent::EventNotFound();
|
||
}
|
||
/**
|
||
* Если запросили топик из персонального блога то перенаправляем на страницу вывода коллективного топика
|
||
*/
|
||
if ($sBlogUrl != '' and $oTopic->getBlog()->getType() == 'personal') {
|
||
Router::Location($oTopic->getUrl());
|
||
}
|
||
/**
|
||
* Если запросили не персональный топик то перенаправляем на страницу для вывода коллективного топика
|
||
*/
|
||
if ($sBlogUrl == '' and $oTopic->getBlog()->getType() != 'personal') {
|
||
Router::Location($oTopic->getUrl());
|
||
}
|
||
/**
|
||
* Если номер топика правильный но УРЛ блога косяный то корректируем его и перенаправляем на нужный адрес
|
||
*/
|
||
if ($sBlogUrl != '' and $oTopic->getBlog()->getUrl() != $sBlogUrl) {
|
||
Router::Location($oTopic->getUrl());
|
||
}
|
||
/**
|
||
* Достаём комменты к топику
|
||
*/
|
||
if (!Config::Get('module.comment.nested_page_reverse') and Config::Get('module.comment.use_nested') and Config::Get('module.comment.nested_per_page')) {
|
||
$iPageDef = ceil($this->Comment_GetCountCommentsRootByTargetId($oTopic->getId(),
|
||
'topic') / Config::Get('module.comment.nested_per_page'));
|
||
} else {
|
||
$iPageDef = 1;
|
||
}
|
||
$iPage = getRequest('cmtpage', 0) ? (int)getRequest('cmtpage', 0) : $iPageDef;
|
||
$aReturn = $this->Comment_GetCommentsByTargetId($oTopic->getId(), 'topic', $iPage,
|
||
Config::Get('module.comment.nested_per_page'));
|
||
$iMaxIdComment = $aReturn['iMaxIdComment'];
|
||
$aComments = $aReturn['comments'];
|
||
/**
|
||
* Если используется постраничность для комментариев - формируем ее
|
||
*/
|
||
if (Config::Get('module.comment.use_nested') and Config::Get('module.comment.nested_per_page')) {
|
||
$aPaging = $this->Viewer_MakePaging($aReturn['count'], $iPage,
|
||
Config::Get('module.comment.nested_per_page'), Config::Get('pagination.pages.count'), '');
|
||
if (!Config::Get('module.comment.nested_page_reverse') and $aPaging) {
|
||
// переворачиваем страницы в обратном порядке
|
||
$aPaging['aPagesLeft'] = array_reverse($aPaging['aPagesLeft']);
|
||
$aPaging['aPagesRight'] = array_reverse($aPaging['aPagesRight']);
|
||
}
|
||
$this->Viewer_Assign('aPagingCmt', $aPaging);
|
||
}
|
||
/**
|
||
* Отмечаем дату прочтения топика
|
||
*/
|
||
if ($this->oUserCurrent) {
|
||
$oTopicRead = Engine::GetEntity('Topic_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);
|
||
}
|
||
/**
|
||
* Выставляем SEO данные
|
||
*/
|
||
$sTextSeo = strip_tags($oTopic->getText());
|
||
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo, Config::Get('seo.description_words_count')));
|
||
$this->Viewer_SetHtmlKeywords($oTopic->getTags());
|
||
$this->Viewer_SetHtmlCanonical($oTopic->getUrl());
|
||
/**
|
||
* Вызов хуков
|
||
*/
|
||
$this->Hook_Run('topic_show', array("oTopic" => $oTopic));
|
||
/**
|
||
* Загружаем переменные в шаблон
|
||
*/
|
||
$this->Viewer_Assign('oTopic', $oTopic);
|
||
$this->Viewer_Assign('aComments', $aComments);
|
||
$this->Viewer_Assign('iMaxIdComment', $iMaxIdComment);
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($oTopic->getBlog()->getTitle());
|
||
$this->Viewer_AddHtmlTitle($oTopic->getTitle());
|
||
$this->Viewer_SetHtmlRssAlternate(Router::GetPath('rss') . 'comments/' . $oTopic->getId() . '/',
|
||
$oTopic->getTitle());
|
||
/**
|
||
* Устанавливаем шаблон вывода
|
||
*/
|
||
$this->SetTemplateAction('topic');
|
||
}
|
||
|
||
/**
|
||
* Страница со списком читателей блога
|
||
*
|
||
*/
|
||
protected function EventShowUsers()
|
||
{
|
||
$sBlogUrl = $this->sCurrentEvent;
|
||
/**
|
||
* Проверяем есть ли блог с таким УРЛ
|
||
*/
|
||
if (!($oBlog = $this->Blog_GetBlogByUrl($sBlogUrl))) {
|
||
return parent::EventNotFound();
|
||
}
|
||
/**
|
||
* Меню
|
||
*/
|
||
$this->sMenuSubItemSelect = '';
|
||
$this->sMenuSubBlogUrl = $oBlog->getUrlFull();
|
||
/**
|
||
* Текущая страница
|
||
*/
|
||
$iPage = $this->GetParamEventMatch(1, 2) ? $this->GetParamEventMatch(1, 2) : 1;
|
||
$aBlogUsersResult = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(), ModuleBlog::BLOG_USER_ROLE_USER, $iPage,
|
||
Config::Get('module.blog.users_per_page'));
|
||
$aBlogUsers = $aBlogUsersResult['collection'];
|
||
/**
|
||
* Формируем постраничность
|
||
*/
|
||
$aPaging = $this->Viewer_MakePaging($aBlogUsersResult['count'], $iPage,
|
||
Config::Get('module.blog.users_per_page'), Config::Get('pagination.pages.count'),
|
||
$oBlog->getUrlFull() . 'users');
|
||
$this->Viewer_Assign('aPaging', $aPaging);
|
||
/**
|
||
* Вызов хуков
|
||
*/
|
||
$this->Hook_Run('blog_collective_show_users', array('oBlog' => $oBlog));
|
||
/**
|
||
* Загружаем переменные в шаблон
|
||
*/
|
||
$this->Viewer_Assign('aBlogUsers', $aBlogUsers);
|
||
$this->Viewer_Assign('iCountBlogUsers', $aBlogUsersResult['count']);
|
||
$this->Viewer_Assign('oBlog', $oBlog);
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
|
||
/**
|
||
* Устанавливаем шаблон вывода
|
||
*/
|
||
$this->SetTemplateAction('users');
|
||
}
|
||
|
||
/**
|
||
* Вывод топиков из определенного блога
|
||
*
|
||
*/
|
||
protected function EventShowBlog()
|
||
{
|
||
$sPeriod = 1; // по дефолту 1 день
|
||
if (in_array(getRequestStr('period'), array(1, 7, 30, 'all'))) {
|
||
$sPeriod = getRequestStr('period');
|
||
}
|
||
$sBlogUrl = $this->sCurrentEvent;
|
||
$sShowType = in_array($this->GetParamEventMatch(0, 0),
|
||
array('bad', 'new', 'newall', 'discussed', 'top')) ? $this->GetParamEventMatch(0, 0) : 'good';
|
||
if (!in_array($sShowType, array('discussed', 'top'))) {
|
||
$sPeriod = 'all';
|
||
}
|
||
/**
|
||
* Проверяем есть ли блог с таким УРЛ
|
||
*/
|
||
if (!($oBlog = $this->Blog_GetBlogByUrl($sBlogUrl))) {
|
||
return parent::EventNotFound();
|
||
}
|
||
/**
|
||
* Определяем права на отображение закрытого блога
|
||
*/
|
||
if ($oBlog->getType() == 'close'
|
||
and (!$this->oUserCurrent
|
||
or !in_array(
|
||
$oBlog->getId(),
|
||
$this->Blog_GetAccessibleBlogsByUser($this->oUserCurrent)
|
||
)
|
||
)
|
||
) {
|
||
$bPrivateBlog = true;
|
||
} else {
|
||
$bPrivateBlog = false;
|
||
}
|
||
/**
|
||
* Меню
|
||
*/
|
||
$this->sMenuSubItemSelect = $sShowType == 'newall' ? 'new' : $sShowType;
|
||
$this->sNavTopicsSubUrl = $oBlog->getUrlFull();
|
||
/**
|
||
* Передан ли номер страницы
|
||
*/
|
||
$iPage = $this->GetParamEventMatch(($sShowType == 'good') ? 0 : 1,
|
||
2) ? $this->GetParamEventMatch(($sShowType == 'good') ? 0 : 1, 2) : 1;
|
||
if ($iPage == 1 and !getRequest('period') and in_array($sShowType, array('discussed', 'top'))) {
|
||
$this->Viewer_SetHtmlCanonical($oBlog->getUrlFull() . $sShowType . '/');
|
||
}
|
||
|
||
if (!$bPrivateBlog) {
|
||
/**
|
||
* Получаем список топиков
|
||
*/
|
||
$aResult = $this->Topic_GetTopicsByBlog($oBlog, $iPage, Config::Get('module.topic.per_page'), $sShowType,
|
||
$sPeriod == 'all' ? null : $sPeriod * 60 * 60 * 24);
|
||
/**
|
||
* Если нет топиков за 1 день, то показываем за неделю (7)
|
||
*/
|
||
if (in_array($sShowType,
|
||
array('discussed', 'top')) and !$aResult['count'] and $iPage == 1 and !getRequest('period')
|
||
) {
|
||
$sPeriod = 7;
|
||
$aResult = $this->Topic_GetTopicsByBlog($oBlog, $iPage, Config::Get('module.topic.per_page'),
|
||
$sShowType, $sPeriod == 'all' ? null : $sPeriod * 60 * 60 * 24);
|
||
}
|
||
$aTopics = $aResult['collection'];
|
||
/**
|
||
* Формируем постраничность
|
||
*/
|
||
$aPaging = ($sShowType == 'good')
|
||
? $this->Viewer_MakePaging($aResult['count'], $iPage, Config::Get('module.topic.per_page'),
|
||
Config::Get('pagination.pages.count'), rtrim($oBlog->getUrlFull(), '/'))
|
||
: $this->Viewer_MakePaging($aResult['count'], $iPage, Config::Get('module.topic.per_page'),
|
||
Config::Get('pagination.pages.count'), $oBlog->getUrlFull() . $sShowType,
|
||
array('period' => $sPeriod));
|
||
/**
|
||
* Получаем число новых топиков в текущем блоге
|
||
*/
|
||
$this->iCountTopicsSubNew = $this->Topic_GetCountTopicsByBlogNew($oBlog);
|
||
|
||
$this->Viewer_Assign('aPaging', $aPaging);
|
||
$this->Viewer_Assign('aTopics', $aTopics);
|
||
if (in_array($sShowType, array('discussed', 'top'))) {
|
||
$this->Viewer_Assign('sPeriodSelectCurrent', $sPeriod);
|
||
$this->Viewer_Assign('sPeriodSelectRoot', $oBlog->getUrlFull() . $sShowType . '/');
|
||
}
|
||
}
|
||
/**
|
||
* Выставляем SEO данные
|
||
*/
|
||
$sTextSeo = strip_tags($oBlog->getDescription());
|
||
$this->Viewer_SetHtmlDescription(func_text_words($sTextSeo, Config::Get('seo.description_words_count')));
|
||
/**
|
||
* Получаем список юзеров блога
|
||
*/
|
||
$aBlogUsersResult = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(), ModuleBlog::BLOG_USER_ROLE_USER, 1,
|
||
Config::Get('module.blog.users_per_page'));
|
||
$aBlogUsers = $aBlogUsersResult['collection'];
|
||
$aBlogModeratorsResult = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(),
|
||
ModuleBlog::BLOG_USER_ROLE_MODERATOR);
|
||
$aBlogModerators = $aBlogModeratorsResult['collection'];
|
||
$aBlogAdministratorsResult = $this->Blog_GetBlogUsersByBlogId($oBlog->getId(),
|
||
ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR);
|
||
$aBlogAdministrators = $aBlogAdministratorsResult['collection'];
|
||
/**
|
||
* Для админов проекта получаем список блогов и передаем их во вьювер
|
||
*/
|
||
if ($this->oUserCurrent and $this->oUserCurrent->isAdministrator()) {
|
||
$aBlogs = $this->Blog_GetBlogs();
|
||
unset($aBlogs[$oBlog->getId()]);
|
||
|
||
$this->Viewer_Assign('aBlogs', $aBlogs);
|
||
}
|
||
/**
|
||
* Вызов хуков
|
||
*/
|
||
$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', $aBlogUsersResult['count']);
|
||
$this->Viewer_Assign('iCountBlogModerators', $aBlogModeratorsResult['count']);
|
||
$this->Viewer_Assign('iCountBlogAdministrators', $aBlogAdministratorsResult['count'] + 1);
|
||
$this->Viewer_Assign('oBlog', $oBlog);
|
||
$this->Viewer_Assign('bPrivateBlog', $bPrivateBlog);
|
||
/**
|
||
* Устанавливаем title страницы
|
||
*/
|
||
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
|
||
$this->Viewer_SetHtmlRssAlternate(Router::GetPath('rss') . 'blog/' . $oBlog->getUrl() . '/',
|
||
$oBlog->getTitle());
|
||
/**
|
||
* Устанавливаем шаблон вывода
|
||
*/
|
||
$this->SetTemplateAction('blog');
|
||
}
|
||
|
||
/**
|
||
* Обработка добавление комментария к топику через ajax
|
||
*
|
||
*/
|
||
protected function AjaxAddComment()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
$this->SubmitComment();
|
||
}
|
||
|
||
/**
|
||
* Проверка на соответсвие коментария требованиям безопасности
|
||
*
|
||
* @param ModuleTopic_EntityTopic $oTopic
|
||
* @param string $sText
|
||
*
|
||
* @return bool result
|
||
*/
|
||
protected function CheckComment($oTopic, $sText)
|
||
{
|
||
|
||
$bOk = true;
|
||
/**
|
||
* Проверям авторизован ли пользователь
|
||
*/
|
||
if (!$this->User_IsAuthorization()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем топик
|
||
*/
|
||
if (!$oTopic) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
return false;
|
||
}
|
||
/**
|
||
* Права на просмотр топика
|
||
*/
|
||
if (!$this->ACL_IsAllowShowTopic($oTopic, $this->oUserCurrent)) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем разрешено ли постить комменты
|
||
*/
|
||
if (!$this->ACL_CanPostComment($this->oUserCurrent, $oTopic)) {
|
||
$this->Message_AddErrorSingle($this->Rbac_GetMsgLast());
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем запрет на добавления коммента автором топика
|
||
*/
|
||
if ($oTopic->getForbidComment()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('topic.comments.notices.not_allowed'),
|
||
$this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем текст комментария
|
||
*/
|
||
if (!func_check($sText, 'text', 2, 10000)) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('topic.comments.notices.error_text'),
|
||
$this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
|
||
$this->Hook_Run('comment_check', array('oTopic' => $oTopic, 'sText' => $sText, 'bOk' => &$bOk));
|
||
|
||
return $bOk;
|
||
}
|
||
|
||
/**
|
||
* Проверка на соответсвие коментария родительскому коментарию
|
||
*
|
||
* @param ModuleTopic_EntityTopic $oTopic
|
||
* @param string $sText
|
||
* @param ModuleComment_EntityComment $oCommentParent
|
||
*
|
||
* @return bool result
|
||
*/
|
||
protected function CheckParentComment($oTopic, $sText, $oCommentParent)
|
||
{
|
||
|
||
$sParentId = 0;
|
||
if ($oCommentParent) {
|
||
$sParentId = $oCommentParent->GetCommentId();
|
||
}
|
||
|
||
$bOk = true;
|
||
/**
|
||
* Проверям на какой коммент отвечаем
|
||
*/
|
||
if (!func_check($sParentId, 'id')) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
|
||
if ($sParentId) {
|
||
/**
|
||
* Проверяем существует ли комментарий на который отвечаем
|
||
*/
|
||
if (!($oCommentParent)) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
/**
|
||
* Проверяем из одного топика ли новый коммент и тот на который отвечаем
|
||
*/
|
||
if ($oCommentParent->getTargetId() != $oTopic->getId()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
} else {
|
||
$sParentId = null;
|
||
}
|
||
|
||
/**
|
||
* Проверка на дублирующий коммент
|
||
*/
|
||
if ($this->Comment_GetCommentUnique($oTopic->getId(), 'topic', $this->oUserCurrent->getId(), $sParentId,
|
||
md5($sText))
|
||
) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('topic.comments.notices.spam'), $this->Lang_Get('error'));
|
||
$bOk = false;
|
||
}
|
||
|
||
$this->Hook_Run('comment_check_parent',
|
||
array('oTopic' => $oTopic, 'sText' => $sText, 'oCommentParent' => $oCommentParent, 'bOk' => &$bOk));
|
||
|
||
return $bOk;
|
||
}
|
||
|
||
/**
|
||
* Обработка добавление комментария к топику
|
||
*
|
||
*/
|
||
protected function SubmitComment()
|
||
{
|
||
|
||
$oTopic = $this->Topic_GetTopicById(getRequestStr('cmt_target_id'));
|
||
$sText = getRequestStr('comment_text');
|
||
$sParentId = (int)getRequest('reply');
|
||
$oCommentParent = null;
|
||
|
||
if (!$sParentId) {
|
||
/**
|
||
* Корневой комментарий
|
||
*/
|
||
$sParentId = null;
|
||
} else {
|
||
/**
|
||
* Родительский комментарий
|
||
*/
|
||
$oCommentParent = $this->Comment_GetCommentById($sParentId);
|
||
}
|
||
|
||
/**
|
||
* Проверка на соответсвие комментария требованиям безопасности
|
||
*/
|
||
if (!$this->CheckComment($oTopic, $sText)) {
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* Проверка на соответсвие комментария родительскому коментарию
|
||
*/
|
||
if (!$this->CheckParentComment($oTopic, $sText, $oCommentParent)) {
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* Создаём коммент
|
||
*/
|
||
$oCommentNew = Engine::GetEntity('Comment');
|
||
$oCommentNew->setTargetId($oTopic->getId());
|
||
$oCommentNew->setTargetType('topic');
|
||
$oCommentNew->setTargetParentId($oTopic->getBlog()->getId());
|
||
$oCommentNew->setUserId($this->oUserCurrent->getId());
|
||
$oCommentNew->setText($this->Text_Parser($sText));
|
||
$oCommentNew->setTextSource($sText);
|
||
$oCommentNew->setDate(date("Y-m-d H:i:s"));
|
||
$oCommentNew->setUserIp(func_getIp());
|
||
$oCommentNew->setPid($sParentId);
|
||
$oCommentNew->setTextHash(md5($sText));
|
||
$oCommentNew->setPublish($oTopic->getPublish());
|
||
/**
|
||
* Добавляем коммент
|
||
*/
|
||
$this->Hook_Run('comment_add_before',
|
||
array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTopic' => $oTopic));
|
||
if ($this->Comment_AddComment($oCommentNew)) {
|
||
$this->Hook_Run('comment_add_after',
|
||
array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTopic' => $oTopic));
|
||
|
||
$this->Viewer_AssignAjax('sCommentId', $oCommentNew->getId());
|
||
if ($oTopic->getPublish()) {
|
||
/**
|
||
* Добавляем коммент в прямой эфир если топик не в черновиках
|
||
*/
|
||
$oCommentOnline = Engine::GetEntity('Comment_CommentOnline');
|
||
$oCommentOnline->setTargetId($oCommentNew->getTargetId());
|
||
$oCommentOnline->setTargetType($oCommentNew->getTargetType());
|
||
$oCommentOnline->setTargetParentId($oCommentNew->getTargetParentId());
|
||
$oCommentOnline->setCommentId($oCommentNew->getId());
|
||
|
||
$this->Comment_AddCommentOnline($oCommentOnline);
|
||
}
|
||
/**
|
||
* Сохраняем дату последнего коммента для юзера
|
||
*/
|
||
$this->oUserCurrent->setDateCommentLast(date("Y-m-d H:i:s"));
|
||
$this->User_Update($this->oUserCurrent);
|
||
/**
|
||
* Фиксируем ID у media файлов комментария
|
||
*/
|
||
$this->Media_ReplaceTargetTmpById('comment', $oCommentNew->getId());
|
||
/**
|
||
* Список емайлов на которые не нужно отправлять уведомление
|
||
*/
|
||
$aExcludeMail = array($this->oUserCurrent->getMail());
|
||
/**
|
||
* Отправляем уведомление тому на чей коммент ответили
|
||
*/
|
||
if ($oCommentParent and $oCommentParent->getUserId() != $oTopic->getUserId() and $oCommentNew->getUserId() != $oCommentParent->getUserId()) {
|
||
$oUserAuthorComment = $oCommentParent->getUser();
|
||
$aExcludeMail[] = $oUserAuthorComment->getMail();
|
||
$this->Notify_SendCommentReplyToAuthorParentComment($oUserAuthorComment, $oTopic, $oCommentNew,
|
||
$this->oUserCurrent);
|
||
}
|
||
/**
|
||
* Отправка уведомления автору топика
|
||
*/
|
||
$this->Subscribe_Send('topic_new_comment', $oTopic->getId(),
|
||
Config::Get('module.notify.prefix') . '.comment_new.tpl', $this->Lang_Get('emails.comment_new.subject'),
|
||
array(
|
||
'oTopic' => $oTopic,
|
||
'oComment' => $oCommentNew,
|
||
'oUserComment' => $this->oUserCurrent,
|
||
), $aExcludeMail);
|
||
/**
|
||
* Добавляем событие в ленту
|
||
*/
|
||
$this->Stream_write($oCommentNew->getUserId(), 'add_comment', $oCommentNew->getId(),
|
||
$oTopic->getPublish() && $oTopic->getBlog()->getType() != 'close');
|
||
} else {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error'));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получение новых комментариев
|
||
*
|
||
*/
|
||
protected function AjaxResponseComment()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
/**
|
||
* Пользователь авторизован?
|
||
*/
|
||
if (!$this->oUserCurrent) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
/**
|
||
* Топик существует?
|
||
*/
|
||
$idTopic = getRequestStr('idTarget', null, 'post');
|
||
if (!($oTopic = $this->Topic_GetTopicById($idTopic))) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Есть доступ к комментариям этого топика? Закрытый блог?
|
||
*/
|
||
if (!$this->ACL_IsAllowShowBlog($oTopic->getBlog(), $this->oUserCurrent)) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
|
||
$idCommentLast = getRequestStr('idCommentLast', null, 'post');
|
||
$selfIdComment = getRequestStr('selfIdComment', null, 'post');
|
||
$aComments = array();
|
||
/**
|
||
* Если используется постраничность, возвращаем только добавленный комментарий
|
||
*/
|
||
if (getRequest('bUsePaging', null, 'post') and $selfIdComment) {
|
||
if ($oComment = $this->Comment_GetCommentById($selfIdComment) and $oComment->getTargetId() == $oTopic->getId() and $oComment->getTargetType() == 'topic') {
|
||
$oViewerLocal = $this->Viewer_GetLocalViewer();
|
||
|
||
$oViewerLocal->Assign('oUserCurrent', $this->oUserCurrent);
|
||
$oViewerLocal->Assign('bOneComment', true, true);
|
||
$oViewerLocal->Assign('bShowFavourite', true, true);
|
||
$oViewerLocal->Assign('bShowVote', true, true);
|
||
$oViewerLocal->Assign('oComment', $oComment, true);
|
||
|
||
$sHtml = $oViewerLocal->Fetch($this->Comment_GetTemplateCommentByTarget($oTopic->getId(), 'topic'));
|
||
|
||
$aCmt = array();
|
||
$aCmt[] = array(
|
||
'html' => $sHtml,
|
||
'obj' => $oComment,
|
||
);
|
||
} else {
|
||
$aCmt = array();
|
||
}
|
||
$aReturn['comments'] = $aCmt;
|
||
$aReturn['iMaxIdComment'] = $selfIdComment;
|
||
} else {
|
||
$aReturn = $this->Comment_GetCommentsNewByTargetId($oTopic->getId(), 'topic', $idCommentLast);
|
||
}
|
||
$iMaxIdComment = $aReturn['iMaxIdComment'];
|
||
|
||
$oTopicRead = Engine::GetEntity('Topic_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);
|
||
|
||
$aCmts = $aReturn['comments'];
|
||
if ($aCmts and is_array($aCmts)) {
|
||
foreach ($aCmts as $aCmt) {
|
||
$aComments[] = array(
|
||
'html' => $aCmt['html'],
|
||
'idParent' => $aCmt['obj']->getPid(),
|
||
'id' => $aCmt['obj']->getId(),
|
||
);
|
||
}
|
||
}
|
||
|
||
$this->Viewer_AssignAjax('iMaxIdComment', $iMaxIdComment);
|
||
$this->Viewer_AssignAjax('aComments', $aComments);
|
||
}
|
||
|
||
/**
|
||
* Обработка ajax запроса на отправку
|
||
* пользователям приглашения вступить в закрытый блог
|
||
*/
|
||
protected function AjaxAddBlogInvite()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
$aUsers = getRequest('aUserList', null, 'post');
|
||
$sBlogId = getRequestStr('iTargetId', null, 'post');
|
||
/**
|
||
* Если пользователь не авторизирован, возвращаем ошибку
|
||
*/
|
||
if (!$this->User_IsAuthorization()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
$this->oUserCurrent = $this->User_GetUserCurrent();
|
||
/**
|
||
* Проверяем существование блога
|
||
*/
|
||
if (!$oBlog = $this->Blog_GetBlogById($sBlogId) or !is_array($aUsers)) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Проверяем тип блога
|
||
*/
|
||
if ($oBlog->getType() != 'close') {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Проверяем, имеет ли право текущий пользователь добавлять invite в blog
|
||
*/
|
||
$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId());
|
||
$bIsAdministratorBlog = $oBlogUser ? $oBlogUser->getIsAdministrator() : false;
|
||
if ($oBlog->getOwnerId() != $this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Получаем список пользователей блога (любого статуса)
|
||
* todo: Это полный АХТУНГ - исправить!
|
||
*/
|
||
$aBlogUsersResult = $this->Blog_GetBlogUsersByBlogId(
|
||
$oBlog->getId(),
|
||
array(
|
||
ModuleBlog::BLOG_USER_ROLE_BAN,
|
||
ModuleBlog::BLOG_USER_ROLE_REJECT,
|
||
ModuleBlog::BLOG_USER_ROLE_INVITE,
|
||
ModuleBlog::BLOG_USER_ROLE_USER,
|
||
ModuleBlog::BLOG_USER_ROLE_MODERATOR,
|
||
ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR
|
||
), null // пока костылем
|
||
);
|
||
$aBlogUsers = $aBlogUsersResult['collection'];
|
||
|
||
$aResult = array();
|
||
/**
|
||
* Обрабатываем добавление по каждому из переданных логинов
|
||
*/
|
||
foreach ($aUsers as $sUser) {
|
||
$sUser = trim($sUser);
|
||
if ($sUser == '') {
|
||
continue;
|
||
}
|
||
/**
|
||
* Если пользователь пытается добавить инвайт
|
||
* самому себе, возвращаем ошибку
|
||
*/
|
||
if (strtolower($sUser) == strtolower($this->oUserCurrent->getLogin())) {
|
||
$aResult[] = array(
|
||
'bStateError' => true,
|
||
'sMsgTitle' => $this->Lang_Get('error'),
|
||
'sMsg' => $this->Lang_Get('blog.invite.notices.add_self')
|
||
);
|
||
continue;
|
||
}
|
||
/**
|
||
* Если пользователь не найден или неактивен,
|
||
* возвращаем ошибку
|
||
*/
|
||
if (!$oUser = $this->User_GetUserByLogin($sUser) or $oUser->getActivate() != 1) {
|
||
$aResult[] = array(
|
||
'bStateError' => true,
|
||
'sMsgTitle' => $this->Lang_Get('error'),
|
||
'sMsg' => $this->Lang_Get('user.notices.not_found',
|
||
array('login' => htmlspecialchars($sUser))),
|
||
'sUserLogin' => htmlspecialchars($sUser)
|
||
);
|
||
continue;
|
||
}
|
||
|
||
if (!isset($aBlogUsers[$oUser->getId()])) {
|
||
/**
|
||
* Создаем нового блог-пользователя со статусом INVITED
|
||
*/
|
||
$oBlogUserNew = Engine::GetEntity('Blog_BlogUser');
|
||
$oBlogUserNew->setBlogId($oBlog->getId());
|
||
$oBlogUserNew->setUserId($oUser->getId());
|
||
$oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_INVITE);
|
||
|
||
if ($this->Blog_AddRelationBlogUser($oBlogUserNew)) {
|
||
$oViewer = $this->Viewer_GetLocalViewer();
|
||
$oViewer->Assign('oUser', $oUser);
|
||
$oViewer->Assign('bUserListSmallShowActions', true);
|
||
|
||
$aResult[] = array(
|
||
'bStateError' => false,
|
||
'sMsgTitle' => $this->Lang_Get('attention'),
|
||
'sMsg' => $this->Lang_Get('blog.invite.notices.add',
|
||
array('login' => htmlspecialchars($sUser))),
|
||
'sUserLogin' => htmlspecialchars($sUser),
|
||
'sUserWebPath' => $oUser->getUserWebPath(),
|
||
'sUserAvatar48' => $oUser->getProfileAvatarPath(48),
|
||
'iUserId' => $oUser->getId(),
|
||
'sHtml' => $oViewer->Fetch("components/user/user-list-small-item.blog_invite.tpl")
|
||
);
|
||
$this->SendBlogInvite($oBlog, $oUser);
|
||
} else {
|
||
$aResult[] = array(
|
||
'bStateError' => true,
|
||
'sMsgTitle' => $this->Lang_Get('error'),
|
||
'sMsg' => $this->Lang_Get('system_error'),
|
||
'sUserLogin' => htmlspecialchars($sUser)
|
||
);
|
||
}
|
||
} else {
|
||
/**
|
||
* Попытка добавить приглашение уже существующему пользователю,
|
||
* возвращаем ошибку (сначала определяя ее точный текст)
|
||
*/
|
||
switch (true) {
|
||
case ($aBlogUsers[$oUser->getId()]->getUserRole() == ModuleBlog::BLOG_USER_ROLE_INVITE):
|
||
$sErrorMessage = $this->Lang_Get('blog.invite.notices.already_invited',
|
||
array('login' => htmlspecialchars($sUser)));
|
||
break;
|
||
case ($aBlogUsers[$oUser->getId()]->getUserRole() > ModuleBlog::BLOG_USER_ROLE_GUEST):
|
||
$sErrorMessage = $this->Lang_Get('blog.invite.notices.already_joined',
|
||
array('login' => htmlspecialchars($sUser)));
|
||
break;
|
||
case ($aBlogUsers[$oUser->getId()]->getUserRole() == ModuleBlog::BLOG_USER_ROLE_REJECT):
|
||
$sErrorMessage = $this->Lang_Get('blog.invite.notices.reject',
|
||
array('login' => htmlspecialchars($sUser)));
|
||
break;
|
||
default:
|
||
$sErrorMessage = $this->Lang_Get('system_error');
|
||
}
|
||
$aResult[] = array(
|
||
'bStateError' => true,
|
||
'sMsgTitle' => $this->Lang_Get('error'),
|
||
'sMsg' => $sErrorMessage,
|
||
'sUserLogin' => htmlspecialchars($sUser)
|
||
);
|
||
continue;
|
||
}
|
||
}
|
||
/**
|
||
* Передаем во вьевер массив с результатами обработки по каждому пользователю
|
||
*/
|
||
$this->Viewer_AssignAjax('aUserList', $aResult);
|
||
}
|
||
|
||
/**
|
||
* Обработка ajax запроса на отправку
|
||
* повторного приглашения вступить в закрытый блог
|
||
*/
|
||
protected function AjaxReBlogInvite()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
$sUserId = getRequestStr('iUserId', null, 'post');
|
||
$sBlogId = getRequestStr('iTargetId', null, 'post');
|
||
/**
|
||
* Если пользователь не авторизирован, возвращаем ошибку
|
||
*/
|
||
if (!$this->User_IsAuthorization()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
$this->oUserCurrent = $this->User_GetUserCurrent();
|
||
/**
|
||
* Проверяем существование блога
|
||
*/
|
||
if (!$oBlog = $this->Blog_GetBlogById($sBlogId)) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Пользователь существует и активен?
|
||
*/
|
||
if (!$oUser = $this->User_GetUserById($sUserId) or $oUser->getActivate() != 1) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Проверяем, имеет ли право текущий пользователь добавлять invite в blog
|
||
*/
|
||
$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId());
|
||
$bIsAdministratorBlog = $oBlogUser ? $oBlogUser->getIsAdministrator() : false;
|
||
if ($oBlog->getOwnerId() != $this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Попытка отправить инвайт пользователю, который не состоит в данном блоге
|
||
*/
|
||
if (!($oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()))) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
if ($oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_INVITE) {
|
||
$this->SendBlogInvite($oBlog, $oUser);
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.invite.notices.add',
|
||
array('login' => $oUser->getLogin())), $this->Lang_Get('attention'));
|
||
} else {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Обработка ajax запроса на удаление вступить в закрытый блог
|
||
*/
|
||
protected function AjaxRemoveBlogInvite()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
$sUserId = getRequestStr('iUserId', null, 'post');
|
||
$sBlogId = getRequestStr('iTargetId', null, 'post');
|
||
/**
|
||
* Если пользователь не авторизирован, возвращаем ошибку
|
||
*/
|
||
if (!$this->User_IsAuthorization()) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
$this->oUserCurrent = $this->User_GetUserCurrent();
|
||
/**
|
||
* Проверяем существование блога
|
||
*/
|
||
if (!$oBlog = $this->Blog_GetBlogById($sBlogId)) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Пользователь существует и активен?
|
||
*/
|
||
if (!$oUser = $this->User_GetUserById($sUserId) or $oUser->getActivate() != 1) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Проверяем, имеет ли право текущий пользователь добавлять invite в blog
|
||
*/
|
||
$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId());
|
||
$bIsAdministratorBlog = $oBlogUser ? $oBlogUser->getIsAdministrator() : false;
|
||
if ($oBlog->getOwnerId() != $this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
|
||
$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId());
|
||
if ($oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_INVITE) {
|
||
/**
|
||
* Удаляем связь/приглашение
|
||
*/
|
||
$this->Blog_DeleteRelationBlogUser($oBlogUser);
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.invite.notices.remove',
|
||
array('login' => $oUser->getLogin())), $this->Lang_Get('attention'));
|
||
} else {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Выполняет отправку приглашения в блог
|
||
* (по внутренней почте и на email)
|
||
*
|
||
* @param ModuleBlog_EntityBlog $oBlog
|
||
* @param ModuleUser_EntityUser $oUser
|
||
*/
|
||
protected function SendBlogInvite($oBlog, $oUser)
|
||
{
|
||
$sTitle = $this->Lang_Get(
|
||
'blog.invite.email.title',
|
||
array(
|
||
'blog_title' => $oBlog->getTitle()
|
||
)
|
||
);
|
||
|
||
require_once Config::Get('path.framework.libs_vendor.server') . '/XXTEA/encrypt.php';
|
||
/**
|
||
* Формируем код подтверждения в URL
|
||
*/
|
||
$sCode = $oBlog->getId() . '_' . $oUser->getId();
|
||
$sCode = rawurlencode(base64_encode(xxtea_encrypt($sCode, Config::Get('module.blog.encrypt'))));
|
||
|
||
$aPath = array(
|
||
'accept' => Router::GetPath('blog') . 'invite/accept/?code=' . $sCode,
|
||
'reject' => Router::GetPath('blog') . 'invite/reject/?code=' . $sCode
|
||
);
|
||
|
||
$sText = $this->Lang_Get(
|
||
'blog.invite.email.text',
|
||
array(
|
||
'login' => $this->oUserCurrent->getLogin(),
|
||
'accept_path' => $aPath['accept'],
|
||
'reject_path' => $aPath['reject'],
|
||
'blog_title' => $oBlog->getTitle()
|
||
)
|
||
);
|
||
$oTalk = $this->Talk_SendTalk($sTitle, $sText, $this->oUserCurrent, array($oUser), false, false);
|
||
/**
|
||
* Отправляем пользователю заявку
|
||
*/
|
||
$this->Notify_SendBlogUserInvite(
|
||
$oUser, $this->oUserCurrent, $oBlog,
|
||
Router::GetPath('talk') . 'read/' . $oTalk->getId() . '/'
|
||
);
|
||
/**
|
||
* Удаляем отправляющего юзера из переписки
|
||
*/
|
||
$this->Talk_DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId());
|
||
}
|
||
|
||
/**
|
||
* Обработка отправленого пользователю приглашения вступить в блог
|
||
*/
|
||
protected function EventInviteBlog()
|
||
{
|
||
require_once Config::Get('path.framework.libs_vendor.server') . '/XXTEA/encrypt.php';
|
||
/**
|
||
* Получаем код подтверждения из ревеста и дешефруем его
|
||
*/
|
||
$sCode = xxtea_decrypt(base64_decode(rawurldecode(getRequestStr('code'))), Config::Get('module.blog.encrypt'));
|
||
if (!$sCode) {
|
||
return $this->EventNotFound();
|
||
}
|
||
list($sBlogId, $sUserId) = explode('_', $sCode, 2);
|
||
|
||
$sAction = $this->GetParam(0);
|
||
/**
|
||
* Получаем текущего пользователя
|
||
*/
|
||
if (!$this->User_IsAuthorization()) {
|
||
return $this->EventNotFound();
|
||
}
|
||
$this->oUserCurrent = $this->User_GetUserCurrent();
|
||
/**
|
||
* Если приглашенный пользователь не является авторизированным
|
||
*/
|
||
if ($this->oUserCurrent->getId() != $sUserId) {
|
||
return $this->EventNotFound();
|
||
}
|
||
/**
|
||
* Получаем указанный блог
|
||
*/
|
||
if ((!$oBlog = $this->Blog_GetBlogById($sBlogId)) || $oBlog->getType() != 'close') {
|
||
return $this->EventNotFound();
|
||
}
|
||
/**
|
||
* Получаем связь "блог-пользователь" и проверяем,
|
||
* чтобы ее тип был INVITE или REJECT
|
||
*/
|
||
if (!$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId())) {
|
||
return $this->EventNotFound();
|
||
}
|
||
if ($oBlogUser->getUserRole() > ModuleBlog::BLOG_USER_ROLE_GUEST) {
|
||
$sMessage = $this->Lang_Get('blog.invite.alerts.already_joined');
|
||
$this->Message_AddError($sMessage, $this->Lang_Get('error'), true);
|
||
Router::Location(Router::GetPath('talk'));
|
||
return;
|
||
}
|
||
if (!in_array($oBlogUser->getUserRole(),
|
||
array(ModuleBlog::BLOG_USER_ROLE_INVITE, ModuleBlog::BLOG_USER_ROLE_REJECT))
|
||
) {
|
||
$this->Message_AddError($this->Lang_Get('system_error'), $this->Lang_Get('error'), true);
|
||
Router::Location(Router::GetPath('talk'));
|
||
return;
|
||
}
|
||
/**
|
||
* Обновляем роль пользователя до читателя
|
||
*/
|
||
$oBlogUser->setUserRole(($sAction == 'accept') ? ModuleBlog::BLOG_USER_ROLE_USER : ModuleBlog::BLOG_USER_ROLE_REJECT);
|
||
if (!$this->Blog_UpdateRelationBlogUser($oBlogUser)) {
|
||
$this->Message_AddError($this->Lang_Get('system_error'), $this->Lang_Get('error'), true);
|
||
Router::Location(Router::GetPath('talk'));
|
||
return;
|
||
}
|
||
if ($sAction == 'accept') {
|
||
/**
|
||
* Увеличиваем число читателей блога
|
||
*/
|
||
$oBlog->setCountUser($oBlog->getCountUser() + 1);
|
||
$this->Blog_UpdateBlog($oBlog);
|
||
$sMessage = $this->Lang_Get('blog.invite.alerts.accepted');
|
||
/**
|
||
* Добавляем событие в ленту
|
||
*/
|
||
$this->Stream_write($oBlogUser->getUserId(), 'join_blog', $oBlog->getId());
|
||
} else {
|
||
$sMessage = $this->Lang_Get('blog.invite.alerts.rejected');
|
||
}
|
||
$this->Message_AddNotice($sMessage, $this->Lang_Get('attention'), true);
|
||
/**
|
||
* Перенаправляем на страницу личной почты
|
||
*/
|
||
Router::Location(Router::GetPath('talk'));
|
||
}
|
||
|
||
/**
|
||
* Удаление блога
|
||
*
|
||
*/
|
||
protected function EventDeleteBlog()
|
||
{
|
||
$this->Security_ValidateSendForm();
|
||
/**
|
||
* Проверяем передан ли в УРЛе номер блога
|
||
*/
|
||
$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');
|
||
}
|
||
/**
|
||
* проверяем есть ли право на удаление топика
|
||
*/
|
||
if (!$bAccess = $this->ACL_IsAllowDeleteBlog($oBlog, $this->oUserCurrent)) {
|
||
return parent::EventNotFound();
|
||
}
|
||
$aTopics = $this->Topic_GetTopicsByBlogId($sBlogId, 1,
|
||
100000); // нужно переделать функционал переноса топиков в дргугой блог
|
||
switch ($bAccess) {
|
||
case ModuleACL::CAN_DELETE_BLOG_EMPTY_ONLY :
|
||
if (is_array($aTopics) and count($aTopics)) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.not_empty'),
|
||
$this->Lang_Get('error'), true);
|
||
Router::Location($oBlog->getUrlFull());
|
||
}
|
||
break;
|
||
case ModuleACL::CAN_DELETE_BLOG_WITH_TOPICS :
|
||
/**
|
||
* Если указан идентификатор блога для перемещения,
|
||
* то делаем попытку переместить топики.
|
||
*
|
||
* (-1) - выбран пункт меню "удалить топики".
|
||
*/
|
||
if ($sBlogIdNew = getRequestStr('topic_move_to') and ($sBlogIdNew != -1) and is_array($aTopics) and count($aTopics)) {
|
||
if (!$oBlogNew = $this->Blog_GetBlogById($sBlogIdNew)) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.move_error'),
|
||
$this->Lang_Get('error'), true);
|
||
Router::Location($oBlog->getUrlFull());
|
||
}
|
||
/**
|
||
* Если выбранный блог является персональным, возвращаем ошибку
|
||
*/
|
||
if ($oBlogNew->getType() == 'personal') {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.move_personal_error'),
|
||
$this->Lang_Get('error'), true);
|
||
Router::Location($oBlog->getUrlFull());
|
||
}
|
||
/**
|
||
* Перемещаем топики
|
||
*/
|
||
$this->Topic_MoveTopics($sBlogId, $sBlogIdNew);
|
||
}
|
||
break;
|
||
default:
|
||
return parent::EventNotFound();
|
||
}
|
||
/**
|
||
* Удаляяем блог и перенаправляем пользователя к списку блогов
|
||
*/
|
||
$this->Hook_Run('blog_delete_before', array('sBlogId' => $sBlogId));
|
||
if ($this->Blog_DeleteBlog($sBlogId)) {
|
||
$this->Hook_Run('blog_delete_after', array('sBlogId' => $sBlogId));
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.remove.alerts.success'), $this->Lang_Get('attention'),
|
||
true);
|
||
Router::Location(Router::GetPath('blogs'));
|
||
} else {
|
||
Router::Location($oBlog->getUrlFull());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получение описания блога
|
||
*
|
||
*/
|
||
protected function AjaxBlogInfo()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
$sBlogId = getRequestStr('idBlog', null, 'post');
|
||
/**
|
||
* Определяем тип блога и получаем его
|
||
*/
|
||
if ($sBlogId == 0) {
|
||
if ($this->oUserCurrent) {
|
||
$oBlog = $this->Blog_GetPersonalBlogByUserId($this->oUserCurrent->getId());
|
||
}
|
||
} else {
|
||
$oBlog = $this->Blog_GetBlogById($sBlogId);
|
||
}
|
||
/**
|
||
* если блог найден, то возвращаем описание
|
||
*/
|
||
if (isset($oBlog)) {
|
||
$sText = $oBlog->getDescription();
|
||
|
||
/**
|
||
* если блог персональный — возвращаем текущий языковой эквивалент
|
||
*/
|
||
if ($sBlogId == 0) {
|
||
$sText = $this->Lang_Get('blog.personal_description');
|
||
}
|
||
$this->Viewer_AssignAjax('sText', $sText);
|
||
} else {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Подключение/отключение к блогу
|
||
*
|
||
*/
|
||
protected function AjaxBlogJoin()
|
||
{
|
||
/**
|
||
* Устанавливаем формат Ajax ответа
|
||
*/
|
||
$this->Viewer_SetResponseAjax('json');
|
||
/**
|
||
* Пользователь авторизован?
|
||
*/
|
||
if (!$this->oUserCurrent) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
/**
|
||
* Блог существует?
|
||
*/
|
||
$idBlog = getRequestStr('idBlog', null, 'post');
|
||
if (!($oBlog = $this->Blog_GetBlogById($idBlog))) {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
/**
|
||
* Проверяем тип блога
|
||
*/
|
||
if (!in_array($oBlog->getType(), array('open', 'close'))) {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('blog.join.notices.error_invite'), $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
/**
|
||
* Получаем текущий статус пользователя в блоге
|
||
*/
|
||
$oBlogUser = $this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId());
|
||
if (!$oBlogUser || ($oBlogUser->getUserRole() < ModuleBlog::BLOG_USER_ROLE_GUEST && $oBlog->getType() == 'close')) {
|
||
if ($oBlog->getOwnerId() != $this->oUserCurrent->getId()) {
|
||
/**
|
||
* Присоединяем юзера к блогу
|
||
*/
|
||
$bResult = false;
|
||
if ($oBlogUser) {
|
||
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER);
|
||
$bResult = $this->Blog_UpdateRelationBlogUser($oBlogUser);
|
||
} elseif ($oBlog->getType() == 'open') {
|
||
$oBlogUserNew = Engine::GetEntity('Blog_BlogUser');
|
||
$oBlogUserNew->setBlogId($oBlog->getId());
|
||
$oBlogUserNew->setUserId($this->oUserCurrent->getId());
|
||
$oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER);
|
||
$bResult = $this->Blog_AddRelationBlogUser($oBlogUserNew);
|
||
}
|
||
if ($bResult) {
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.join.notices.join_success'),
|
||
$this->Lang_Get('attention'));
|
||
$this->Viewer_AssignAjax('bState', true);
|
||
/**
|
||
* Увеличиваем число читателей блога
|
||
*/
|
||
$oBlog->setCountUser($oBlog->getCountUser() + 1);
|
||
$this->Blog_UpdateBlog($oBlog);
|
||
$this->Viewer_AssignAjax('iCountUser', $oBlog->getCountUser());
|
||
/**
|
||
* Добавляем событие в ленту
|
||
*/
|
||
$this->Stream_write($this->oUserCurrent->getId(), 'join_blog', $oBlog->getId());
|
||
/**
|
||
* Добавляем подписку на этот блог в ленту пользователя
|
||
*/
|
||
$this->Userfeed_subscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG,
|
||
$oBlog->getId());
|
||
} else {
|
||
$sMsg = ($oBlog->getType() == 'close')
|
||
? $this->Lang_Get('blog.join.notices.error_invite')
|
||
: $this->Lang_Get('system_error');
|
||
$this->Message_AddErrorSingle($sMsg, $this->Lang_Get('error'));
|
||
return;
|
||
}
|
||
} else {
|
||
$this->Message_AddErrorSingle($this->Lang_Get('blog.join.notices.error_self'),
|
||
$this->Lang_Get('attention'));
|
||
return;
|
||
}
|
||
}
|
||
if ($oBlogUser && $oBlogUser->getUserRole() > ModuleBlog::BLOG_USER_ROLE_GUEST) {
|
||
/**
|
||
* Покидаем блог
|
||
*/
|
||
if ($this->Blog_DeleteRelationBlogUser($oBlogUser)) {
|
||
$this->Message_AddNoticeSingle($this->Lang_Get('blog.join.notices.leave_success'),
|
||
$this->Lang_Get('attention'));
|
||
$this->Viewer_AssignAjax('bState', false);
|
||
/**
|
||
* Уменьшаем число читателей блога
|
||
*/
|
||
$oBlog->setCountUser($oBlog->getCountUser() - 1);
|
||
$this->Blog_UpdateBlog($oBlog);
|
||
$this->Viewer_AssignAjax('iCountUser', $oBlog->getCountUser());
|
||
/**
|
||
* Удаляем подписку на этот блог в ленте пользователя
|
||
*/
|
||
$this->Userfeed_unsubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG,
|
||
$oBlog->getId());
|
||
} else {
|
||
return $this->EventErrorDebug();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Выполняется при завершении работы экшена
|
||
*
|
||
*/
|
||
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);
|
||
$this->Viewer_Assign('iCountTopicsSubNew', $this->iCountTopicsSubNew);
|
||
$this->Viewer_Assign('sNavTopicsSubUrl', $this->sNavTopicsSubUrl);
|
||
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_GUEST', ModuleBlog::BLOG_USER_ROLE_GUEST);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_USER', ModuleBlog::BLOG_USER_ROLE_USER);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_MODERATOR', ModuleBlog::BLOG_USER_ROLE_MODERATOR);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_ADMINISTRATOR', ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_INVITE', ModuleBlog::BLOG_USER_ROLE_INVITE);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_REJECT', ModuleBlog::BLOG_USER_ROLE_REJECT);
|
||
$this->Viewer_Assign('BLOG_USER_ROLE_BAN', ModuleBlog::BLOG_USER_ROLE_BAN);
|
||
}
|
||
} |