ActionBlog

Package application.actions
Inheritance class ActionBlog » Action » LsObject
Since 1.0
Source Code /application/classes/actions/ActionBlog.class.php
Экшен обработки URL'ов вида /blog/

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
_aBehaviors Список поведений в виде готовых объектов, формируется автоматически LsObject
aBadBlogUrl array Список URL с котрыми запрещено создавать блог ActionBlog
aBehaviors array Список поведений LsObject
aParams array Список параметров из URL Action
aParamsEventMatch array Список совпадений по регулярному выражению для евента Action
aRegisterEvent array Список зарегистрированных евентов Action
aRegisterEventExternal array Список евентов, которые нужно обрабатывать внешним обработчиком Action
iCountTopicsBlogNew int Число новых топиков в конкретном блоге ActionBlog
iCountTopicsCollectiveNew int Число новых топиков в коллективных блогах ActionBlog
iCountTopicsNew int Общее число новых топиков ActionBlog
iCountTopicsPersonalNew int Число новых топиков в персональных блогах ActionBlog
iCountTopicsSubNew int Число новых топиков в выбранном разделе ActionBlog
oUserCurrent ModuleUser_EntityUser|null Текущий пользователь ActionBlog
sActionTemplate string|null Шаблон экшена Action
sCurrentAction null|string Текущий экшен Action
sCurrentEvent string|null Текущий евент Action
sCurrentEventName string|null Имя текущий евента Action
sDefaultEvent string|null Дефолтный евент Action
sMenuHeadItemSelect string Главное меню ActionBlog
sMenuItemSelect string Какое меню активно ActionBlog
sMenuSubBlogUrl string УРЛ блога который подставляется в меню ActionBlog
sMenuSubItemSelect string Какое подменю активно ActionBlog
sNavTopicsSubUrl string URL-префикс для навигации по топикам ActionBlog

Public Methods

Hide inherited methods

MethodDescriptionDefined By
ActionCall() Позволяет запускать не публичные методы экшена через объект Action
ActionCallExists() Проверяет метод экшена на существование Action
ActionGet() Возвращает свойство объекта экшена Action
ActionSet() Устанавливает свойство объекта экшена Action
AddBehaviorHook() Добавляет хук поведения LsObject
AttachBehavior() Присоединяет поведение к объекту LsObject
DetachBehavior() Отсоединяет поведение от объекта LsObject
EventShutdown() Выполняется при завершении работы экшена ActionBlog
ExecEvent() Запускает евент на выполнение Action
GetActionClass() Получить каталог с шаблонами экшена(совпадает с именем класса) Action
GetBehavior() Возвращает объект поведения по его имени LsObject
GetBehaviors() Возвращает все объекты поведения LsObject
GetCurrentEventName() Возвращает имя евента Action
GetDefaultEvent() Получает евент по умолчанию Action
GetParam() Получает параметр из URL по его номеру, если его нет то null Action
GetParams() Получает список параметров из УРЛ Action
GetTemplate() Получить шаблон Action
Init() Инизиализация экшена ActionBlog
RemoveBehaviorHook() Удаляет хук поведения LsObject
RunBehaviorHook() Запускает хук поведения на выполнение LsObject
SetDefaultEvent() Устанавливает евент по умолчанию Action
SetParam() Установить значение параметра(эмуляция параметра в URL). Action
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля LsObject
__clone() При клонировании сбрасываем поведения LsObject
__construct() Конструктор Action
__get() Обработка доступа к объекты поведения LsObject

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
AddEvent() Добавляет евент в экшен Action
AddEventPreg() Добавляет евент в экшен, используя регулярное выражение для евента и параметров Action
AjaxAddBlogInvite() Обработка ajax запроса на отправку ActionBlog
AjaxAddComment() Обработка добавление комментария к топику через ajax ActionBlog
AjaxBlogInfo() Получение описания блога ActionBlog
AjaxBlogJoin() Подключение/отключение к блогу ActionBlog
AjaxReBlogInvite() Обработка ajax запроса на отправку ActionBlog
AjaxRemoveBlogInvite() Обработка ajax запроса на удаление вступить в закрытый блог ActionBlog
AjaxResponseComment() Получение новых комментариев ActionBlog
CheckComment() Проверка на соответсвие коментария требованиям безопасности ActionBlog
CheckParentComment() Проверка на соответсвие коментария родительскому коментарию ActionBlog
EventAddBlog() Добавление нового блога ActionBlog
EventAdminBlog() Управление пользователями блога ActionBlog
EventDeleteBlog() Удаление блога ActionBlog
EventEditBlog() Редактирование блога ActionBlog
EventErrorDebug() Выводит отладочную информацию в стандартном сообщении Action
EventInviteBlog() Обработка отправленого пользователю приглашения вступить в блог ActionBlog
EventNotFound() Вызывается в том случаи если не найден евент который запросили через URL Action
EventShowBlog() Вывод топиков из определенного блога ActionBlog
EventShowTopic() Показ топика ActionBlog
EventShowUsers() Страница со списком читателей блога ActionBlog
EventTopics() Показ всех топиков ActionBlog
GetEventMatch() Возвращает элементы совпадения по регулярному выражению для евента Action
GetParamEventMatch() Возвращает элементы совпадения по регулярному выражению для параметров евента Action
PrepareBehaviors() Инициализация поведений LsObject
RegisterEvent() Регистрируем евенты, по сути определяем УРЛы вида /blog/.../ ActionBlog
RegisterEventExternal() Регистрируем внешние обработчики для евентов Action
SendBlogInvite() Выполняет отправку приглашения в блог ActionBlog
SetTemplate() Устанавливает какой шаблон выводить Action
SetTemplateAction() Устанавливает какой шаблон выводить Action
SubmitComment() Обработка добавление комментария к топику ActionBlog
checkBlogFields() Проверка полей блога ActionBlog

Property Details

aBadBlogUrl property
protected array $aBadBlogUrl;

Список URL с котрыми запрещено создавать блог

iCountTopicsBlogNew property
protected int $iCountTopicsBlogNew;

Число новых топиков в конкретном блоге

iCountTopicsCollectiveNew property
protected int $iCountTopicsCollectiveNew;

Число новых топиков в коллективных блогах

iCountTopicsNew property
protected int $iCountTopicsNew;

Общее число новых топиков

iCountTopicsPersonalNew property
protected int $iCountTopicsPersonalNew;

Число новых топиков в персональных блогах

iCountTopicsSubNew property
protected int $iCountTopicsSubNew;

Число новых топиков в выбранном разделе

oUserCurrent property
protected ModuleUser_EntityUser|null $oUserCurrent;

Текущий пользователь

sMenuHeadItemSelect property
protected string $sMenuHeadItemSelect;

Главное меню

sMenuItemSelect property
protected string $sMenuItemSelect;

Какое меню активно

sMenuSubBlogUrl property
protected string $sMenuSubBlogUrl;

УРЛ блога который подставляется в меню

sMenuSubItemSelect property
protected string $sMenuSubItemSelect;

Какое подменю активно

sNavTopicsSubUrl property
protected string $sNavTopicsSubUrl;

URL-префикс для навигации по топикам

Method Details

AjaxAddBlogInvite() method
protected void AjaxAddBlogInvite()
Source Code: /application/classes/actions/ActionBlog.class.php#1393 (show)
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_list_small/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 запроса на отправку пользователям приглашения вступить в закрытый блог

AjaxAddComment() method
protected void AjaxAddComment()
Source Code: /application/classes/actions/ActionBlog.class.php#1053 (show)
protected function AjaxAddComment()
{
    
/**
     * Устанавливаем формат Ajax ответа
     */
    
$this->Viewer_SetResponseAjax('json');
    
$this->SubmitComment();
}

Обработка добавление комментария к топику через ajax

AjaxBlogInfo() method
protected void AjaxBlogInfo()
Source Code: /application/classes/actions/ActionBlog.class.php#1881 (show)
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();
    }
}

Получение описания блога

AjaxBlogJoin() method
protected void AjaxBlogJoin()
Source Code: /application/classes/actions/ActionBlog.class.php#1920 (show)
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();
        }
    }
}

Подключение/отключение к блогу

AjaxReBlogInvite() method
protected void AjaxReBlogInvite()
Source Code: /application/classes/actions/ActionBlog.class.php#1556 (show)
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 запроса на отправку повторного приглашения вступить в закрытый блог

AjaxRemoveBlogInvite() method
protected void AjaxRemoveBlogInvite()
Source Code: /application/classes/actions/ActionBlog.class.php#1610 (show)
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();
    }
}

Обработка ajax запроса на удаление вступить в закрытый блог

AjaxResponseComment() method
protected void AjaxResponseComment()
Source Code: /application/classes/actions/ActionBlog.class.php#1306 (show)
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'truetrue);
            
$oViewerLocal->Assign('bShowFavourite'truetrue);
            
$oViewerLocal->Assign('bShowVote'truetrue);
            
$oViewerLocal->Assign('oComment'$oCommenttrue);

            
$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);
}

Получение новых комментариев

CheckComment() method
protected bool CheckComment(ModuleTopic_EntityTopic $oTopic, string $sText)
$oTopic ModuleTopic_EntityTopic
$sText string
{return} bool result
Source Code: /application/classes/actions/ActionBlog.class.php#1070 (show)
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'210000)) {
        
$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;
}

Проверка на соответсвие коментария требованиям безопасности

CheckParentComment() method
protected bool CheckParentComment(ModuleTopic_EntityTopic $oTopic, string $sText, ModuleComment_EntityComment $oCommentParent)
$oTopic ModuleTopic_EntityTopic
$sText string
$oCommentParent ModuleComment_EntityComment
{return} bool result
Source Code: /application/classes/actions/ActionBlog.class.php#1133 (show)
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;
}

Проверка на соответсвие коментария родительскому коментарию

EventAddBlog() method
protected void EventAddBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#206 (show)
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'));
    }
}

Добавление нового блога

EventAdminBlog() method
protected void EventAdminBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#439 (show)
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(12) ? $this->GetParamEventMatch(12) : 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
        
), $iPageConfig::Get('module.blog.users_per_page')
    );
    
$aBlogUsers $aResult['collection'];
    
/**
     * Формируем постраничность
     */
    
$aPaging $this->Viewer_MakePaging($aResult['count'], $iPageConfig::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');
    }
}

Управление пользователями блога

EventDeleteBlog() method
protected void EventDeleteBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#1800 (show)
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($sBlogId1,
        
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());
    }
}

Удаление блога

EventEditBlog() method
protected void EventEditBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#307 (show)
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();
    }
}

Редактирование блога

EventInviteBlog() method
protected void EventInviteBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#1714 (show)
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('_'$sCode2);

    
$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_INVITEModuleBlog::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'));
}

Обработка отправленого пользователю приглашения вступить в блог

EventShowBlog() method
protected void EventShowBlog()
Source Code: /application/classes/actions/ActionBlog.class.php#911 (show)
protected function EventShowBlog()
{
    
$sPeriod 1// по дефолту 1 день
    
if (in_array(getRequestStr('period'), array(1730'all'))) {
        
$sPeriod getRequestStr('period');
    }
    
$sBlogUrl $this->sCurrentEvent;
    
$sShowType in_array($this->GetParamEventMatch(00),
        array(
'bad''new''newall''discussed''top')) ? $this->GetParamEventMatch(00) : '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') ? 1,
        
2) ? $this->GetParamEventMatch(($sShowType == 'good') ? 12) : 1;
    if (
$iPage == and !getRequest('period') and in_array($sShowType, array('discussed''top'))) {
        
$this->Viewer_SetHtmlCanonical($oBlog->getUrlFull() . $sShowType '/');
    }

    if (!
$bPrivateBlog) {
        
/**
         * Получаем список топиков
         */
        
$aResult $this->Topic_GetTopicsByBlog($oBlog$iPageConfig::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 == and !getRequest('period')
        ) {
            
$sPeriod 7;
            
$aResult $this->Topic_GetTopicsByBlog($oBlog$iPageConfig::Get('module.topic.per_page'),
                
$sShowType$sPeriod == 'all' null $sPeriod 60 60 24);
        }
        
$aTopics $aResult['collection'];
        
/**
         * Формируем постраничность
         */
        
$aPaging = ($sShowType == 'good')
            ? 
$this->Viewer_MakePaging($aResult['count'], $iPageConfig::Get('module.topic.per_page'),
                
Config::Get('pagination.pages.count'), rtrim($oBlog->getUrlFull(), '/'))
            : 
$this->Viewer_MakePaging($aResult['count'], $iPageConfig::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($sTextSeoConfig::Get('seo.description_words_count')));
    
/**
     * Получаем список юзеров блога
     */
    
$aBlogUsersResult $this->Blog_GetBlogUsersByBlogId($oBlog->getId(), ModuleBlog::BLOG_USER_ROLE_USER1,
        
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');
}

Вывод топиков из определенного блога

EventShowTopic() method
protected void EventShowTopic()
Source Code: /application/classes/actions/ActionBlog.class.php#742 (show)
protected function EventShowTopic()
{
    
$sBlogUrl '';
    if (
$this->GetParamEventMatch(01)) {
        
// из коллективного блога
        
$sBlogUrl $this->sCurrentEvent;
        
$iTopicId $this->GetParamEventMatch(01);
        
$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($sTextSeoConfig::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');
}

Показ топика

EventShowUsers() method
protected void EventShowUsers()
Source Code: /application/classes/actions/ActionBlog.class.php#859 (show)
protected function EventShowUsers()
{
    
$sBlogUrl $this->sCurrentEvent;
    
/**
     * Проверяем есть ли блог с таким УРЛ
     */
    
if (!($oBlog $this->Blog_GetBlogByUrl($sBlogUrl))) {
        return 
parent::EventNotFound();
    }
    
/**
     * Меню
     */
    
$this->sMenuSubItemSelect '';
    
$this->sMenuSubBlogUrl $oBlog->getUrlFull();
    
/**
     * Текущая страница
     */
    
$iPage $this->GetParamEventMatch(12) ? $this->GetParamEventMatch(12) : 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');
}

Страница со списком читателей блога

EventShutdown() method
public void EventShutdown()
Source Code: /application/classes/actions/ActionBlog.class.php#2028 (show)
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);
}

Выполняется при завершении работы экшена

EventTopics() method
protected void EventTopics()
Source Code: /application/classes/actions/ActionBlog.class.php#672 (show)
protected function EventTopics()
{
    
$sPeriod 1// по дефолту 1 день
    
if (in_array(getRequestStr('period'), array(1730'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(02) ? $this->GetParamEventMatch(02) : 1;
    if (
$iPage == and !getRequest('period')) {
        
$this->Viewer_SetHtmlCanonical(Router::GetPath('blog') . $sShowType '/');
    }
    
/**
     * Получаем список топиков
     */
    
$aResult $this->Topic_GetTopicsCollective($iPageConfig::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 == and !getRequest('period')
    ) {
        
$sPeriod 7;
        
$aResult $this->Topic_GetTopicsCollective($iPageConfig::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'], $iPageConfig::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');
}

Показ всех топиков

Init() method
public void Init()
Source Code: /application/classes/actions/ActionBlog.class.php#124 (show)
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'
    
));
}

Инизиализация экшена

RegisterEvent() method
protected void RegisterEvent()
Source Code: /application/classes/actions/ActionBlog.class.php#157 (show)
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');
}

Регистрируем евенты, по сути определяем УРЛы вида /blog/.../

SendBlogInvite() method
protected void SendBlogInvite(ModuleBlog_EntityBlog $oBlog, ModuleUser_EntityUser $oUser)
$oBlog ModuleBlog_EntityBlog
$oUser ModuleUser_EntityUser
Source Code: /application/classes/actions/ActionBlog.class.php#1667 (show)
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($sCodeConfig::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), falsefalse);
    
/**
     * Отправляем пользователю заявку
     */
    
$this->Notify_SendBlogUserInvite(
        
$oUser$this->oUserCurrent$oBlog,
        
Router::GetPath('talk') . 'read/' $oTalk->getId() . '/'
    
);
    
/**
     * Удаляем отправляющего юзера из переписки
     */
    
$this->Talk_DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId());
}

Выполняет отправку приглашения в блог (по внутренней почте и на email)

SubmitComment() method
protected void SubmitComment()
Source Code: /application/classes/actions/ActionBlog.class.php#1189 (show)
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'));
    }
}

Обработка добавление комментария к топику

checkBlogFields() method
protected bool checkBlogFields(ModuleBlog_EntityBlog|null $oBlog=NULL)
$oBlog ModuleBlog_EntityBlog|null
{return} bool
Source Code: /application/classes/actions/ActionBlog.class.php#571 (show)
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'2200)) {
        
$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'250)) {
            
$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'103000)) {
        
$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;
}

Проверка полей блога