/** * Проверка на ограничение по времени * * @param string $sValue Проверяемое значение * @param array $aParams Параметры * * @return bool|string */ public function ValidateTimeLimit($sValue, $aParams) { if ($oUser = E::ModuleUser()->GetUserById($this->getUserId())) { if (E::ModuleACL()->CanAddWallTime($oUser, $this)) { return true; } } return E::ModuleLang()->Get('wall_add_time_limit'); }
/** * Возвращает доступные для создания пользователем типы контента * * @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; }
/** * Can this blog be read by the user? * * @param ModuleUser_EntityUser $oUser * * @return bool */ public function CanReadBy($oUser) { if ($this->GetBlogType() && $this->GetBlogType()->GetAclRead(ModuleBlog::BLOG_USER_ACL_GUEST)) { // anybody can read blog return true; } return $oUser && E::ModuleACL()->IsAllowShowBlog($this, $oUser); }
/** * Показ и обработка формы приглаешний * */ 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())); }
/** * Права пользователей */ protected function EventUserRights() { $this->sMainMenuItem = 'settings'; $this->_setTitle(E::ModuleLang()->Get('action.admin.userrights_menu')); $this->SetTemplateAction('settings/userrights'); if ($this->IsPost('submit_type_add')) { return $this->_eventUserRightsEditSubmit(); } else { $_REQUEST['userrights_administrator'] = E::ModuleACL()->GetUserRights('blogs', 'administrator'); $_REQUEST['userrights_moderator'] = E::ModuleACL()->GetUserRights('blogs', 'moderator'); } }
/** * Can this topic be deleted by the user? * * @param ModuleUser_EntityUser $oUser * * @return bool */ public function CanDeletedBy($oUser) { return E::ModuleACL()->IsAllowDeleteTopic($this, $oUser); }
/** * Обработка добавление комментария к письму * */ protected function SubmitComment() { // * Проверям авторизован ли пользователь if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return false; } // * Проверяем разговор if (!($oTalk = E::ModuleTalk()->GetTalkById(F::GetRequestStr('cmt_target_id')))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return false; } if (!($oTalkUser = E::ModuleTalk()->GetTalkUser($oTalk->getId(), $this->oUserCurrent->getId()))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return false; } // * Проверяем разрешено ли отправлять инбокс по времени if (!E::ModuleACL()->CanPostTalkCommentTime($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_time_limit'), E::ModuleLang()->Get('error')); return false; } // * Проверяем текст комментария $sText = E::ModuleText()->Parser(F::GetRequestStr('comment_text')); $iMin = intval(Config::Get('module.talk.min_length')); $iMax = intval(Config::Get('module.talk.max_length')); if (!F::CheckVal($sText, 'text', $iMin, $iMax)) { if ($iMax) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_text_error_len', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error')); } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('talk_create_text_error_min', array('min' => $iMin)), E::ModuleLang()->Get('error')); } return false; } // * Проверям на какой коммент отвечаем $sParentId = (int) F::GetRequest('reply'); if (!F::CheckVal($sParentId, 'id')) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return false; } $oCommentParent = null; if ($sParentId != 0) { // * Проверяем существует ли комментарий на который отвечаем if (!($oCommentParent = E::ModuleComment()->GetCommentById($sParentId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return false; } // * Проверяем из одного топика ли новый коммент и тот на который отвечаем if ($oCommentParent->getTargetId() != $oTalk->getId()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return false; } } else { // * Корневой комментарий $sParentId = null; } // * Проверка на дублирующий коммент if (E::ModuleComment()->GetCommentUnique($oTalk->getId(), 'talk', $this->oUserCurrent->getId(), $sParentId, md5($sText))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_comment_spam'), E::ModuleLang()->Get('error')); return false; } // * Создаём комментарий /** @var ModuleComment_EntityComment $oCommentNew */ $oCommentNew = E::GetEntity('Comment'); $oCommentNew->setTargetId($oTalk->getId()); $oCommentNew->setTargetType('talk'); $oCommentNew->setUserId($this->oUserCurrent->getId()); $oCommentNew->setText($sText); $oCommentNew->setDate(F::Now()); $oCommentNew->setUserIp(F::GetUserIp()); $oCommentNew->setPid($sParentId); $oCommentNew->setTextHash(md5($sText)); $oCommentNew->setPublish(1); // * Добавляем коммент E::ModuleHook()->Run('talk_comment_add_before', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTalk' => $oTalk)); if (E::ModuleComment()->AddComment($oCommentNew)) { E::ModuleHook()->Run('talk_comment_add_after', array('oCommentNew' => $oCommentNew, 'oCommentParent' => $oCommentParent, 'oTalk' => $oTalk)); E::ModuleViewer()->AssignAjax('sCommentId', $oCommentNew->getId()); $oTalk->setDateLast(F::Now()); $oTalk->setUserIdLast($oCommentNew->getUserId()); $oTalk->setCommentIdLast($oCommentNew->getId()); $oTalk->setCountComment($oTalk->getCountComment() + 1); E::ModuleTalk()->UpdateTalk($oTalk); // * Отсылаем уведомления всем адресатам $aUsersTalk = E::ModuleTalk()->GetUsersTalk($oTalk->getId(), ModuleTalk::TALK_USER_ACTIVE); foreach ($aUsersTalk as $oUserTalk) { if ($oUserTalk->getId() != $oCommentNew->getUserId()) { E::ModuleNotify()->SendTalkCommentNew($oUserTalk, $this->oUserCurrent, $oTalk, $oCommentNew); } } // * Увеличиваем число новых комментов E::ModuleTalk()->IncreaseCountCommentNew($oTalk->getId(), $oCommentNew->getUserId()); return true; } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); } return false; }
/** * Голосование за пользователя * */ protected function EventVoteUser() { // * Пользователь авторизован? if (!$this->oUserCurrent) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // * Пользователь существует? if (!($oUser = E::ModuleUser()->GetUserById(F::GetRequestStr('idUser', null, 'post')))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } // * Голосует за себя? if ($oUser->getId() == $this->oUserCurrent->getId()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_self'), E::ModuleLang()->Get('attention')); return; } // * Уже голосовал? if ($oUserVote = E::ModuleVote()->GetVote($oUser->getId(), 'user', $this->oUserCurrent->getId())) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_already'), E::ModuleLang()->Get('attention')); return; } // * Имеет право на голосование? if (!E::ModuleACL()->CanVoteUser($this->oUserCurrent, $oUser)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_vote_error_acl'), E::ModuleLang()->Get('attention')); return; } // * Как проголосовал $iValue = F::GetRequestStr('value', null, 'post'); if (!in_array($iValue, array('1', '-1'))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('attention')); return; } // * Голосуем /** @var ModuleVote_EntityVote $oUserVote */ $oUserVote = E::GetEntity('Vote'); $oUserVote->setTarget($oUser); $oUserVote->setTargetId($oUser->getId()); $oUserVote->setTargetType('user'); $oUserVote->setVoter($this->oUserCurrent); $oUserVote->setVoterId($this->oUserCurrent->getId()); $oUserVote->setDirection($iValue); $oUserVote->setDate(F::Now()); if ($iValue != 0) { $nDeltaRating = (double) E::ModuleRating()->VoteUser($this->oUserCurrent, $oUser, $iValue); } else { $nDeltaRating = 0.0; } $oUserVote->setValue($nDeltaRating); $oUser->setCountVote($oUser->getCountVote() + 1); if (E::ModuleVote()->AddVote($oUserVote) && E::ModuleUser()->Update($oUser)) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('user_vote_ok'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('iRating', number_format($oUser->getRating(), Config::Get('view.skill_length'))); E::ModuleViewer()->AssignAjax('iSkill', number_format($oUser->getSkill(), Config::Get('view.rating_length'))); E::ModuleViewer()->AssignAjax('iCountVote', $oUser->getCountVote()); // * Добавляем событие в ленту E::ModuleStream()->Write($oUserVote->getVoterId(), 'vote_user', $oUser->getId()); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } }
/** * Проверяет доступность того или иного целевого объекта, переопределяется * плагинами. По умолчанию всё грузить запрещено. * Если всё нормально и пользователю разрешено сюда загружать картинки, * то метод возвращает целевой объект, иначе значение FALSE. * * @param string $sTarget * @param int $iTargetId * * @return bool */ public function CheckAccessAndGetTarget($sTarget, $iTargetId = null) { // Проверяем право пользователя на прикрепление картинок к топику if (mb_strpos($sTarget, 'single-image-uploader') === 0 || $sTarget == 'photoset') { // Проверям, авторизован ли пользователь if (!E::IsUser()) { return FALSE; } // Топик редактируется if ($oTopic = E::ModuleTopic()->GetTopicById($iTargetId)) { if (!E::ModuleACL()->IsAllowEditTopic($oTopic, E::User())) { return FALSE; } return $oTopic; } return TRUE; } // Загружать аватарки можно только в свой профиль if ($sTarget == 'profile_avatar') { if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) { return E::User(); } return FALSE; } // Загружать аватарки можно только в свой профиль if ($sTarget == 'profile_photo') { if ($iTargetId && E::IsUser() && $iTargetId == E::UserId()) { return E::User(); } return FALSE; } if ($sTarget == 'blog_avatar') { /** @var ModuleBlog_EntityBlog $oBlog */ $oBlog = E::ModuleBlog()->GetBlogById($iTargetId); if (!E::IsUser()) { return false; } if (!$oBlog) { // Блог еще не создан return E::ModuleACL()->CanCreateBlog(E::User()) || E::IsAdminOrModerator(); } if ($oBlog && (E::ModuleACL()->CheckBlogEditBlog($oBlog, E::User()) || E::IsAdminOrModerator())) { return $oBlog; } return ''; } if ($sTarget == 'topic') { if (!E::IsUser()) { return false; } /** @var ModuleTopic_EntityTopic $oTopic */ $oTopic = E::ModuleTopic()->GetTopicById($iTargetId); if (!$oTopic) { // Топик еще не создан return TRUE; } if ($oTopic && (E::ModuleACL()->IsAllowEditTopic($oTopic, E::User()) || E::IsAdminOrModerator())) { return $oTopic; } return ''; } if ($sTarget == 'topic_comment') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oComment */ $oComment = E::ModuleComment()->GetCommentById($iTargetId); if (!$oComment) { // Комментарий еще не создан return TRUE; } if ($oComment && (E::ModuleACL()->CanPostComment(E::User(), $oComment->getTarget()) && E::ModuleAcl()->CanPostCommentTime(E::User()) || E::IsAdminOrModerator())) { return $oComment; } return ''; } if ($sTarget == 'talk_comment') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oComment */ $oComment = E::ModuleComment()->GetCommentById($iTargetId); if (!$oComment) { // Комментарий еще не создан return TRUE; } if ($oComment && (E::ModuleAcl()->CanPostTalkCommentTime(E::User()) || E::IsAdminOrModerator())) { return $oComment; } return ''; } if ($sTarget == 'talk') { if (!E::IsUser()) { return false; } /** @var ModuleComment_EntityComment $oTalk */ $oTalk = E::ModuleTalk()->GetTalkById($iTargetId); if (!$oTalk) { // Комментарий еще не создан return TRUE; } if ($oTalk && (E::ModuleAcl()->CanSendTalkTime(E::User()) || E::IsAdminOrModerator())) { return $oTalk; } return ''; } return FALSE; }
/** * Удаление блога * */ protected function EventDeleteBlog() { E::ModuleSecurity()->ValidateSendForm(); // * Проверяем передан ли в УРЛе номер блога $nBlogId = intval($this->GetParam(0)); if (!$nBlogId || !($oBlog = E::ModuleBlog()->GetBlogById($nBlogId))) { return parent::EventNotFound(); } $this->oCurrentBlog = $oBlog; // * Проверям авторизован ли пользователь if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return R::Action('error'); } // * проверяем есть ли право на удаление блога if (!($nAccess = E::ModuleACL()->IsAllowDeleteBlog($oBlog, $this->oUserCurrent))) { return parent::EventNotFound(); } $aTopics = E::ModuleTopic()->GetTopicsByBlogId($nBlogId); switch ($nAccess) { case ModuleACL::CAN_DELETE_BLOG_EMPTY_ONLY: if (is_array($aTopics) && count($aTopics)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_not_empty'), E::ModuleLang()->Get('error'), true); R::Location($oBlog->getUrlFull()); } break; case ModuleACL::CAN_DELETE_BLOG_WITH_TOPICS: /* * Если указан идентификатор блога для перемещения, * то делаем попытку переместить топики. * * (-1) - выбран пункт меню "удалить топики". */ $nNewBlogId = intval(F::GetRequestStr('topic_move_to')); if ($nNewBlogId > 0 && is_array($aTopics) && count($aTopics)) { if (!($oBlogNew = E::ModuleBlog()->GetBlogById($nNewBlogId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_move_error'), E::ModuleLang()->Get('error'), true); R::Location($oBlog->getUrlFull()); } // * Если выбранный блог является персональным, возвращаем ошибку if ($oBlogNew->getType() == 'personal') { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_admin_delete_move_personal'), E::ModuleLang()->Get('error'), true); R::Location($oBlog->getUrlFull()); } // * Перемещаем топики E::ModuleTopic()->MoveTopics($nBlogId, $nNewBlogId); } break; default: return parent::EventNotFound(); } // * Удаляяем блог и перенаправляем пользователя к списку блогов E::ModuleHook()->Run('blog_delete_before', array('sBlogId' => $nBlogId)); if ($this->_deleteBlog($oBlog)) { E::ModuleHook()->Run('blog_delete_after', array('sBlogId' => $nBlogId)); E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_admin_delete_success'), E::ModuleLang()->Get('attention'), true); R::Location(R::GetPath('blogs')); } else { R::Location($oBlog->getUrlFull()); } }
/** * Получает список блогов, которые доступны пользователю для заданного действия. * Или проверяет на заданное действие конкретный блог * * @param string $sAllow * @param ModuleUser_EntityUser $oUser * @param int|ModuleBlog_EntityBlog $xBlog * @param bool $bCheckOnly * @param bool $bSortByTitle * * @return array|bool */ public function GetBlogsAllowTo($sAllow, $oUser, $xBlog = null, $bCheckOnly = false, $bSortByTitle = true) { /** @var ModuleBlog_EntityBlog $oRequestBlog */ $oRequestBlog = null; if (is_object($xBlog)) { $iRequestBlogId = intval($xBlog->GetId()); $oRequestBlog = $xBlog; } else { $iRequestBlogId = intval($xBlog); } $sCacheKey = 'blogs_allow_to_' . serialize(array($sAllow, $oUser ? $oUser->GetId() : 0, $iRequestBlogId, (bool) $bCheckOnly)); if ($iRequestBlogId && $bCheckOnly) { // Если только проверка прав, то проверяем временный кеш if (is_int($xCacheResult = E::ModuleCache()->Get($sCacheKey, 'tmp'))) { return $xCacheResult; } } if ($oUser->isAdministrator() || $oUser->isModerator()) { // Если админ и если проверка на конкретный блог, то возвращаем без проверки if ($iRequestBlogId) { return $iRequestBlogId; } $aAdditionalData = array('relation_user'); $aAllowBlogs = $this->GetBlogs($aAdditionalData); if ($iRequestBlogId) { return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array(); } if ($bSortByTitle) { $this->_sortByTitle($aAllowBlogs); } return $aAllowBlogs; } if (false === ($aAllowBlogs = E::ModuleCache()->Get($sCacheKey))) { if ($oUser) { // User is owner of the blog if ($oRequestBlog && $oRequestBlog->getOwnerId() == $oUser->getId()) { return $oRequestBlog; } // Блоги, созданные пользователем $aAllowBlogs = $this->GetBlogsByOwnerId($oUser->getId()); if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) { return $aAllowBlogs[$iRequestBlogId]; } // Блоги, в которых состоит пользователь if ($iRequestBlogId) { // Requests one blog $aBlogUsers = $this->GetBlogUsersByArrayBlog($iRequestBlogId, $oUser->getId()); if ($oBlogUser = reset($aBlogUsers)) { if (!$oBlogUser->getBlog()) { if (!$oRequestBlog) { $oRequestBlog = $this->GetBlogById($iRequestBlogId); } $oBlogUser->setBlog($oRequestBlog); } } } else { // Requests any allowed blogs $aBlogUsers = $this->GetBlogUsersByUserId($oUser->getId()); } foreach ($aBlogUsers as $oBlogUser) { /** @var ModuleBlog_EntityBlogType $oBlog */ $oBlog = $oBlogUser->getBlog(); /** @var ModuleBlog_EntityBlogType $oBlogType */ $oBlogType = $oBlog->GetBlogType(); // админа и модератора блога не проверяем if ($oBlogUser->IsBlogAdministrator() || $oBlogUser->IsBlogModerator()) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } elseif ($oBlogUser->getUserRole() !== self::BLOG_USER_ROLE_NOTMEMBER && $oBlogUser->getUserRole() > self::BLOG_USER_ROLE_GUEST) { $bAllow = false; if ($oBlogType) { if ($sAllow == 'write') { $bAllow = $oBlogType->GetAclWrite(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateWrite() <= $oUser->getRating() || E::ModuleACL()->CheckBlogEditContent($oBlog, $oUser); } elseif ($sAllow == 'read') { $bAllow = $oBlogType->GetAclRead(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateRead() <= $oUser->getRating(); } elseif ($sAllow == 'comment') { $bAllow = $oBlogType->GetAclComment(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateComment() <= $oUser->getRating(); } if ($bAllow) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } } } // Если задан конкретный блог и он найден, то проверять больше не нужно if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) { return $aAllowBlogs[$iRequestBlogId]; } } } if ($sAllow == 'write') { // Блоги, в которые можно писать без вступления $aFilter = array('acl_write' => self::BLOG_USER_ACL_USER, 'min_rate_write' => $oUser->GetUserRating()); } elseif ($sAllow == 'read') { // Блоги, которые можно читать без вступления $aFilter = array('acl_read' => self::BLOG_USER_ACL_USER, 'min_rate_read' => $oUser->GetUserRating()); } elseif ($sAllow == 'comment') { // Блоги, в которые можно писать без вступления $aFilter = array('acl_comment' => self::BLOG_USER_ACL_USER, 'min_rate_comment' => $oUser->GetUserRating()); } // Получаем типы блогов if ($aBlogTypes = $this->GetBlogTypes($aFilter, true)) { // Получаем ID блогов $aCriteria = array('filter' => array('blog_type' => $aBlogTypes)); // Получаем ID блогов $aResult = $this->oMapper->GetBlogsIdByCriteria($aCriteria); // Получаем сами блоги if ($aResult['data']) { // если задана только проверка, то сам блог(и) не нужен if ($iRequestBlogId && $bCheckOnly) { return in_array($iRequestBlogId, $aResult['data']); } if ($aBlogs = $this->GetBlogsAdditionalData($aResult['data'], array())) { foreach ($aBlogs as $oBlog) { if (!isset($aAllowBlogs[$oBlog->getId()])) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } } } } } if ($iRequestBlogId) { return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array(); } if ($bSortByTitle) { $this->_sortByTitle($aAllowBlogs); } E::ModuleCache()->Set($aAllowBlogs, $sCacheKey, array('blog_update', 'user_update'), 'P1D'); } if ($iRequestBlogId && $bCheckOnly) { // Если только проверка прав, то сохраняем во временный кеш // Чтоб не было ложных сробатываний, используем в этом кеше числовое значение E::ModuleCache()->Set($sCacheKey, $aAllowBlogs ? 1 : 0, array('blog_update', 'user_update'), 0, 'tmp'); } return $aAllowBlogs; }
/** * AJAX удаление фото * */ protected function EventAjaxPhotoDelete() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // * Проверяем авторизован ли юзер if (!E::ModuleUser()->IsAuthorization()) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error')); return false; } // * Поиск фото по id $oPhoto = E::ModuleTopic()->GetTopicPhotoById($this->GetPost('id')); if ($oPhoto) { if ($oPhoto->getTopicId()) { // * Проверяем права на топик $oTopic = E::ModuleTopic()->GetTopicById($oPhoto->getTopicId()); if ($oTopic && E::ModuleACL()->IsAllowEditTopic($oTopic, $this->oUserCurrent)) { E::ModuleTopic()->DeleteTopicPhoto($oPhoto); // * Если удаляем главную фотографию. топика, то её необходимо сменить if ($oPhoto->getId() == $oTopic->getPhotosetMainPhotoId() && $oTopic->getPhotosetCount() > 1) { $aPhotos = $oTopic->getPhotosetPhotos(0, 1); $oTopic->setPhotosetMainPhotoId($aPhotos[0]->getMresourceId()); } elseif ($oTopic->getPhotosetCount() == 1) { $oTopic->setPhotosetMainPhotoId(null); } $oTopic->setPhotosetCount($oTopic->getPhotosetCount() - 1); E::ModuleTopic()->UpdateTopic($oTopic); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('topic_photoset_photo_deleted'), E::ModuleLang()->Get('attention')); return; } E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } E::ModuleTopic()->DeleteTopicPhoto($oPhoto); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('topic_photoset_photo_deleted'), E::ModuleLang()->Get('attention')); return; } E::ModuleMessage()->AddError(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; }
/** * Возвращает html-код фотосета * * @param $aData * @return bool */ public function SnippetPhotoset($aData) { // Попытаемся определить откуда вызывается сниппет фотосета // поскольку нужно точно определить целевой объект и его ид // Редактируется топик. // Получим его ид. и по нему поднимем необходимый фотосет $aAdminMatches = array(); if (preg_match('~content\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aMatches) || preg_match('~admin\\/content-pages\\/edit\\/(\\d+)\\/~', R::GetControllerPath(), $aAdminMatches)) { // Найдем топик, из которого будем брать фотосет $iTopicId = (int) isset($aData['params']['topic']) ? $aData['params']['topic'] : ($aAdminMatches ? FALSE : $aMatches[1]); // Странно, но топик не нашли - завернём сниппет if (!($oTopic = E::ModuleTopic()->GetTopicById($iTopicId))) { return FALSE; } // Проверим, можно ли пользователю читать этот топик, а то вдруг // он запросил картинки из топика закрытого блога - а так нельзя if (!E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) { return FALSE; } // Попытаемся найти фотосет /** @var ModuleMresource_EntityMresource[] $aPhotos */ if (!(($aPhotos = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $oTopic->getId())) && is_array($aPhotos) && count($aPhotos) > 0)) { return FALSE; } // Фотосет нашли, теперь из него нужно выбрать только те фото, // которые выбрал пользователь в параметрах from и to $iFrom = isset($aData['params']['from']) ? $aData['params']['from'] : 0; $iFrom = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iFrom); // Пользователи считают картинки с первой, а не с нулевой if ($iFrom) { $iFrom -= 1; } // Если указана длина, то правый предел игнорируем if ($iCount = (int) isset($aData['params']['count']) ? $aData['params']['count'] : FALSE) { $iTo = $iFrom + $iCount - 1; } else { $iTo = isset($aData['params']['to']) ? $aData['params']['to'] : count($aPhotos); $iTo = (int) str_replace(array('last', 'first'), array(count($aPhotos), 0), $iTo); if ($iTo) { $iTo -= 1; } } // Пользователь ошибочно указал диапазон. выдумывать ничего не будем, // просто не выведем фотосет if ($iTo - $iFrom < 0) { return FALSE; } // Сбросим ключи набора фото, так лучше считать диапазон $aPhotos = array_values($aPhotos); foreach ($aPhotos as $k => $v) { if ($k < $iFrom || $k > $iTo) { unset($aPhotos[$k]); } } if (!$aPhotos) { return FALSE; } $sPosition = $iTopicId = (int) isset($aData['params']['position']) ? $aData['params']['position'] : 'center'; if (!in_array($sPosition, array('left', 'right'))) { $sPosition = 'center'; } // Получим html-код сниппета $aVars = array('oTopic' => $oTopic, 'aPhotos' => $aPhotos, 'sPosition' => $sPosition, 'sPhotosetHash' => md5(serialize($aData['params']))); $aData['result'] = trim(E::ModuleViewer()->Fetch('tpls/snippets/snippet.photoset.tpl', $aVars)); return $aData['result']; } return FALSE; }
/** * Может ли комментарий быть удален * * @return bool */ public function isDeletable() { if ($this->getTargetType() != 'talk' && ($oUser = E::ModuleUser()->GetUserCurrent())) { if ($oUser->isAdministrator()) { return true; } if (($oBlog = $this->getTargetBlog()) && E::ModuleACL()->CheckBlogDeleteComment($oBlog, $oUser)) { return true; } } return false; }
/** * @param string $sAllow * @param ModuleUser_EntityUser $oUser * @param int|ModuleBlog_EntityBlog $xBlog * @param bool $bCheckOnly * * @return array|bool|mixed|ModuleBlog_EntityBlog[] */ protected function _getBlogsAllowTo($sAllow, $oUser, $xBlog = null, $bCheckOnly = false) { /** @var ModuleBlog_EntityBlog $oRequestBlog */ $oRequestBlog = null; if (is_object($xBlog)) { $iRequestBlogId = intval($xBlog->GetId()); $oRequestBlog = $xBlog; } else { $iRequestBlogId = intval($xBlog); } if ($oUser->isAdministrator() || $oUser->isModerator()) { // Если админ и если проверка на конкретный блог, то возвращаем без проверки if ($iRequestBlogId) { return $iRequestBlogId; } $aAdditionalData = array('relation_user'); $aAllowBlogs = $this->GetBlogs($aAdditionalData); if ($iRequestBlogId) { return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array(); } return $aAllowBlogs; } // User is owner of the blog if ($oRequestBlog && $oRequestBlog->getOwnerId() == $oUser->getId()) { return $oRequestBlog; } // Блоги, созданные пользователем $aAllowBlogs = $this->GetBlogsByOwnerId($oUser->getId()); if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) { return $aAllowBlogs[$iRequestBlogId]; } // Блоги, в которых состоит пользователь if ($iRequestBlogId) { // Requests one blog $aBlogUsers = $this->GetBlogUsersByArrayBlog($iRequestBlogId, $oUser->getId()); if ($oBlogUser = reset($aBlogUsers)) { if (!$oBlogUser->getBlog()) { if (!$oRequestBlog) { $oRequestBlog = $this->GetBlogById($iRequestBlogId); } $oBlogUser->setBlog($oRequestBlog); } } } else { // Requests any allowed blogs $aBlogUsers = $this->GetBlogUsersByUserId($oUser->getId()); } foreach ($aBlogUsers as $oBlogUser) { /** @var ModuleBlog_EntityBlog $oBlog */ $oBlog = $oBlogUser->getBlog(); /** @var ModuleBlog_EntityBlogType $oBlogType */ $oBlogType = $oBlog->GetBlogType(); // админа и модератора блога не проверяем if ($oBlogUser->IsBlogAdministrator() || $oBlogUser->IsBlogModerator()) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } elseif ($oBlogUser->getUserRole() !== self::BLOG_USER_ROLE_NOTMEMBER && $oBlogUser->getUserRole() > self::BLOG_USER_ROLE_GUEST) { $bAllow = false; if ($oBlogType) { if ($sAllow == 'write') { $bAllow = $oBlogType->GetAclWrite(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateWrite() <= $oUser->getRating() || E::ModuleACL()->CheckBlogEditContent($oBlog, $oUser); } elseif ($sAllow == 'read') { $bAllow = $oBlogType->GetAclRead(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateRead() <= $oUser->getRating(); } elseif ($sAllow == 'comment') { $bAllow = $oBlogType->GetAclComment(self::BLOG_USER_ACL_MEMBER) && $oBlogType->GetMinRateComment() <= $oUser->getRating(); } if ($bAllow) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } } } // Если задан конкретный блог и он найден, то проверять больше не нужно if ($iRequestBlogId && isset($aAllowBlogs[$iRequestBlogId])) { return $aAllowBlogs[$iRequestBlogId]; } } $aFilter = array(); if ($sAllow == 'list') { // Blogs which user can list $aFilter['allow_list'] = true; } elseif ($sAllow == 'read') { // Blogs which can be read without subscribing $aFilter = array('acl_read' => self::BLOG_USER_ACL_USER, 'min_rate_read' => $oUser->GetUserRating()); } elseif ($sAllow == 'comment') { // Blogs in which user can comment without subscription $aFilter = array('acl_comment' => self::BLOG_USER_ACL_USER, 'min_rate_comment' => $oUser->GetUserRating()); } elseif ($sAllow == 'write') { // Blogs in which user can write without subscription $aFilter = array('acl_write' => self::BLOG_USER_ACL_USER, 'min_rate_write' => $oUser->GetUserRating()); } // Получаем типы блогов if ($aFilter && ($aBlogTypes = $this->GetBlogTypes($aFilter, true))) { // Получаем ID блогов $aCriteria = array('filter' => array('blog_type' => $aBlogTypes)); // Получаем ID блогов $aResult = $this->oMapper->GetBlogsIdByCriteria($aCriteria); // Получаем сами блоги if ($aResult['data']) { // если задана только проверка, то сам блог(и) не нужен if ($iRequestBlogId && $bCheckOnly) { return in_array($iRequestBlogId, $aResult['data']); } if ($aBlogs = $this->GetBlogsAdditionalData($aResult['data'], array())) { foreach ($aBlogs as $oBlog) { if (!isset($aAllowBlogs[$oBlog->getId()])) { $aAllowBlogs[$oBlog->getId()] = $oBlog; } } } } } if ($iRequestBlogId) { return isset($aAllowBlogs[$iRequestBlogId]) ? $aAllowBlogs[$iRequestBlogId] : array(); } return $aAllowBlogs; }
/** * Обработка добавления в друзья * * @param ModuleUser_EntityUser $oUser * @param string $sUserText * @param ModuleUser_EntityUser $oFriend * * @return bool */ protected function SubmitAddFriend($oUser, $sUserText, $oFriend = null) { /** * Ограничения на добавления в друзья, т.к. приглашение отправляется в личку, то и ограничиваем по ней */ if (!E::ModuleACL()->CanSendTalkTime($this->oUserCurrent)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('user_friend_add_time_limit'), E::ModuleLang()->Get('error')); return false; } /** * Обрабатываем текст заявки */ $sUserText = E::ModuleText()->Parse($sUserText); /** * Создаем связь с другом */ /** @var ModuleUser_EntityFriend $oFriendNew */ $oFriendNew = E::GetEntity('User_Friend'); $oFriendNew->setUserTo($oUser->getId()); $oFriendNew->setUserFrom($this->oUserCurrent->getId()); // Добавляем заявку в друзья $oFriendNew->setStatusFrom(ModuleUser::USER_FRIEND_OFFER); $oFriendNew->setStatusTo(ModuleUser::USER_FRIEND_NULL); $bStateError = $oFriend ? !E::ModuleUser()->UpdateFriend($oFriendNew) : !E::ModuleUser()->AddFriend($oFriendNew); if (!$bStateError) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('user_friend_offer_send'), E::ModuleLang()->Get('attention')); $sTitle = E::ModuleLang()->Get('user_friend_offer_title', array('login' => $this->oUserCurrent->getLogin(), 'friend' => $oUser->getLogin())); F::IncludeLib('XXTEA/encrypt.php'); $sCode = $this->oUserCurrent->getId() . '_' . $oUser->getId(); $sCode = rawurlencode(base64_encode(xxtea_encrypt($sCode, Config::Get('module.talk.encrypt')))); $aPath = array('accept' => R::GetPath('profile') . 'friendoffer/accept/?code=' . $sCode, 'reject' => R::GetPath('profile') . 'friendoffer/reject/?code=' . $sCode); $sText = E::ModuleLang()->Get('user_friend_offer_text', array('login' => $this->oUserCurrent->getLogin(), 'accept_path' => $aPath['accept'], 'reject_path' => $aPath['reject'], 'user_text' => $sUserText)); $oTalk = E::ModuleTalk()->SendTalk($sTitle, $sText, $this->oUserCurrent, array($oUser), false, false); /** * Отправляем пользователю заявку */ E::ModuleNotify()->SendUserFriendNew($oUser, $this->oUserCurrent, $sUserText, R::GetPath('talk') . 'read/' . $oTalk->getId() . '/'); /** * Удаляем отправляющего юзера из переписки */ E::ModuleTalk()->DeleteTalkUserByArray($oTalk->getId(), $this->oUserCurrent->getId()); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); } /** * Подписываем запрашивающего дружбу на */ E::ModuleStream()->SubscribeUser($this->oUserCurrent->getId(), $oUser->getId()); $oViewerLocal = $this->GetViewerLocal(); $oViewerLocal->Assign('oUserFriend', $oFriendNew); E::ModuleViewer()->AssignAjax('sToggleText', $oViewerLocal->Fetch('actions/profile/action.profile.friend_item.tpl')); }