/** * Получает список блогов, которые доступны пользователю для заданного действия. * Или проверяет на заданное действие конкретный блог * * @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; }
/** * @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; }