public function EventAjaxChangeOrderFields() { // * Устанавливаем формат ответа E::ModuleViewer()->SetResponseAjax('json'); if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } if (!$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } if (!F::GetRequest('order')) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } if (is_array(F::GetRequest('order'))) { foreach (F::GetRequest('order') as $oOrder) { if (is_numeric($oOrder['order']) && is_numeric($oOrder['id']) && ($oField = E::ModuleTopic()->GetContentFieldById($oOrder['id']))) { $oField->setFieldSort($oOrder['order']); E::ModuleTopic()->UpdateContentField($oField); } } E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('action.admin.save_sort_success')); return; } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } }
/** * Проверяет является ли текущий пользователь администратором * * @param bool $bReturnUser Возвращать или нет объект пользователя * * @return bool|ModuleUser_EntityUser */ public function GetIsAdmin($bReturnUser = false) { if ($this->oUserCurrent and $this->oUserCurrent->isAdministrator()) { return $bReturnUser ? $this->oUserCurrent : true; } return false; }
/** * Авторизовывает юзера * * @param ModuleUser_EntityUser $oUser Объект пользователя * @param bool $bRemember Запоминать пользователя или нет * @param string $sKey Ключ авторизации для куков * @return bool */ public function Authorization(ModuleUser_EntityUser $oUser, $bRemember = true, $sKey = null) { if (!Config::Get('plugin.blacklist.check_authorization') || $oUser && $oUser->isAdministrator() || $oUser && !$this->PluginBlacklist_ModuleBlacklist_blackMail($oUser->getMail(), $oUser->getLogin())) { return parent::Authorization($oUser, $bRemember, $sKey); } $this->Message_AddErrorSingle($this->Lang_Get(Config::Get('plugin.blacklist.check_ip_exact') ? 'plugin.blacklist.user_in_exact_blacklist' : 'plugin.blacklist.user_in_blacklist')); return false; }
/** * @param string $sAction * @param ModuleUser_EntityUser $oUser * @param array $aParams * * @return bool|string */ public function CheckRuleAction($sAction, $oUser, $aParams = array()) { if ($oUser->isAdministrator()) { return true; } // * Проверка на наличие блокировок list($iBlockType, $sBlockTarget) = $this->GetTypeAndTargetByAction($sAction); $xResult = $this->CheckRuleBlock($iBlockType, $sBlockTarget, $oUser, $aParams); if (true !== $xResult) { return $xResult ? $xResult : false; } // * Проверка на запрещающие правила $bSkip = false; $aType = (array) Config::Get('plugin.magicrules.rule_disallow.' . $sAction . '.type'); if ($iBlockType == self::BLOCK_TYPE_VOTE && isset($aParams['vote_value']) && count($aType) && !in_array($this->aVoteMirrow[$aParams['vote_value']], $aType)) { $bSkip = true; } $aGroups = (array) Config::Get('plugin.magicrules.rule_disallow.' . $sAction . '.groups'); if (!$bSkip && count($aGroups)) { $sMsg = $this->_text(Config::Get('plugin.magicrules.rule_disallow.' . $sAction . '.msg')); foreach ($aGroups as $aRule) { $bCheck = true; foreach ($aRule as $sOption => $xValue) { if (!$this->CheckRuleDisallowActionParam($sOption, $xValue, $oUser, $aParams)) { $bCheck = false; break; } } if ($bCheck) { return $sMsg ? $sMsg : false; } } } // * Проверка на разрешающие правила $aGroups = (array) Config::Get('plugin.magicrules.rule_allow.' . $sAction . '.groups'); if (!count($aGroups)) { return true; } $sMsg = $this->_text(Config::Get('plugin.magicrules.rule_allow.' . $sAction . '.msg')); foreach ($aGroups as $aRule) { $bCheck = true; foreach ($aRule as $sOption => $xValue) { if (!$this->CheckRuleActionParam($sOption, $xValue, $oUser, $aParams)) { $bCheck = false; break; } } if ($bCheck) { return true; } } return $sMsg ? $sMsg : false; }
/** * Инициализация * * @return null */ public function Init() { /** * Проверяем авторизован ли юзер */ if (!$this->User_IsAuthorization()) { $this->Message_AddErrorSingle($this->Lang_Get('not_access')); return Router::Action('error'); } /** * Получаем текущего юзера */ $this->oUserCurrent = $this->User_GetUserCurrent(); /** * Проверяем является ли юзер администратором */ if (!$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('not_access')); return Router::Action('error'); } $this->SetDefaultEvent('report'); }
/** * Обработка ajax запроса на удаление вступить в закрытый блог */ protected function AjaxRemoveBlogInvite() { /** * Устанавливаем формат Ajax ответа */ $this->Viewer_SetResponseAjax('json'); $sUserId = getRequestStr('idUser', null, 'post'); $sBlogId = getRequestStr('idBlog', 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))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Пользователь существует и активен? */ if (!($oUser = $this->User_GetUserById($sUserId)) or $oUser->getActivate() != 1) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Проверяем, имеет ли право текущий пользователь добавлять 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) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } $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_user_invite_remove_ok', array('login' => $oUser->getLogin())), $this->Lang_Get('attention')); } else { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); } }
/** * Показ и обработка формы приглаешний * */ protected function EventInvite() { /** * Только при активном режиме инвайтов */ if (!Config::Get('general.reg.invite')) { return parent::EventNotFound(); } $this->sMenuItemSelect = 'invite'; $this->sMenuSubItemSelect = ''; $this->Viewer_AddHtmlTitle($this->Lang_Get('settings_menu_invite')); /** * Если отправили форму */ if (isPost('submit_invite')) { $this->Security_ValidateSendForm(); $bError = false; /** * Есть права на отправку инфайтов? */ if (!$this->ACL_CanSendInvite($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddError($this->Lang_Get('settings_invite_available_no'), $this->Lang_Get('error')); $bError = true; } /** * Емайл корректен? */ if (!func_check(getRequestStr('invite_mail'), 'mail')) { $this->Message_AddError($this->Lang_Get('settings_invite_mail_error'), $this->Lang_Get('error')); $bError = true; } /** * Запускаем выполнение хуков */ $this->Hook_Run('settings_invate_send_before', array('oUser' => $this->oUserCurrent)); /** * Если нет ошибок, то отправляем инвайт */ if (!$bError) { $oInvite = $this->User_GenerateInvite($this->oUserCurrent); $this->Notify_SendInvite($this->oUserCurrent, getRequestStr('invite_mail'), $oInvite); $this->Message_AddNoticeSingle($this->Lang_Get('settings_invite_submit_ok')); $this->Hook_Run('settings_invate_send_after', array('oUser' => $this->oUserCurrent)); } } $this->Viewer_Assign('iCountInviteAvailable', $this->User_GetCountInviteAvailable($this->oUserCurrent)); $this->Viewer_Assign('iCountInviteUsed', $this->User_GetCountInviteUsed($this->oUserCurrent->getId())); // $this->Viewer_Assign('oAceUserProfile', $this->PluginAceadminpanel_Admin_GetUserByLogin($this->oUserProfile->getLogin())); }
/** * Проверяет может ли пользователь создавать запись по времени */ public function CanPostTestimonialTime(ModuleUser_EntityUser $oUser) { // Для администраторов ограничение по времени не действует if ($oUser->isAdministrator() or Config::Get('plugin.testimonials.acl.create.limit_time') == 0 or $oUser->getRating() >= Config::Get('plugin.testimonials.acl.create.limit_time_rating')) { return true; } /** * Проверяем, если топик опубликованный меньше чем acl.create.topic.limit_time секунд назад */ $aTestimonials = $this->PluginTestimonials_Testimonials_GetTestimonialsItemsByFilter(array('#page' => array(1, 20), '#order' => array('id' => 'desc'), 'user_id' => $oUser->getId(), 'date_add >' => date("Y-m-d H:i:s", time() - Config::Get('plugin.testimonials.acl.create.limit_time')))); if (isset($aTestimonials['count']) and $aTestimonials['count'] > 0) { return false; } return true; }
/** * Показ и обработка формы приглаешний * */ protected function EventInvite() { /** * Только при активном режиме инвайтов */ if (!Config::Get('general.reg.invite')) { return parent::EventNotFound(); } $this->sMenuItemSelect = 'invite'; $this->sMenuSubItemSelect = ''; E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('settings_menu_invite')); /** * Если отправили форму */ if (isPost('submit_invite')) { E::ModuleSecurity()->ValidateSendForm(); $bError = false; /** * Есть права на отправку инфайтов? */ if (!E::ModuleACL()->CanSendInvite($this->oUserCurrent) && !$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('settings_invite_available_no'), E::ModuleLang()->Get('error')); $bError = true; } /** * Емайл корректен? */ if (!F::CheckVal(F::GetRequestStr('invite_mail'), 'mail')) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('settings_invite_mail_error'), E::ModuleLang()->Get('error')); $bError = true; } /** * Запускаем выполнение хуков */ E::ModuleHook()->Run('settings_invate_send_before', array('oUser' => $this->oUserCurrent)); /** * Если нет ошибок, то отправляем инвайт */ if (!$bError) { $oInvite = E::ModuleUser()->GenerateInvite($this->oUserCurrent); E::ModuleNotify()->SendInvite($this->oUserCurrent, F::GetRequestStr('invite_mail'), $oInvite); E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('settings_invite_submit_ok')); E::ModuleHook()->Run('settings_invate_send_after', array('oUser' => $this->oUserCurrent)); } } E::ModuleViewer()->Assign('iCountInviteAvailable', E::ModuleUser()->GetCountInviteAvailable($this->oUserCurrent)); E::ModuleViewer()->Assign('iCountInviteUsed', E::ModuleUser()->GetCountInviteUsed($this->oUserCurrent->getId())); }
/** * Обработка ajax-запроса на удаление приглашения подписаться на приватный блог * */ protected function AjaxRemoveBlogInvite() { // Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); $sUserId = F::GetRequestStr('idUser', null, 'post'); $sBlogId = F::GetRequestStr('idBlog', null, 'post'); // Если пользователь не авторизирован, возвращаем ошибку if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } $this->oUserCurrent = E::ModuleUser()->GetUserCurrent(); // Проверяем существование блога if (!($oBlog = E::ModuleBlog()->GetBlogById($sBlogId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $this->oCurrentBlog = $oBlog; // Пользователь существует и активен? $oUser = E::ModuleUser()->GetUserById($sUserId); if (!$oUser || $oUser->getActivate() != 1) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } // Проверяем, имеет ли право текущий пользователь добавлять invite в blog $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId()); $bBlogAdministrator = $oBlogUser ? $oBlogUser->IsBlogAdministrator() : false; if ($oBlog->getOwnerId() != $this->oUserCurrent->getId() && !$this->oUserCurrent->isAdministrator() && !$this->oUserCurrent->isModerator() && !$bBlogAdministrator) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()); if ($oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_INVITE) { // Удаляем связь/приглашение E::ModuleBlog()->DeleteRelationBlogUser($oBlogUser); E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_user_invite_remove_ok', array('login' => $oUser->getLogin())), E::ModuleLang()->Get('attention')); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); } }
/** * Получаем массив идентификаторов блогов, * которые являются закрытыми для пользователя * * @param ModuleUser_EntityUser $oUser * @return array */ public function GetInaccessibleBlogsByUser($oUser = null) { if ($oUser && $oUser->isAdministrator()) { return array(); } $sUserId = $oUser ? $oUser->getId() : 'quest'; if (false === ($aCloseBlogs = $this->Cache_Get("blog_inaccessible_user_{$sUserId}"))) { $aCloseBlogs = array(); $aCloseBlogs = $this->oMapperBlog->GetCloseBlogs(); if ($oUser) { /** * Получаем массив идентификаторов блогов, * которые являются откытыми для данного пользователя */ $aOpenBlogs = array(); $aOpenBlogs = $this->GetBlogUsersByUserId($oUser->getId(), null, true); $aCloseBlogs = array_diff($aCloseBlogs, $aOpenBlogs); } // Сохраняем в кеш if ($oUser) { $this->Cache_Set($aCloseBlogs, "blog_inaccessible_user_{$sUserId}", array('blog_new', 'blog_update', "blog_relation_change_{$oUser->getId()}"), 60 * 60 * 24); } else { $this->Cache_Set($aCloseBlogs, "blog_inaccessible_user_{$sUserId}", array('blog_new', 'blog_update'), 60 * 60 * 24 * 3); } } return $aCloseBlogs; }
/** * Обработка редактирования топика * * @param ModuleTopic_EntityTopic $oTopic * @return mixed */ protected function SubmitEdit($oTopic) { $oTopic->_setValidateScenario('link'); /** * Сохраняем старое значение идентификатора блога */ $sBlogIdOld = $oTopic->getBlogId(); /** * Заполняем поля для валидации */ $oTopic->setBlogId(getRequestStr('blog_id')); $oTopic->setTitle(strip_tags(getRequestStr('topic_title'))); $oTopic->setLinkUrl(getRequestStr('topic_link_url')); $oTopic->setTextSource(getRequestStr('topic_text')); $oTopic->setTags(getRequestStr('topic_tags')); $oTopic->setUserIp(func_getIp()); /** * Проверка корректности полей формы */ if (!$this->checkTopicFields($oTopic)) { return false; } /** * Определяем в какой блог делаем запись */ $iBlogId = $oTopic->getBlogId(); if ($iBlogId == 0) { $oBlog = $this->Blog_GetPersonalBlogByUserId($oTopic->getUserId()); } else { $oBlog = $this->Blog_GetBlogById($iBlogId); } /** * Если блог не определен выдаем предупреждение */ if (!$oBlog) { $this->Message_AddErrorSingle($this->Lang_Get('topic_create_blog_error_unknown'), $this->Lang_Get('error')); return false; } /** * Проверяем права на постинг в блог */ if (!$this->ACL_IsAllowBlog($oBlog, $this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Lang_Get('topic_create_blog_error_noallow'), $this->Lang_Get('error')); return false; } /** * Проверяем разрешено ли постить топик по времени */ if (isPost('submit_topic_publish') and !$oTopic->getPublishDraft() and !$this->ACL_CanPostTopicTime($this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Lang_Get('topic_time_limit'), $this->Lang_Get('error')); return; } /** * Теперь можно смело редактировать топик */ $oTopic->setBlogId($oBlog->getId()); $oTopic->setText($this->Text_Parser($oTopic->getTextSource())); $oTopic->setTextShort($oTopic->getText()); /** * Публикуем или сохраняем в черновиках */ $bSendNotify = false; if (isset($_REQUEST['submit_topic_publish'])) { $oTopic->setPublish(1); if ($oTopic->getPublishDraft() == 0) { $oTopic->setPublishDraft(1); $oTopic->setDateAdd(date("Y-m-d H:i:s")); $bSendNotify = true; } } else { $oTopic->setPublish(0); } /** * Принудительный вывод на главную */ if ($this->ACL_IsAllowPublishIndex($this->oUserCurrent)) { if (getRequest('topic_publish_index')) { $oTopic->setPublishIndex(1); } else { $oTopic->setPublishIndex(0); } } /** * Запрет на комментарии к топику */ $oTopic->setForbidComment(0); if (getRequest('topic_forbid_comment')) { $oTopic->setForbidComment(1); } $this->Hook_Run('topic_edit_before', array('oTopic' => $oTopic, 'oBlog' => $oBlog)); /** * Сохраняем топик */ if ($this->Topic_UpdateTopic($oTopic)) { $this->Hook_Run('topic_edit_after', array('oTopic' => $oTopic, 'oBlog' => $oBlog, 'bSendNotify' => &$bSendNotify)); /** * Обновляем данные в комментариях, если топик был перенесен в новый блог */ if ($sBlogIdOld != $oTopic->getBlogId()) { $this->Comment_UpdateTargetParentByTargetId($oTopic->getBlogId(), 'topic', $oTopic->getId()); $this->Comment_UpdateTargetParentByTargetIdOnline($oTopic->getBlogId(), 'topic', $oTopic->getId()); } /** * Обновляем количество топиков в блоге */ if ($sBlogIdOld != $oTopic->getBlogId()) { $this->Blog_RecalculateCountTopicByBlogId($sBlogIdOld); } $this->Blog_RecalculateCountTopicByBlogId($oTopic->getBlogId()); /** * Добавляем событие в ленту */ $this->Stream_write($oTopic->getUserId(), 'add_topic', $oTopic->getId(), $oTopic->getPublish() && $oBlog->getType() != 'close'); /** * Рассылаем о новом топике подписчикам блога */ if ($bSendNotify) { $this->Topic_SendNotifyTopicNew($oBlog, $oTopic, $this->oUserCurrent); } if (!$oTopic->getPublish() and !$this->oUserCurrent->isAdministrator() and $this->oUserCurrent->getId() != $oTopic->getUserId()) { Router::Location($oBlog->getUrlFull()); } Router::Location($oTopic->getUrl()); } else { $this->Message_AddErrorSingle($this->Lang_Get('system_error')); return Router::Action('error'); } }
/** * Проверяет можно или нет пользователю редактировать пост * * @param object $oPost * @param object $oUser * @return bool */ public function IsAllowEditForumPost($oPost, ModuleUser_EntityUser $oUser) { /** * Разрешаем если это админ сайта */ if ($oUser->isAdministrator()) { return true; } /** * Если модератор форума */ $oModerator = $this->PluginForum_Forum_GetModeratorByForumIdAndUserId($oPost->getTopic()->getForumId(), $oUser->getId()); if ($oModerator && $oModerator->getAllowEditPost()) { return true; } /** * Разрешаем если это автор топика */ if ($oPost->getUserId() == $oUser->getId()) { $sDateComment = strtotime($oPost->getDateAdd()); if ($sDateComment > time() - Config::Get('plugin.forum.acl.edit.post.time')) { return true; } } return false; }
/** * Добавление нового участника разговора (ajax) * */ public function AjaxAddTalkUser() { /** * Устанавливаем формат Ajax ответа */ $this->Viewer_SetResponseAjax('json'); $aUsers = getRequest('users', null, 'post'); $idTalk = getRequestStr('target_id', null, 'post'); /** * Валидация */ if (!is_array($aUsers)) { return $this->EventErrorDebug(); } /** * Если пользователь не авторизирован, возвращаем ошибку */ if (!$this->User_IsAuthorization()) { $this->Message_AddErrorSingle($this->Lang_Get('common.error.need_authorization'), $this->Lang_Get('common.error.error')); return; } /** * Если разговор не найден, или пользователь не является его автором (или админом), возвращаем ошибку */ if (!($oTalk = $this->Talk_GetTalkById($idTalk)) || $oTalk->getUserId() != $this->oUserCurrent->getId() && !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('talk.notices.not_found'), $this->Lang_Get('common.error.error')); return; } /** * Получаем список всех участников разговора */ $aTalkUsers = $oTalk->getTalkUsers(); /** * Получаем список пользователей, которые не принимают письма */ $aUserInBlacklist = $this->Talk_GetBlacklistByTargetId($this->oUserCurrent->getId()); /** * Ограничения на максимальное число участников разговора */ if (count($aTalkUsers) >= Config::Get('module.talk.max_users') and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddError($this->Lang_Get('talk.add.notices.users_error_many'), $this->Lang_Get('common.error.error')); return; } /** * Обрабатываем добавление по каждому переданному логину пользователя */ 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('common.error.error'), 'sMsg' => $this->Lang_Get('user_list_add.notices.error_self')); continue; } if (($oUser = $this->User_GetUserByLogin($sUser)) && $oUser->getActivate() == 1) { if (!in_array($oUser->getId(), $aUserInBlacklist)) { if (array_key_exists($oUser->getId(), $aTalkUsers)) { switch ($aTalkUsers[$oUser->getId()]->getUserActive()) { /** * Если пользователь ранее был удален админом разговора, то добавляем его снова */ case ModuleTalk::TALK_USER_DELETE_BY_AUTHOR: if ($this->Talk_AddTalkUser(Engine::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { $this->Talk_SendNotifyTalkNew($oUser, $this->oUserCurrent, $oTalk); $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('user', $oUser, true); $oViewer->Assign('showActions', true, true); $aResult[] = array('bStateError' => false, 'sMsgTitle' => $this->Lang_Get('common.attention'), 'sMsg' => $this->Lang_Get('user_list_add.notices.success_add', array('login', htmlspecialchars($sUser))), 'user_id' => $oUser->getId(), 'user_login' => $oUser->getLogin(), 'html' => $oViewer->Fetch("component@talk.participants-item")); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('common.error.system.base')); } break; /** * Если пользователь является активным участником разговора, возвращаем ошибку */ /** * Если пользователь является активным участником разговора, возвращаем ошибку */ case ModuleTalk::TALK_USER_ACTIVE: $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('user_list_add.notices.error_already_added', array('login' => htmlspecialchars($sUser)))); break; /** * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление */ /** * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление */ case ModuleTalk::TALK_USER_DELETE_BY_SELF: $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('talk.users.notices.deleted', array('login' => htmlspecialchars($sUser)))); break; default: $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('common.error.system.base')); } } elseif ($this->Talk_AddTalkUser(Engine::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { $this->Talk_SendNotifyTalkNew($oUser, $this->oUserCurrent, $oTalk); $oViewer = $this->Viewer_GetLocalViewer(); $oViewer->Assign('user', $oUser, true); $oViewer->Assign('showActions', true, true); $aResult[] = array('bStateError' => false, 'sMsgTitle' => $this->Lang_Get('common.attention'), 'sMsg' => $this->Lang_Get('user_list_add.notices.success_add', array('login', htmlspecialchars($sUser))), 'user_id' => $oUser->getId(), 'html' => $oViewer->Fetch("component@talk.participants-item")); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('common.error.system.base')); } } else { /** * Добавляем пользователь не принимает сообщения */ $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('talk.blacklist.notices.blocked', array('login' => htmlspecialchars($sUser)))); } } else { /** * Пользователь не найден в базе данных или не активен */ $aResult[] = array('bStateError' => true, 'sMsgTitle' => $this->Lang_Get('common.error.error'), 'sMsg' => $this->Lang_Get('user.notices.not_found', array('login' => htmlspecialchars($sUser)))); } } /** * Передаем во вьевер массив результатов обработки по каждому пользователю */ $this->Viewer_AssignAjax('users', $aResult); }
/** * Проверяет может ли пользователь публиковать на главной * * @param Entity_User $oUser * @return bool */ public function IsAllowPublishIndex(ModuleUser_EntityUser $oUser) { if ($oUser->isAdministrator()) { return true; } return false; }
protected function EventAjaxEdit() { $this->Viewer_SetResponseAjax(); $aTopicRequest = getRequest('topic'); if (!(isset($aTopicRequest['id']) and $oTopic = $this->Topic_GetTopicById($aTopicRequest['id']))) { return $this->EventErrorDebug(); } if (!$this->Topic_IsAllowTopicType($oTopic->getType())) { return $this->EventErrorDebug(); } /** * Проверяем разрешено ли постить топик по времени */ if (!isPost('is_draft') and !$oTopic->getPublishDraft() and !$this->ACL_CanPostTopicTime($this->oUserCurrent)) { $this->Message_AddErrorSingle($this->Lang_Get('topic.add.notices.time_limit'), $this->Lang_Get('common.error.error')); return; } /** * Если права на редактирование */ if (!$this->ACL_IsAllowEditTopic($oTopic, $this->oUserCurrent)) { return $this->EventErrorDebug(); } /** * Сохраняем старое значение идентификатора основного блога и всех блогов */ $sBlogIdOld = $oTopic->getBlogId(); $aBlogsIdOld = $oTopic->getBlogsId(); $oTopic->_setDataSafe(getRequest('topic')); $oTopic->setProperties(getRequest('property')); $oTopic->setUserCreator($this->oUserCurrent); $oTopic->setUserIp(func_getIp()); if (!$oTopic->getTags() or !$oTopic->getTypeObject()->getParam('allow_tags')) { $oTopic->setTags(''); } /** * Публикуем или сохраняем в черновиках */ $bSendNotify = false; if (!isset($_REQUEST['is_draft'])) { $oTopic->setPublish(1); if ($oTopic->getPublishDraft() == 0) { $oTopic->setPublishDraft(1); $oTopic->setDatePublish(date("Y-m-d H:i:s")); $bSendNotify = true; } } else { $oTopic->setPublish(0); } /** * Принудительный вывод на главную */ if ($this->ACL_IsAllowTopicPublishIndex($this->oUserCurrent)) { if (isset($_REQUEST['topic']['topic_publish_index'])) { $oTopic->setPublishIndex(1); } else { $oTopic->setPublishIndex(0); } } /** * Принудительный запрет вывода на главную */ if ($this->ACL_IsAllowTopicSkipIndex($this->oUserCurrent)) { if (isset($_REQUEST['topic']['topic_skip_index'])) { $oTopic->setSkipIndex(1); } else { $oTopic->setSkipIndex(0); } } /** * Запрет на комментарии к топику */ $oTopic->setForbidComment(0); if (isset($_REQUEST['topic']['topic_forbid_comment'])) { $oTopic->setForbidComment(1); } /** * Дата редактирования контента */ $oTopic->setDateEditContent(date('Y-m-d H:i:s')); $this->Hook_Run('topic_edit_validate_before', array('oTopic' => $oTopic)); if ($oTopic->_Validate()) { $oBlog = $oTopic->getBlog(); /** * Получаемый и устанавливаем разрезанный текст по тегу <cut> */ if ($oTopic->getTypeObject()->getParam('allow_text')) { list($sTextShort, $sTextNew, $sTextCut) = $this->Text_Cut($oTopic->getTextSource()); $oTopic->setCutText($sTextCut); // TODO: передача параметров в Topic_Parser пока не используется - нужно заменить на этот вызов все места с парсингом топика $oTopic->setText($this->Topic_Parser($sTextNew, $oTopic)); if ($sTextShort != $sTextNew) { $oTopic->setTextShort($this->Topic_Parser($sTextShort, $oTopic)); } else { $oTopic->setTextShort(''); } } else { $oTopic->setCutText(''); $oTopic->setText(''); $oTopic->setTextShort(''); $oTopic->setTextSource(''); } $this->Hook_Run('topic_edit_before', array('oTopic' => $oTopic, 'oBlog' => $oBlog)); /** * Сохраняем топик */ if ($this->Topic_UpdateTopic($oTopic)) { $this->Hook_Run('topic_edit_after', array('oTopic' => $oTopic, 'oBlog' => $oBlog, 'bSendNotify' => &$bSendNotify)); /** * Обновляем данные в комментариях, если топик был перенесен в новый блог */ if ($sBlogIdOld != $oTopic->getBlogId()) { $this->Comment_UpdateTargetParentByTargetId($oTopic->getBlogId(), 'topic', $oTopic->getId()); $this->Comment_UpdateTargetParentByTargetIdOnline($oTopic->getBlogId(), 'topic', $oTopic->getId()); } /** * Обновляем количество топиков в блоге */ if ($aBlogsIdOld != $oTopic->getBlogsId()) { $this->Blog_RecalculateCountTopicByBlogId($aBlogsIdOld); } $this->Blog_RecalculateCountTopicByBlogId($oTopic->getBlogsId()); /** * Добавляем событие в ленту */ $this->Stream_write($oTopic->getUserId(), 'add_topic', $oTopic->getId(), $oTopic->getPublish() && $oBlog->getType() != 'close'); /** * Рассылаем о новом топике подписчикам блога */ if ($bSendNotify) { $this->Topic_SendNotifyTopicNew($oTopic, $oTopic->getUser()); } if (!$oTopic->getPublish() and !$this->oUserCurrent->isAdministrator() and $this->oUserCurrent->getId() != $oTopic->getUserId()) { $sUrlRedirect = $oBlog->getUrlFull(); } else { $sUrlRedirect = $oTopic->getUrl(); } $this->Viewer_AssignAjax('sUrlRedirect', $sUrlRedirect); $this->Message_AddNotice('Обновление прошло успешно', $this->Lang_Get('common.attention')); } else { $this->Message_AddErrorSingle($this->Lang_Get('common.error.system.base')); } } else { $this->Message_AddError($oTopic->_getValidateError(), $this->Lang_Get('common.error.error')); } }
/** * Получаем массив идентификаторов блогов, которые являются закрытыми для пользователя * * @param ModuleUser_EntityUser|null $oUser Пользователь * @return array */ public function GetInaccessibleBlogsByUser($oUser = null) { if ($oUser && $oUser->isAdministrator()) { return array(); } $sUserId = $oUser ? $oUser->getId() : 'quest'; if (false === ($aCloseBlogs = $this->Cache_Get("blog_inaccessible_user_{$sUserId}"))) { $aCloseBlogs = array_merge($this->oMapperBlog->GetHalfcloseBlogs(), $this->oMapperBlog->GetCloseBlogs()); if ($oUser) { /** * Получаем массив идентификаторов блогов, * которые являются откытыми для данного пользователя */ $aOpenBlogs = $this->GetBlogUsersByUserId($oUser->getId(), null, true); /** * Получаем закрытые блоги, где пользователь является автором */ $aOwnerBlogs = $this->GetBlogsByFilter(array('type' => 'close', 'user_owner_id' => $oUser->getId()), array(), 1, 100, array()); $aOwnerBlogs = array_keys($aOwnerBlogs['collection']); $aCloseBlogs = array_diff($aCloseBlogs, $aOpenBlogs, $aOwnerBlogs); } /** * Сохраняем в кеш */ if ($oUser) { $this->Cache_Set($aCloseBlogs, "blog_inaccessible_user_{$sUserId}", array('blog_new', 'blog_update', "blog_relation_change_{$oUser->getId()}"), 60 * 60 * 24); } else { $this->Cache_Set($aCloseBlogs, "blog_inaccessible_user_{$sUserId}", array('blog_new', 'blog_update'), 60 * 60 * 24 * 3); } } return $aCloseBlogs; }
/** * Добавление нового участника разговора (ajax) * */ public function AjaxAddTalkUser() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); $sUsers = F::GetRequestStr('users', null, 'post'); $idTalk = F::GetRequestStr('idTalk', null, 'post'); // * Если пользователь не авторизирован, возвращаем ошибку if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // * Если разговор не найден, или пользователь не является его автором (или админом), возвращаем ошибку if (!($oTalk = E::ModuleTalk()->GetTalkById($idTalk)) || $oTalk->getUserId() != $this->oUserCurrent->getId() && !$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_not_found'), E::ModuleLang()->Get('error')); return; } // * Получаем список всех участников разговора $aTalkUsers = $oTalk->getTalkUsers(); $aUsers = explode(',', $sUsers); // * Получаем список пользователей, которые не принимают письма $aUserInBlacklist = E::ModuleTalk()->GetBlacklistByTargetId($this->oUserCurrent->getId()); // * Ограничения на максимальное число участников разговора if (count($aTalkUsers) >= Config::Get('module.talk.max_users') && !$this->oUserCurrent->isAdministrator()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_users_error_many'), E::ModuleLang()->Get('error')); return; } // * Обрабатываем добавление по каждому переданному логину пользователя foreach ($aUsers as $sUser) { $sUser = trim($sUser); if ($sUser == '') { continue; } // * Попытка добавить себя if (strtolower($sUser) == strtolower($this->oUserCurrent->getLogin())) { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_self')); continue; } if (($oUser = E::ModuleUser()->GetUserByLogin($sUser)) && $oUser->getActivate() == 1) { if (!in_array($oUser->getId(), $aUserInBlacklist)) { if (array_key_exists($oUser->getId(), $aTalkUsers)) { switch ($aTalkUsers[$oUser->getId()]->getUserActive()) { // * Если пользователь ранее был удален админом разговора, то добавляем его снова case ModuleTalk::TALK_USER_DELETE_BY_AUTHOR: if (E::ModuleTalk()->AddTalkUser(E::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { E::ModuleNotify()->SendTalkNew($oUser, $this->oUserCurrent, $oTalk); $aResult[] = array('bStateError' => false, 'sMsgTitle' => E::ModuleLang()->Get('attention'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_ok', array('login', htmlspecialchars($sUser))), 'sUserId' => $oUser->getId(), 'sUserLogin' => $oUser->getLogin(), 'sUserLink' => $oUser->getUserWebPath(), 'sUserWebPath' => $oUser->getUserWebPath(), 'sUserAvatar48' => $oUser->getAvatarUrl(48)); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } break; // * Если пользователь является активным участником разговора, возвращаем ошибку // * Если пользователь является активным участником разговора, возвращаем ошибку case ModuleTalk::TALK_USER_ACTIVE: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_user_already_exist', array('login' => htmlspecialchars($sUser)))); break; // * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление // * Если пользователь удалил себя из разговора самостоятельно, то блокируем повторное добавление case ModuleTalk::TALK_USER_DELETE_BY_SELF: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_delete_by_self', array('login' => htmlspecialchars($sUser)))); break; default: $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } } elseif (E::ModuleTalk()->AddTalkUser(E::GetEntity('Talk_TalkUser', array('talk_id' => $idTalk, 'user_id' => $oUser->getId(), 'date_last' => null, 'talk_user_active' => ModuleTalk::TALK_USER_ACTIVE)))) { E::ModuleNotify()->SendTalkNew($oUser, $this->oUserCurrent, $oTalk); $aResult[] = array('bStateError' => false, 'sMsgTitle' => E::ModuleLang()->Get('attention'), 'sMsg' => E::ModuleLang()->Get('talk_speaker_add_ok', array('login', htmlspecialchars($sUser))), 'sUserId' => $oUser->getId(), 'sUserLogin' => $oUser->getLogin(), 'sUserLink' => $oUser->getUserWebPath(), 'sUserWebPath' => $oUser->getUserWebPath(), 'sUserAvatar48' => $oUser->getAvatarUrl(48)); $bState = true; } else { $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('system_error')); } } else { // * Добавляем пользователь не принимает сообщения $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('talk_user_in_blacklist', array('login' => htmlspecialchars($sUser)))); } } else { // * Пользователь не найден в базе данных или не активен $aResult[] = array('bStateError' => true, 'sMsgTitle' => E::ModuleLang()->Get('error'), 'sMsg' => E::ModuleLang()->Get('user_not_found', array('login' => htmlspecialchars($sUser)))); } } // * Передаем во вьевер массив результатов обработки по каждому пользователю E::ModuleViewer()->AssignAjax('aUsers', $aResult); }
/** * Проверка на ограничение по времени на постинг на стене * * @param ModuleUser_EntityUser $oUser Пользователь * @param ModuleWall_EntityWall $oWall Объект сообщения на стене * * @return bool */ public function CanAddWallTime($oUser, $oWall) { // * Для администраторов ограничение по времени не действует if ($oUser->isAdministrator() || $oUser->isModerator() || Config::Get('acl.create.wall.limit_time') == 0 || $oUser->getRating() >= Config::Get('acl.create.wall.limit_time_rating')) { return true; } if ($oWall->getUserId() == $oWall->getWallUserId()) { return true; } // * Получаем последнее сообщение $aWall = E::ModuleWall()->GetWall(array('user_id' => $oWall->getUserId()), array('id' => 'desc'), 1, 1, array()); // * Если сообщений нет if ($aWall['count'] == 0) { return true; } $oWallLast = array_shift($aWall['collection']); $sDate = strtotime($oWallLast->getDateAdd()); if ($sDate && time() - $sDate < Config::Get('acl.create.wall.limit_time')) { return false; } return true; }
/** * Проверяет может ли пользователь создавать комментарии к инбоксу по времени * * @param Entity_User $oUser * @return bool */ public function CanPostTalkCommentTime(ModuleUser_EntityUser $oUser) { // Для администраторов ограничение по времени не действует if ($oUser->isAdministrator() or Config::Get('acl.create.talk_comment.limit_time') == 0 or $oUser->getRating() >= Config::Get('acl.create.talk_comment.limit_time_rating')) { return true; } /** * Проверяем, если топик опубликованный меньше чем acl.create.topic.limit_time секунд назад */ $aTalkComments = $this->Comment_GetCommentsByUserId($oUser->getId(), 'talk', 1, 1); /** * Если комментариев не было */ if (!is_array($aTalkComments) or $aTalkComments['count'] == 0) { return true; } $oComment = array_shift($aTalkComments['collection']); $sDate = strtotime($oComment->getDate()); if ($sDate and time() - $sDate < Config::Get('acl.create.talk_comment.limit_time')) { return false; } return true; }
/** * Обработка добавление комментария к топику через ajax */ protected function AjaxAddComment() { $this->Viewer_SetResponseAjax(); $isGuest = false; /** * Проверям авторизован ли пользователь */ if (!$this->User_IsAuthorization()) { $this->oUserCurrent = $this->User_GetUserById(0); $isGuest = true; if (!Config::Get('plugin.guestcomments.enabled')) { $this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error')); return; } if (!func_check(getRequest("guest_name"), "text", 2, 20)) { $this->Message_AddErrorSingle($this->Lang_Get('plugin.guestcomments.error_name'), $this->Lang_Get('error')); return; } if (!func_check(getRequest("guest_email"), "mail")) { $this->Message_AddErrorSingle($this->Lang_Get('plugin.guestcomments.error_mail'), $this->Lang_Get('error')); return; } if (!isset($_SESSION['captcha_keystring']) or $_SESSION['captcha_keystring'] != strtolower(getRequest('captcha'))) { $this->Message_AddErrorSingle($this->Lang_Get('plugin.guestcomments.error_captcha'), $this->Lang_Get('error')); return; } } /** * Проверяем топик */ if (!($oTopic = $this->Topic_GetTopicById(getRequest('cmt_target_id')))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Возможность постить коммент в топик в черновиках */ if (!$oTopic->getPublish() and $this->oUserCurrent->getId() != $oTopic->getUserId() and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Проверяем разрешено ли постить комменты */ if (!$this->ACL_CanPostComment($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_acl'), $this->Lang_Get('error')); return; } /** * Проверяем разрешено ли постить комменты по времени */ if (!$this->ACL_CanPostCommentTime($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_limit'), $this->Lang_Get('error')); return; } /** * Проверяем запрет на добавления коммента автором топика */ if ($oTopic->getForbidComment()) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_notallow'), $this->Lang_Get('error')); return; } /** * Проверяем текст комментария */ if ($isGuest == true) { $sText = nl2br(strip_tags(getRequest('comment_text'))); } else { $sText = $this->Text_Parser(getRequest('comment_text')); } if (!func_check($sText, 'text', 2, 10000)) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_add_text_error'), $this->Lang_Get('error')); return; } /** * Проверям на какой коммент отвечаем */ $sParentId = (int) getRequest('reply'); if (!func_check($sParentId, 'id')) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } $oCommentParent = null; if ($sParentId != 0) { /** * Проверяем существует ли комментарий на который отвечаем */ if (!($oCommentParent = $this->Comment_GetCommentById($sParentId))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Проверяем из одного топика ли новый коммент и тот на который отвечаем */ if ($oCommentParent->getTargetId() != $oTopic->getId()) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } } else { /** * Корневой комментарий */ $sParentId = null; } /** * Проверка на дублирующий коммент */ if ($this->Comment_GetCommentUnique($oTopic->getId(), 'topic', $this->oUserCurrent->getId(), $sParentId, md5($sText))) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_spam'), $this->Lang_Get('error')); return; } /** * Создаём коммент */ $oCommentNew = Engine::GetEntity('Comment'); $oCommentNew->setTargetId($oTopic->getId()); $oCommentNew->setTargetType('topic'); $oCommentNew->setTargetParentId($oTopic->getBlog()->getId()); $oCommentNew->setUserId($this->oUserCurrent->getId()); $oCommentNew->setText($sText); $oCommentNew->setDate(date("Y-m-d H:i:s")); $oCommentNew->setUserIp(func_getIp()); $oCommentNew->setPid($sParentId); $oCommentNew->setTextHash(md5($sText)); $oCommentNew->setPublish($oTopic->getPublish()); if ($this->oUserCurrent->getId() == 0) { $oCommentNew->setGuestName(getRequest("guest_name")); $oCommentNew->setGuestEmail(getRequest("guest_email")); unset($_SESSION['captcha_keystring']); } /** * Добавляем коммент */ $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); /** * Список емайлов на которые не нужно отправлять уведомление */ $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(), 'notify.comment_new.tpl', $this->Lang_Get('notify_subject_comment_new'), 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')); } }
/** * Обработка добавление комментария * * @return bool */ protected function SubmitComment() { /** * Проверям авторизован ли пользователь */ if (!$this->User_IsAuthorization()) { $this->Message_AddErrorSingle($this->Lang_Get('need_authorization'), $this->Lang_Get('error')); return; } /* @var $oImage PluginLsgallery_ModuleImage_EntityImage */ if (!($oImage = $this->PluginLsgallery_Image_GetImageById(getRequest('cmt_target_id')))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /* @var $oAlbum PluginLsgallery_ModuleAlbum_EntityAlbum */ if (!($oAlbum = $this->PluginLsgallery_Album_GetAlbumById($oImage->getAlbumId()))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } if (!$this->ACL_AllowViewAlbumImages($this->oUserCurrent, $oAlbum)) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Проверяем разрешено ли постить комменты */ if (!$this->ACL_CanPostComment($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_acl'), $this->Lang_Get('error')); return; } /** * Проверяем разрешено ли постить комменты по времени */ if (!$this->ACL_CanPostCommentTime($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_limit'), $this->Lang_Get('error')); return; } /** * Проверяем текст комментария */ $sText = $this->Text_Parser(getRequest('comment_text')); if (!func_check($sText, 'text', 2, 10000)) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_add_text_error'), $this->Lang_Get('error')); return; } /** * Проверям на какой коммент отвечаем */ $sParentId = (int) getRequest('reply'); if (!func_check($sParentId, 'id')) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } $oCommentParent = null; if ($sParentId != 0) { /** * Проверяем существует ли комментарий на который отвечаем */ if (!($oCommentParent = $this->Comment_GetCommentById($sParentId))) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } /** * Проверяем из одного топика ли новый коммент и тот на который отвечаем */ if ($oCommentParent->getTargetId() != $oImage->getId()) { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); return; } } else { /** * Корневой комментарий */ $sParentId = null; } /** * Проверка на дублирующий коммент */ if ($this->Comment_GetCommentUnique($oImage->getId(), 'image', $this->oUserCurrent->getId(), $sParentId, md5($sText))) { $this->Message_AddErrorSingle($this->Lang_Get('topic_comment_spam'), $this->Lang_Get('error')); return; } /** * Создаём коммент */ $oCommentNew = Engine::GetEntity('Comment'); $oCommentNew->setTargetId($oImage->getId()); $oCommentNew->setTargetType('image'); $oCommentNew->setTargetParentId($oImage->getAlbumId()); $oCommentNew->setUserId($this->oUserCurrent->getId()); $oCommentNew->setText($sText); $oCommentNew->setDate(date("Y-m-d H:i:s")); $oCommentNew->setUserIp(func_getIp()); $oCommentNew->setPid($sParentId); $oCommentNew->setTextHash(md5($sText)); $oCommentNew->setPublish(1); /** * Добавляем коммент */ $this->Hook_Run('image_comment_add_before', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oImage' => $oImage)); if ($this->Comment_AddComment($oCommentNew)) { $this->Hook_Run('image_comment_add_after', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oImage' => $oImage)); $this->Viewer_AssignAjax('sCommentId', $oCommentNew->getId()); $this->PluginLsgallery_Image_IncreaseImageCountComment($oCommentNew->getTargetId()); $this->oUserCurrent->setDateCommentLast(date("Y-m-d H:i:s")); $this->User_Update($this->oUserCurrent); } else { $this->Message_AddErrorSingle($this->Lang_Get('system_error'), $this->Lang_Get('error')); } }
/** * Возвращает доступные для создания пользователем типы контента * * @param ModuleUser_EntityUser $oUser * * @return ModuleTopic_EntityContentType[] */ public function GetAllowContentTypeByUserId($oUser) { if ($oUser && ($oUser->isAdministrator() || $oUser->isModerator())) { // Для админа и модератора доступны все активные типы контента /** @var ModuleTopic_EntityContentType[] $aContentTypes */ $aContentTypes = E::ModuleTopic()->GetContentTypes(array('content_active' => 1)); return $aContentTypes; } // Получим все блоги пользователя $aBlogs = E::ModuleBlog()->GetBlogsAllowByUser($oUser, false); // Добавим персональный блог пользователю if ($oUser) { $aBlogs[] = E::ModuleBlog()->GetPersonalBlogByUserId($oUser->getId()); } // Получим типы контента /** @var ModuleTopic_EntityContentType[] $aContentTypes */ $aContentTypes = E::ModuleTopic()->GetContentTypes(array('content_active' => 1)); $aAllowContentTypes = array(); /** @var ModuleBlog_EntityBlog $oBlog */ foreach ($aBlogs as $oBlog) { // Пропускаем блог, если в него нельзя добавлять топики if (!E::ModuleACL()->CanAddTopic($oUser, $oBlog)) { continue; } if ($aContentTypes) { foreach ($aContentTypes as $k => $oContentType) { if ($oBlog->IsContentTypeAllow($oContentType->getContentUrl())) { $aAllowContentTypes[] = $oContentType; // Удалим, что бы повторное не проверять, ведь в каком-то // блоге пользвоателя этот тип контента уже разрешён unset($aContentTypes[$k]); } } } } return $aAllowContentTypes; }
/** * Получаем массив идентификаторов блогов, которые являются закрытыми для пользователя * * @param ModuleUser_EntityUser|null $oUser Пользователь * * @return array */ public function GetInaccessibleBlogsByUser($oUser = null) { if ($oUser && ($oUser->isAdministrator() || $oUser->isModerator())) { return array(); } $nUserId = $oUser ? $oUser->getId() : 0; $sCacheKey = 'blog_inaccessible_user_' . $nUserId; if (false === ($aCloseBlogsId = E::ModuleCache()->Get($sCacheKey))) { $aCloseBlogsId = $this->oMapper->GetCloseBlogsId($oUser); if ($oUser) { // * Получаем массив идентификаторов блогов, которые являются откытыми для данного пользователя $aOpenBlogsId = $this->GetBlogUsersByUserId($nUserId, null, true); // * Получаем закрытые блоги, где пользователь является автором $aCloseBlogTypes = $this->GetCloseBlogTypes($oUser); if ($aCloseBlogTypes) { $aOwnerBlogs = $this->GetBlogsByFilter(array('type' => $aCloseBlogTypes, 'user_owner_id' => $nUserId), array(), 1, 1000, array()); $aOwnerBlogsId = array_keys($aOwnerBlogs['collection']); $aCloseBlogsId = array_diff($aCloseBlogsId, $aOpenBlogsId, $aOwnerBlogsId); } } // * Сохраняем в кеш if ($oUser) { E::ModuleCache()->Set($aCloseBlogsId, $sCacheKey, array('blog_new', 'blog_update', "blog_relation_change_{$nUserId}"), 'P1D'); } else { E::ModuleCache()->Set($aCloseBlogsId, $sCacheKey, array('blog_new', 'blog_update'), 'P3D'); } } return $aCloseBlogsId; }
/** * Обработка редактирования топика * * @param ModuleTopic_EntityTopic $oTopic * * @return mixed */ protected function SubmitEdit($oTopic) { $oTopic->_setValidateScenario('topic'); // * Сохраняем старое значение идентификатора блога $iBlogIdOld = $oTopic->getBlogId(); // * Заполняем поля для валидации $iBlogId = F::GetRequestStr('blog_id'); // if blog_id is empty then save blog not changed if (is_numeric($iBlogId)) { $oTopic->setBlogId($iBlogId); } // issue 151 (https://github.com/altocms/altocms/issues/151) // Некорректная обработка названия блога // $oTopic->setTitle(strip_tags(F::GetRequestStr('topic_title'))); $oTopic->setTitle(E::ModuleTools()->RemoveAllTags(F::GetRequestStr('topic_title'))); $oTopic->setTextSource(F::GetRequestStr('topic_text')); if ($this->oContentType->isAllow('link')) { $oTopic->setSourceLink(F::GetRequestStr('topic_field_link')); } $oTopic->setTags(F::GetRequestStr('topic_field_tags')); $oTopic->setUserIp(F::GetUserIp()); if ($this->oUserCurrent && ($this->oUserCurrent->isAdministrator() || $this->oUserCurrent->isModerator())) { if (F::GetRequestStr('topic_url') && $oTopic->getTopicUrl() != F::GetRequestStr('topic_url')) { $sTopicUrl = E::ModuleTopic()->CorrectTopicUrl(F::TranslitUrl(F::GetRequestStr('topic_url'))); $oTopic->setTopicUrl($sTopicUrl); } } // * Проверка корректности полей формы if (!$this->checkTopicFields($oTopic)) { return false; } // * Определяем в какой блог делаем запись $nBlogId = $oTopic->getBlogId(); if ($nBlogId == 0) { $oBlog = E::ModuleBlog()->GetPersonalBlogByUserId($oTopic->getUserId()); } else { $oBlog = E::ModuleBlog()->GetBlogById($nBlogId); } // * Если блог не определен выдаем предупреждение if (!$oBlog) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_unknown'), E::ModuleLang()->Get('error')); return false; } // * Проверяем права на постинг в блог if (!E::ModuleACL()->IsAllowBlog($oBlog, $this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_noallow'), E::ModuleLang()->Get('error')); return false; } // * Проверяем разрешено ли постить топик по времени if (isPost('submit_topic_publish') && !$oTopic->getPublishDraft() && !E::ModuleACL()->CanPostTopicTime($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_time_limit'), E::ModuleLang()->Get('error')); return; } $oTopic->setBlogId($oBlog->getId()); // * Получаемый и устанавливаем разрезанный текст по тегу <cut> list($sTextShort, $sTextNew, $sTextCut) = E::ModuleText()->Cut($oTopic->getTextSource()); $oTopic->setCutText($sTextCut); $oTopic->setText(E::ModuleText()->Parser($sTextNew)); // Получаем ссылки, полученные при парсинге текста $oTopic->setTextLinks(E::ModuleText()->GetLinks()); $oTopic->setTextShort(E::ModuleText()->Parser($sTextShort)); // * Изменяем вопрос/ответы, только если еще никто не голосовал if ($this->oContentType->isAllow('poll') && F::GetRequestStr('topic_field_question') && F::GetRequest('topic_field_answers', array()) && $oTopic->getQuestionCountVote() == 0) { $oTopic->setQuestionTitle(strip_tags(F::GetRequestStr('topic_field_question'))); $oTopic->clearQuestionAnswer(); $aAnswers = F::GetRequest('topic_field_answers', array()); foreach ($aAnswers as $sAnswer) { $sAnswer = trim((string) $sAnswer); if ($sAnswer) { $oTopic->addQuestionAnswer($sAnswer); } } } $aPhotoSetData = E::ModuleMresource()->GetPhotosetData('photoset', $oTopic->getId()); $oTopic->setPhotosetCount($aPhotoSetData['count']); $oTopic->setPhotosetMainPhotoId($aPhotoSetData['cover']); // * Publish or save as a draft $bSendNotify = false; if (isset($_REQUEST['submit_topic_publish'])) { // If the topic has not been published then sets date of show (publication date) if (!$oTopic->getPublish() && !$oTopic->getDateShow()) { $oTopic->setDateShow(F::Now()); } $oTopic->setPublish(1); if ($oTopic->getPublishDraft() == 0) { $oTopic->setPublishDraft(1); $oTopic->setDateAdd(F::Now()); $bSendNotify = true; } } else { $oTopic->setPublish(0); } // * Принудительный вывод на главную if (E::ModuleACL()->IsAllowPublishIndex($this->oUserCurrent)) { if (F::GetRequest('topic_publish_index')) { $oTopic->setPublishIndex(1); } else { $oTopic->setPublishIndex(0); } } // * Запрет на комментарии к топику $oTopic->setForbidComment(F::GetRequest('topic_forbid_comment', 0)); // Если запрет на индексацию не устанавливался вручную, то задаем, как у блога $oBlogType = $oBlog->GetBlogType(); if ($oBlogType && !$oTopic->getIndexIgnoreLock()) { $oTopic->setTopicIndexIgnore($oBlogType->GetIndexIgnore()); } else { $oTopic->setTopicIndexIgnore(false); } $oTopic->setShowPhotoset(F::GetRequest('topic_show_photoset', 0)); E::ModuleHook()->Run('topic_edit_before', array('oTopic' => $oTopic, 'oBlog' => $oBlog)); // * Сохраняем топик if ($this->_updateTopic($oTopic)) { E::ModuleHook()->Run('topic_edit_after', array('oTopic' => $oTopic, 'oBlog' => $oBlog, 'bSendNotify' => &$bSendNotify)); // * Обновляем данные в комментариях, если топик был перенесен в новый блог if ($iBlogIdOld != $oTopic->getBlogId()) { E::ModuleComment()->UpdateTargetParentByTargetId($oTopic->getBlogId(), 'topic', $oTopic->getId()); E::ModuleComment()->UpdateTargetParentByTargetIdOnline($oTopic->getBlogId(), 'topic', $oTopic->getId()); } // * Обновляем количество топиков в блоге if ($iBlogIdOld != $oTopic->getBlogId()) { E::ModuleBlog()->RecalculateCountTopicByBlogId($iBlogIdOld); } E::ModuleBlog()->RecalculateCountTopicByBlogId($oTopic->getBlogId()); // * Добавляем событие в ленту E::ModuleStream()->Write($oTopic->getUserId(), 'add_topic', $oTopic->getId(), $oTopic->getPublish() && (!$oBlogType || !$oBlog->getBlogType()->IsPrivate())); // * Рассылаем о новом топике подписчикам блога if ($bSendNotify) { E::ModuleTopic()->SendNotifyTopicNew($oBlog, $oTopic, $oTopic->getUser()); } if (!$oTopic->getPublish() && !$this->oUserCurrent->isAdministrator() && !$this->oUserCurrent->isModerator() && $this->oUserCurrent->getId() != $oTopic->getUserId()) { R::Location($oBlog->getUrlFull()); } R::Location($oTopic->getUrl()); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); F::SysWarning('System Error'); return R::Action('error'); } }
/** * Is allow view images from album * * @param ModuleUser_EntityUser $oUser * @param PluginLsgallery_ModuleAlbum_EntityAlbum $oAlbum */ public function AllowViewAlbumImages($oUser, $oAlbum) { if ($oAlbum->getType() == PluginLsgallery_ModuleAlbum_EntityAlbum::TYPE_OPEN) { return true; } if (!$oUser) { return false; } if ($oUser->isAdministrator()) { return true; } if ($oUser->getId() == $oAlbum->getUserId()) { return true; } if ($oAlbum->getTitle() == PluginLsgallery_ModuleAlbum_EntityAlbum::TYPE_PERSONAL) { return false; } if ($oAlbum->getType() == PluginLsgallery_ModuleAlbum_EntityAlbum::TYPE_FRIEND) { if ($oFriend = $this->User_GetFriend($oUser->getId(), $oAlbum->getUserId())) { if ($oFriend->getFriendStatus() == ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_ACCEPT || $oFriend->getFriendStatus() == ModuleUser::USER_FRIEND_ACCEPT + ModuleUser::USER_FRIEND_OFFER) { return true; } } } return false; }
/** * Получаем массив идентификаторов блогов, которые являются закрытыми для пользователя * * @param ModuleUser_EntityUser|null $oUser Пользователь * @return array */ public function GetInaccessibleAlbumsByUser($oUser = null) { if ($oUser && $oUser->isAdministrator()) { return array(); } $sUserId = $oUser ? $oUser->getId() : 'guest'; if (false === ($aPrivateAlbums = $this->Cache_Get("album_inaccessible_user_{$sUserId}"))) { $aPrivateAlbums = $this->oMapper->GetCloseAlbums(); if ($oUser) { $aOwnAlbums = $this->GetAlbumsPersonalByUser($oUser->getId()); $aFriendsAlbums = array(); $aFriends = $this->User_GetUsersFriend($this->oUserCurrent->getId()); if ($aFriends['count']) { $aFilter['album_type']['friend'] = array_keys($aFriends['collection']); $aFriendsAlbums = $this->GetAlbumsByFilter($aFilter); $aFriendsAlbums = array_keys($aFriendsAlbums['collection']); } $aOwnAlbums = array_keys($aOwnAlbums['collection']); $aPrivateAlbums = array_diff($aPrivateAlbums, $aOwnAlbums, $aFriendsAlbums); } /** * Сохраняем в кеш */ if ($oUser) { $this->Cache_Set($aPrivateAlbums, "album_inaccessible_user_{$sUserId}", array('album_new', 'album_update', "friend_change_user_{$oUser->getId()}"), 60 * 60 * 24); } else { $this->Cache_Set($aPrivateAlbums, "album_inaccessible_user_{$sUserId}", array('album_new', 'album_update'), 60 * 60 * 24 * 3); } } return $aPrivateAlbums; }