/** * @param int $iBlogId * @param int $iPageNum * @param int $iPageSize * * @return array */ public function getPosts($iBlogId, $iPageNum, $iPageSize) { $sCacheKey = 'api_blog_' . $iBlogId; $oBlog = E::ModuleCache()->GetTmp($sCacheKey); if (!$oBlog) { $oBlog = E::ModuleBlog()->GetBlogById($iBlogId); } $oBlogType = $oBlog->GetBlogType(); if ($oBlogType) { $bCloseBlog = !$oBlog->CanReadBy(E::User()); } else { // if blog type not defined then it' open blog $bCloseBlog = false; } if ($bCloseBlog) { return array(); } $aTopics = E::ModuleTopic()->GetTopicsByBlog($oBlog, $iPageNum, $iPageSize, 'newall', null); $aResult = array('total' => $aTopics['count'], 'list' => array()); /** @var PluginAltoApi_ModuleApiPosts_EntityPost $oTopic */ foreach ($aTopics['collection'] as $oTopic) { $aResult['list'][] = $oTopic->getApiData(); } return $aResult; }
/** * Возвращает сущность типа блога * * @return ModuleBlog_EntityBlogType|null */ public function getBlogType() { $oBlogType = $this->getProp('blog_type_obj'); if (!$oBlogType && ($sType = $this->getType())) { $oBlogType = E::ModuleBlog()->GetBlogTypeByCode($sType); } return $oBlogType; }
/** * Запуск обработки */ public function Exec() { // * Получаем список блогов if ($aResult = E::ModuleBlog()->GetBlogsRating(1, Config::Get('widgets.blogs.params.limit'))) { $aVars = array('aBlogs' => $aResult['collection']); // * Формируем результат в виде шаблона и возвращаем $sTextResult = E::ModuleViewer()->FetchWidget('blogs_top.tpl', $aVars); E::ModuleViewer()->Assign('sBlogsTop', $sTextResult); } }
/** * Фильтр для выборки опубликованых топиков в открытых блогах * * @param string $sFilterName * @param array $aParams * * @return array */ public function GetNamedFilter($sFilterName, $aParams = array()) { if ($sFilterName == 'sitemap') { $aFilter = array('blog_type' => E::ModuleBlog()->GetOpenBlogTypes(), 'topic_publish' => 1, 'topic_index_ignore' => 0); $aFilter['order'][] = 't.topic_date_show DESC'; $aFilter['order'][] = 't.topic_id DESC'; } else { $aFilter = parent::GetNamedFilter($sFilterName, $aParams); } return $aFilter; }
public function Exec() { // For authorized users only if ($oUserCurrent = E::ModuleUser()->GetUserCurrent()) { $aUserSubscribes = E::ModuleUserfeed()->GetUserSubscribes($oUserCurrent->getId()); // Get ID list of blogs to which you subscribe $aBlogsId = E::ModuleBlog()->GetBlogUsersByUserId($oUserCurrent->getId(), array(ModuleBlog::BLOG_USER_ROLE_USER, ModuleBlog::BLOG_USER_ROLE_MODERATOR, ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR), true); // Get ID list of blogs where the user is the owner $aBlogsOwnerId = E::ModuleBlog()->GetBlogsByOwnerId($oUserCurrent->getId(), true); $aBlogsId = array_merge($aBlogsId, $aBlogsOwnerId); $aBlogs = E::ModuleBlog()->GetBlogsAdditionalData($aBlogsId, array('owner' => array()), array('blog_title' => 'asc')); /** * Выводим в шаблон */ E::ModuleViewer()->Assign('aUserfeedSubscribedBlogs', $aUserSubscribes['blogs']); E::ModuleViewer()->Assign('aUserfeedBlogs', $aBlogs); } }
/** * Список коллективных блогов (с кешированием) * * @param integer $iPage * * @return array */ public function GetBlogsForSitemap($iPage = 1) { $sCacheKey = "sitemap_blogs_{$iPage}_" . C::Get('plugin.sitemap.items_per_page'); if (false === ($aData = E::ModuleCache()->Get($sCacheKey))) { $aFilter = array('include_type' => $this->GetOpenBlogTypes()); $aBlogs = E::ModuleBlog()->GetBlogsByFilter($aFilter, $iPage, C::Get('plugin.sitemap.items_per_page'), array('owner' => array())); $aData = array(); /** @var ModuleBlog_EntityBlog $oBlog */ foreach ($aBlogs['collection'] as $oBlog) { // TODO временем последнего изменения блога должно быть время его обновления (публикация последнего топика), $aData[] = E::ModuleSitemap()->GetDataForSitemapRow($oBlog->getLink(), null, C::Get('plugin.sitemap.type.blogs.changefreq'), C::Get('plugin.sitemap.type.blogs.priority')); // @todo страницы блога разбиты на подстраницы. значит нужно генерировать // ссылки на каждую из подстраниц // т.е. тянуть количество топиков блога } E::ModuleCache()->Set($aData, $sCacheKey, array('blog_new'), C::Get('plugin.sitemap.type.blogs.cache_lifetime')); } return $aData; }
/** * Выводим список комментариев * */ protected function EventComments() { // * Передан ли номер страницы $iPage = $this->GetEventMatch(2) ? $this->GetEventMatch(2) : 1; // * Исключаем из выборки идентификаторы закрытых блогов (target_parent_id) $aCloseBlogs = $this->oUserCurrent ? E::ModuleBlog()->GetInaccessibleBlogsByUser($this->oUserCurrent) : E::ModuleBlog()->GetInaccessibleBlogsByUser(); // * Получаем список комментов $aResult = E::ModuleComment()->GetCommentsAll('topic', $iPage, Config::Get('module.comment.per_page'), array(), $aCloseBlogs); $aComments = $aResult['collection']; // * Формируем постраничность $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $iPage, Config::Get('module.comment.per_page'), Config::Get('pagination.pages.count'), R::GetPath('comments')); // * Загружаем переменные в шаблон E::ModuleViewer()->Assign('aPaging', $aPaging); E::ModuleViewer()->Assign('aComments', $aComments); // * Устанавливаем title страницы E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('comments_all')); E::ModuleViewer()->SetHtmlRssAlternate(R::GetPath('rss') . 'allcomments/', E::ModuleLang()->Get('comments_all')); // * Устанавливаем шаблон вывода $this->SetTemplateAction('index'); }
/** * Запуск обработки */ public function Exec() { /** * Пользователь авторизован? */ if ($oUserCurrent = E::ModuleUser()->GetUserCurrent()) { $aUserSubscribes = E::ModuleUserfeed()->GetUserSubscribes($oUserCurrent->getId()); /** * Получаем список ID блогов, в которых состоит пользователь */ $aBlogsId = E::ModuleBlog()->GetBlogUsersByUserId($oUserCurrent->getId(), array(ModuleBlog::BLOG_USER_ROLE_USER, ModuleBlog::BLOG_USER_ROLE_MODERATOR, ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR), true); /** * Получаем список ID блогов, которые создал пользователь */ $aBlogsOwnerId = E::ModuleBlog()->GetBlogsByOwnerId($oUserCurrent->getId(), true); $aBlogsId = array_merge($aBlogsId, $aBlogsOwnerId); $aBlogs = E::ModuleBlog()->GetBlogsAdditionalData($aBlogsId, array('owner' => array()), array('blog_title' => 'asc')); /** * Выводим в шаблон */ E::ModuleViewer()->Assign('aUserfeedSubscribedBlogs', $aUserSubscribes['blogs']); E::ModuleViewer()->Assign('aUserfeedBlogs', $aBlogs); } }
/** * Return total number of pages of the sitemap type * * @param string $sType * * @return int */ protected function _getSitemapCount($sType) { $iPerPage = C::Get('plugin.sitemap.items_per_page'); switch ($sType) { case 'general': $iCount = 1; break; case 'topics': $iCount = (int) ceil(E::ModuleTopic()->GetTopicsCountForSitemap() / $iPerPage); break; case 'blogs': $iCount = (int) ceil(E::ModuleBlog()->GetBlogsCountForSitemap() / $iPerPage); break; case 'users': $iCount = (int) ceil(E::ModuleUser()->GetUsersCountForSitemap() / C::Get('plugin.sitemap.users_per_page')); break; default: $iCount = 1; } return $iCount; }
/** * Get sitemap data for the sitemap data and page * * @param string $sType * @param int $iPage * * @return array */ public function GetDataFor($sType, $iPage) { if ($iPage < 1) { $iPage = 1; } switch ($sType) { case 'general': $aData = $this->getDataForGeneral(); break; case 'topics': $aData = E::ModuleTopic()->GetTopicsForSitemap($iPage); break; case 'blogs': $aData = E::ModuleBlog()->GetBlogsForSitemap($iPage); break; case 'users': $aData = $this->PluginSitemap_User_GetUsersForSitemap($iPage); break; default: $aData = array(); } return $aData; }
/** * Получение сведений о блоге * @param string $aParams Идентификатор пользователя * @return bool|array */ public function ApiBlogIdInfo($aParams) { /** @var ModuleBlog_EntityBlog $oBlog */ if (!($oBlog = E::ModuleBlog()->GetBlogById($aParams['uid']))) { return FALSE; } return $this->_PrepareResult(array('oBlog' => $oBlog), array('id' => $oBlog->getId(), 'title' => $oBlog->getTitle(), 'description' => $oBlog->getDescription(), 'logo' => $oBlog->getAvatarUrl(), 'date' => $oBlog->getDateAdd(), 'users' => $oBlog->getCountUser(), 'topics' => $oBlog->getCountTopic(), 'rating' => $oBlog->getRating(), 'votes' => $oBlog->getCountVote(), 'link' => $oBlog->getUrl(), 'rss' => C::Get('path.root.web') . "rss/blog/{$oBlog->getUrl()}/")); }
/** * Поиск блогов */ public function EventBlogs() { $this->aReq = $this->_prepareRequest('blogs'); $this->OutLog(); if ($this->aReq['regexp']) { $aResult = E::ModuleSearch()->GetBlogsIdByRegexp($this->aReq['regexp'], $this->aReq['iPage'], $this->nItemsPerPage, $this->aReq['params']); $aBlogs = array(); if ($aResult['count'] > 0) { // * Получаем объекты по списку идентификаторов $aBlogs = E::ModuleBlog()->GetBlogsAdditionalData($aResult['collection']); //подсветка поисковой фразы foreach ($aBlogs as $oBlog) { if ($this->nModeOutList != 'snippet') { $oBlog->setDescription($this->_textHighlite($oBlog->getDescription())); } else { $oBlog->setDescription($this->_makeSnippet($oBlog->getDescription())); } } } } else { $aResult['count'] = 0; $aBlogs = array(); } // * Логгируем результаты, если требуется if ($this->bLogEnable) { $this->oLogs->RecordAdd('search', array('q' => $this->aReq['q'], 'result' => 'blogs:' . $aResult['count'])); $this->oLogs->RecordEnd('search', true); } $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $this->aReq['iPage'], $this->nItemsPerPage, 4, Config::Get('path.root.url') . '/search/blogs', array('q' => $this->aReq['q'])); $this->SetTemplateAction('results'); // * Отправляем данные в шаблон E::ModuleViewer()->AddHtmlTitle($this->aReq['q']); E::ModuleViewer()->Assign('bIsResults', $aResult['count']); E::ModuleViewer()->Assign('aRes', $aResult); E::ModuleViewer()->Assign('aBlogs', $aBlogs); E::ModuleViewer()->Assign('aPaging', $aPaging); }
/** * Возвращает личный блог пользователя * * @return ModuleBlog_EntityBlog|null */ public function getBlog() { if (!$this->getProp('blog')) { $this->_aData['blog'] = E::ModuleBlog()->GetPersonalBlogByUserId($this->getId()); } return $this->getProp('blog'); }
/** * Удаление пользователей * * @param $aUsersId */ public function DeleteUsers($aUsersId) { if (!is_array($aUsersId)) { $aUsersId = array(intval($aUsersId)); } E::ModuleBlog()->DeleteBlogsByUsers($aUsersId); E::ModuleTopic()->DeleteTopicsByUsersId($aUsersId); if ($bResult = $this->oMapper->DeleteUser($aUsersId)) { $this->DeleteUserFieldValues($aUsersId, $aType = null); $aUsers = $this->GetUsersByArrayId($aUsersId); foreach ($aUsers as $oUser) { $this->DeleteAvatar($oUser); $this->DeletePhoto($oUser); } } foreach ($aUsersId as $nUserId) { E::ModuleCache()->CleanByTags(array("topic_update_user_{$nUserId}")); E::ModuleCache()->Delete("user_{$nUserId}"); } return $bResult; }
/** * Перемещает топики в другой блог * * @param $nBlogIdNew * @param $aFilter * * @return bool */ public function MoveTopicsByFilter($nBlogIdNew, $aFilter) { if (!isset($aFilter['blog_id']) && !isset($aFilter['topic_id'])) { return false; } if (isset($aFilter['blog_id']) && !is_array($aFilter['blog_id'])) { $aFilter['blog_id'] = array($aFilter['blog_id']); } if (isset($aFilter['topic_id']) && !is_array($aFilter['topic_id'])) { $aFilter['topic_id'] = array($aFilter['topic_id']); } $oBlogType = E::ModuleBlog()->GetBlogTypeById($nBlogIdNew); if ($oBlogType) { $nIndexIgnore = $oBlogType->getIndexIgnore(); } else { $nIndexIgnore = 0; } $sql = "UPDATE ?_topic\n SET\n blog_id = ?d,\n topic_index_ignore = CASE WHEN topic_index_ignore = ?d THEN topic_index_ignore ELSE ?d END\n WHERE\n 1 = 1\n { AND (blog_id IN (?a)) }\n { AND (topic_id IN(?a)) }\n "; $bResult = $this->oDb->query($sql, $nBlogIdNew, ModuleTopic_EntityTopic::INDEX_IGNORE_LOCK, $nIndexIgnore, isset($aFilter['blog_id']) ? $aFilter['blog_id'] : DBSIMPLE_SKIP, isset($aFilter['topic_id']) ? $aFilter['topic_id'] : DBSIMPLE_SKIP); return $bResult !== false; }
/** * Подключение/отключение к блогу * */ protected function AjaxBlogJoin() { // Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); // Пользователь авторизован? if (!$this->oUserCurrent) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // Блог существует? $nBlogId = intval(F::GetRequestStr('idBlog', null, 'post')); if (!$nBlogId || !($oBlog = E::ModuleBlog()->GetBlogById($nBlogId))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } $this->oCurrentBlog = $oBlog; // Type of the blog $oBlogType = $oBlog->getBlogType(); // Current status of user in the blog /** @var ModuleBlog_EntityBlogUser $oBlogUser */ $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $this->oUserCurrent->getId()); if (!$oBlogUser || $oBlogUser->getUserRole() < ModuleBlog::BLOG_USER_ROLE_GUEST && (!$oBlogType || $oBlogType->IsPrivate())) { // * Проверяем тип блога на возможность свободного вступления или вступления по запросу if ($oBlogType && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE) && !$oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_invite'), E::ModuleLang()->Get('error')); return; } if ($oBlog->getOwnerId() != $this->oUserCurrent->getId()) { // Subscribe user to the blog if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) { $bResult = false; if ($oBlogUser) { $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER); $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser); } elseif ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_FREE)) { // User can free subscribe to blog /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */ $oBlogUserNew = E::GetEntity('Blog_BlogUser'); $oBlogUserNew->setBlogId($oBlog->getId()); $oBlogUserNew->setUserId($this->oUserCurrent->getId()); $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_USER); $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew); } if ($bResult) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_ok'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); // Увеличиваем число читателей блога $oBlog->setCountUser($oBlog->getCountUser() + 1); E::ModuleBlog()->UpdateBlog($oBlog); E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser()); // Добавляем событие в ленту E::ModuleStream()->Write($this->oUserCurrent->getId(), 'join_blog', $oBlog->getId()); // Добавляем подписку на этот блог в ленту пользователя E::ModuleUserfeed()->SubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId()); } else { $sMsg = $oBlogType->IsPrivate() ? E::ModuleLang()->Get('blog_join_error_invite') : E::ModuleLang()->Get('system_error'); E::ModuleMessage()->AddErrorSingle($sMsg, E::ModuleLang()->Get('error')); return; } } // Подписываем по запросу if ($oBlogType->GetMembership(ModuleBlog::BLOG_USER_JOIN_REQUEST)) { // Подписка уже была запрошена, но результатов пока нет if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_already'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } if ($oBlogUser) { if (!in_array($oBlogUser->getUserRole(), array(ModuleBlog::BLOG_USER_ROLE_REJECT, ModuleBlog::BLOG_USER_ROLE_WISHES))) { $sMessage = E::ModuleLang()->Get('blog_user_status_is') . ' "' . E::ModuleBlog()->GetBlogUserRoleName($oBlogUser->getUserRole()) . '"'; E::ModuleMessage()->AddNoticeSingle($sMessage, E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } else { $oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES); $bResult = E::ModuleBlog()->UpdateRelationBlogUser($oBlogUser); } } else { // Подписки ещё не было - оформим ее /** @var ModuleBlog_EntityBlogUser $oBlogUserNew */ $oBlogUserNew = E::GetEntity('Blog_BlogUser'); $oBlogUserNew->setBlogId($oBlog->getId()); $oBlogUserNew->setUserId($this->oUserCurrent->getId()); $oBlogUserNew->setUserRole(ModuleBlog::BLOG_USER_ROLE_WISHES); $bResult = E::ModuleBlog()->AddRelationBlogUser($oBlogUserNew); } if ($bResult) { // Отправим сообщение модераторам и администраторам блога о том, что // этот пользоватлеь захотел присоединиться к нашему блогу $aBlogUsersResult = E::ModuleBlog()->GetBlogUsersByBlogId($oBlog->getId(), array(ModuleBlog::BLOG_USER_ROLE_MODERATOR, ModuleBlog::BLOG_USER_ROLE_ADMINISTRATOR), null); if ($aBlogUsersResult) { /** @var ModuleUser_EntityUser[] $aBlogModerators */ $aBlogModerators = array(); /** @var ModuleBlog_EntityBlogUser $oCurrentBlogUser */ foreach ($aBlogUsersResult['collection'] as $oCurrentBlogUser) { $aBlogModerators[] = $oCurrentBlogUser->getUser(); } // Добавим владельца блога к списку $aBlogModerators = array_merge($aBlogModerators, array($oBlog->getOwner())); $this->SendBlogRequest($oBlog, $aBlogModerators, $this->oUserCurrent); } E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_send'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } } } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_join_error_self'), E::ModuleLang()->Get('attention')); return; } } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_MEMBER) { // Unsubscribe user from the blog if (E::ModuleBlog()->DeleteRelationBlogUser($oBlogUser)) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_leave_ok'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', false); // Уменьшаем число читателей блога $oBlog->setCountUser($oBlog->getCountUser() - 1); E::ModuleBlog()->UpdateBlog($oBlog); E::ModuleViewer()->AssignAjax('iCountUser', $oBlog->getCountUser()); // Удаляем подписку на этот блог в ленте пользователя E::ModuleUserfeed()->UnsubscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId()); return; } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'), E::ModuleLang()->Get('error')); return; } } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_NOTMEMBER) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_user_request_no_accept'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_BAN_FOR_COMMENT) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('blog_leave_error_banned'), E::ModuleLang()->Get('error')); return; } if ($oBlogUser && $oBlogUser->getUserRole() == ModuleBlog::BLOG_USER_ROLE_WISHES) { E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('blog_join_request_leave'), E::ModuleLang()->Get('attention')); E::ModuleViewer()->AssignAjax('bState', true); return; } }
/** * Returns blog object of the topic * * @return ModuleBlog_EntityBlog|null */ public function getBlog() { $oBlog = $this->getProp('blog'); if (!$oBlog) { $iBlogId = $this->getBlogId(); if ($iBlogId) { $oBlog = E::ModuleBlog()->GetBlogById($iBlogId); } elseif ($iBlogId === 0 || $iBlogId === '0') { $oUser = $this->getUser(); $oBlog = $oUser->getBlog(); } $this->setProp('blog', $oBlog); } return $oBlog; }
/** * Получает топики пользователя с картинками * * @param int $iUserId * @param string $sType * @param int $iPage * @param int $iPerPage * * @return array */ public function GetTopicsPageByType($iUserId, $sType, $iPage, $iPerPage) { $iCount = 0; $aFilter = array('user_id' => $iUserId, 'mresource_type' => ModuleMresource::TYPE_IMAGE | ModuleMresource::TYPE_PHOTO | ModuleMresource::TYPE_PHOTO_PRIMARY, 'target_type' => array('photoset', 'topic')); if (E::IsUser() && E::User() !== $iUserId) { // Если текущий юзер не совпадает с запрашиваемым, то получаем список доступных блогов $aFilter['blogs_id'] = E::ModuleBlog()->GetAccessibleBlogsByUser(E::User()); // И топики должны быть опубликованы $aFilter['topic_publish'] = 1; } if (!E::IsUser()) { // Если юзер не авторизован, то считаем все доступные для индексации топики $aFilter['topic_index_ignore'] = 0; } $aFilter['topic_type'] = $sType; $aTopicInfo = $this->oMapper->GetTopicInfo($aFilter, $iCount, $iPage, $iPerPage); if ($aTopicInfo) { $aFilter = array('topic_id' => array_keys($aTopicInfo), 'topic_type' => $sType); // Результат в формате array('collection'=>..., 'count'=>...) $aResult = E::ModuleTopic()->GetTopicsByFilter($aFilter, 1, count($aTopicInfo)); if ($aResult) { /** @var ModuleTopic_EntityTopic $oTopic */ foreach ($aResult['collection'] as $sTopicId => $oTopic) { $oTopic->setImagesCount($aTopicInfo[$sTopicId]); $aResult['collection'][$sTopicId] = $oTopic; } $aResult['count'] = $iCount; // total number of topics with images } return $aResult; } return array('collection' => array(), 'count' => 0); }
/** * Обработчик формирования меню в режиме blogs * * @param string[] $aFillSet Набор элементов меню * @param array $aMenu Само меню * @return array */ public function ProcessBlogsMode($aFillSet, $aMenu = NULL) { /** @var ModuleMenu_EntityItem[] $aItems */ $aItems = array(); /** @var ModuleBlog_EntityBlog[] $aBlogs */ $aBlogs = array(); if ($aFillSet) { $aBlogs = E::ModuleBlog()->GetBlogsByUrl($aFillSet['items']); } else { if ($aResult = E::ModuleBlog()->GetBlogsRating(1, $aFillSet['limit'])) { $aBlogs = $aResult['collection']; } } if ($aBlogs) { foreach ($aBlogs as $oBlog) { $aItems[$oBlog->getUrl()] = $this->CreateMenuItem($oBlog->getUrl(), array('title' => $oBlog->getTitle(), 'link' => $oBlog->getUrlFull(), 'active' => (Config::Get('router.rewrite.blog') ? Config::Get('router.rewrite.blog') : 'blog') . '.' . $oBlog->getUrl(), 'submenu' => array(), 'on' => array('{*}'), 'off' => NULL, 'display' => TRUE, 'options' => array('image_url' => $oBlog->getAvatarUrl(Config::Get('module.menu.blog_logo_size'))))); } } return $aItems; }
/** * Вспомогательный метод проверки прав пользователя блога * * @param ModuleBlog_EntityBlog $oBlog * @param ModuleUser_EntityUser $oUser * @param string $sRights * * @return bool */ protected function _checkBlogUserRights($oBlog, $oUser, $sRights) { $sUserRole = ''; $bCurrentUser = false; $bResult = false; if (!$oBlog) { return false; } // Если пользователь не передан, то берется текущий if (!$oUser) { if ($oUser = E::ModuleUser()->GetUserCurrent()) { $bCurrentUser = true; } else { return false; } } elseif (E::ModuleUser()->GetUserCurrent() && E::ModuleUser()->GetUserCurrent()->getId() == $oUser->getId()) { $bCurrentUser = true; } $sCacheKey = 'acl_blog_user_rights' . serialize(array($oBlog->GetId(), $oUser ? $oUser->GetId() : 0, $bCurrentUser, $sRights)); // Сначала проверяем кеш if (is_int($xCacheResult = E::ModuleCache()->Get($sCacheKey, 'tmp'))) { return $xCacheResult; } if ($bCurrentUser) { // Blog owner has any rights if ($oBlog->getUserOwnerId() == $oUser->getId()) { return true; } // * Для авторизованного пользователя данный код будет работать быстрее if ($oBlog->getUserIsAdministrator()) { $sUserRole = 'administrator'; } elseif ($oBlog->getUserIsModerator()) { $sUserRole = 'moderator'; } } else { $oBlogUser = E::ModuleBlog()->GetBlogUserByBlogIdAndUserId($oBlog->getId(), $oUser->getId()); if ($oBlogUser) { if ($oBlogUser->IsBlogAdministrator()) { $sUserRole = 'administrator'; } elseif ($oBlogUser->IsBlogModerator()) { $sUserRole = 'moderator'; } } } if ($sUserRole) { $aUserRights = $this->GetUserRights('blogs', $sUserRole); $bResult = isset($aUserRights[$sRights]) && (bool) $aUserRights[$sRights]; } E::ModuleCache()->Set($sCacheKey, $bResult ? 1 : 0, array('blog_update', 'user_update'), 0, 'tmp'); return $bResult; }
/** * @param int|object $oUserId * * @return bool */ public function DelUser($oUserId) { if (is_object($oUserId)) { $nUserId = $oUserId->getId(); } else { $nUserId = intval($oUserId); } // Удаляем блоги $aBlogsId = E::ModuleBlog()->GetBlogsByOwnerId($nUserId, true); if ($aBlogsId) { E::ModuleBlog()->DeleteBlog($aBlogsId); } $oBlog = E::ModuleBlog()->GetPersonalBlogByUserId($nUserId); if ($oBlog) { E::ModuleBlog()->DeleteBlog($oBlog->getId()); } // Удаляем переписку $iPerPage = 10000; do { $aTalks = E::ModuleTalk()->GetTalksByFilter(array('user_id' => $nUserId), 1, $iPerPage); if ($aTalks['count']) { $aTalksId = array(); foreach ($aTalks['collection'] as $oTalk) { $aTalksId[] = $oTalk->getId(); } if ($aTalksId) { E::ModuleTalk()->DeleteTalkUserByArray($aTalksId, $nUserId); } } } while ($aTalks['count'] > $iPerPage); $bOk = $this->oMapper->DelUser($nUserId); // Слишком много взаимосвязей, поэтому просто сбрасываем кеш E::ModuleCache()->Clean(); return $bOk; }
/** * Обработка получения подключенных блогов * Используется в блоке "TOP блогов" * */ protected function EventBlogsJoin() { // * Пользователь авторизован? if (!$this->oUserCurrent) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('need_authorization'), E::ModuleLang()->Get('error')); return; } // * Получаем список блогов и формируем ответ if ($aBlogs = E::ModuleBlog()->GetBlogsRatingJoin($this->oUserCurrent->getId(), Config::Get('widgets.blogs.params.limit'))) { $aVars = array('aBlogs' => $aBlogs); // Рендерим шаблон виджета $sTextResult = E::ModuleViewer()->FetchWidget('blogs_top.tpl', $aVars); E::ModuleViewer()->AssignAjax('sText', $sTextResult); } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('widget_blogs_join_error'), E::ModuleLang()->Get('attention')); return; } }
/** * Проверка полей блога * * @param ModuleBlog_EntityBlog|null $oBlog * * @return bool */ protected function checkBlogFields($oBlog = null) { $bOk = true; // * Проверяем есть ли название блога if (!F::CheckVal(F::GetRequestStr('blog_title'), 'text', 2, 200)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error'), E::ModuleLang()->Get('error')); $bOk = false; } else { // * Проверяем есть ли уже блог с таким названием if ($oBlogExists = E::ModuleBlog()->GetBlogByTitle(F::GetRequestStr('blog_title'))) { if (!$oBlog || $oBlog->getId() != $oBlogExists->getId()) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error_unique'), E::ModuleLang()->Get('error')); $bOk = false; } } } return $bOk; }
/** * @param $nVal */ protected function _eventBlogTypeSetActive($nVal) { $aBlogTypes = $this->GetPost('blogtype_sel'); if (is_array($aBlogTypes) && count($aBlogTypes)) { $aBlogTypes = array_keys($aBlogTypes); foreach ($aBlogTypes as $nBlogTypeId) { $oBlogType = E::ModuleBlog()->GetBlogTypeById($nBlogTypeId); if ($oBlogType) { $oBlogType->SetActive($nVal); E::ModuleBlog()->UpdateBlogType($oBlogType); } } } R::Location('admin/settings-blogtypes'); }
/** * Отображение списка персональных блогов */ protected function EventShowBlogsPersonal() { // * По какому полю сортировать $sOrder = F::GetRequestStr('order', 'blog_title'); // * В каком направлении сортировать $sOrderWay = F::GetRequestStr('order_way', 'desc'); // * Фильтр поиска блогов $aFilter = array('include_type' => 'personal'); // * Передан ли номер страницы $iPage = preg_match('/^\\d+$/i', $this->GetParamEventMatch(0, 2)) ? $this->GetParamEventMatch(0, 2) : 1; // * Получаем список блогов $aResult = E::ModuleBlog()->GetBlogsByFilter($aFilter, array($sOrder => $sOrderWay), $iPage, Config::Get('module.blog.per_page')); $aBlogs = $aResult['collection']; // * Формируем постраничность $aPaging = E::ModuleViewer()->MakePaging($aResult['count'], $iPage, Config::Get('module.blog.per_page'), Config::Get('pagination.pages.count'), R::GetPath('blogs') . 'personal/', array('order' => $sOrder, 'order_way' => $sOrderWay)); // * Загружаем переменные в шаблон E::ModuleViewer()->Assign('aPaging', $aPaging); E::ModuleViewer()->Assign('aBlogs', $aBlogs); E::ModuleViewer()->Assign('sBlogOrder', htmlspecialchars($sOrder)); E::ModuleViewer()->Assign('sBlogOrderWay', htmlspecialchars($sOrderWay)); E::ModuleViewer()->Assign('sBlogOrderWayNext', $sOrderWay == 'desc' ? 'asc' : 'desc'); E::ModuleViewer()->Assign('sShow', 'personal'); E::ModuleViewer()->Assign('sBlogsRootPage', R::GetPath('blogs') . 'personal/'); // * Устанавливаем title страницы E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('blog_menu_all_list')); // * Устанавливаем шаблон вывода $this->SetTemplateAction('index'); }
/** * Получает список блогов * * @param array $aIds Список ID блогов * * @return array */ protected function loadRelatedBlog($aIds) { return E::ModuleBlog()->GetBlogsAdditionalData($aIds); }
/** * @return null|string */ protected function RssPersonalBlog() { $sUserLogin = $this->GetParam(0); $aParams = $this->GetParams(); array_shift($aParams); if ($iMaxItems = intval(C::Get('module.topic.max_rss_count'))) { C::Set('module.topic.per_page', $iMaxItems); } $oUser = E::ModuleUser()->GetUserByLogin($sUserLogin); if ($oUser && ($oBlog = E::ModuleBlog()->GetPersonalBlogByUserId($oUser->getId()))) { E::ModuleHook()->AddHandler('action_after', array($this, 'ShowRssBlog')); return R::Action('blog', $oBlog->getId(), $aParams); } else { $this->_displayEmptyRss(); } return null; }
/** * Получает URL цели * * @param string $sTargetType * @param int $iTargetId * * @return string */ public function GetTargetUrl($sTargetType, $iTargetId) { if (mb_strpos($sTargetType, 'single-image-uploader') === 0 || $sTargetType == 'photoset' || $sTargetType == 'topic') { /** @var ModuleTopic_EntityTopic $oTopic */ if (!($oTopic = E::ModuleTopic()->GetTopicById($iTargetId))) { return ''; } return $oTopic->getUrl(); } if ($sTargetType == 'profile_avatar') { return R::GetPath('settings'); } if ($sTargetType == 'profile_photo') { return R::GetPath('settings'); } if ($sTargetType == 'blog_avatar') { /** @var ModuleBlog_EntityBlog $oBlog */ $oBlog = E::ModuleBlog()->GetBlogById($iTargetId); if ($oBlog) { return $oBlog->getUrlFull(); } return ''; } return ''; }
/** * Рассылает уведомления о новом топике подписчикам блога * * @param ModuleBlog_EntityBlog $oBlog Объект блога * @param ModuleTopic_EntityTopic $oTopic Объект топика * @param ModuleUser_EntityUser $oUserTopic Объект пользователя */ public function SendNotifyTopicNew($oBlog, $oTopic, $oUserTopic) { $aBlogUsersResult = E::ModuleBlog()->GetBlogUsersByBlogId($oBlog->getId(), null, null); // нужно постранично пробегаться по всем /** @var ModuleBlog_EntityBlogUser[] $aBlogUsers */ $aBlogUsers = $aBlogUsersResult['collection']; foreach ($aBlogUsers as $oBlogUser) { if ($oBlogUser->getUserId() == $oUserTopic->getId()) { continue; } E::ModuleNotify()->SendTopicNewToSubscribeBlog($oBlogUser->getUser(), $oTopic, $oBlog, $oUserTopic); } //отправляем создателю блога if ($oBlog->getOwnerId() != $oUserTopic->getId()) { E::ModuleNotify()->SendTopicNewToSubscribeBlog($oBlog->getOwner(), $oTopic, $oBlog, $oUserTopic); } }
/** * Возвращает число топиков в открытых блогах из избранного по ID пользователя * * @param string $iUserId ID пользователя * * @return array */ public function GetCountFavouriteOpenTopicsByUserId($iUserId) { $aOpenBlogTypes = E::ModuleBlog()->GetOpenBlogTypes(); $sql = "SELECT\n\t\t\t\t\tCOUNT(f.target_id) as cnt\n\t\t\t\tFROM \n\t\t\t\t\t?_favourite AS f,\n\t\t\t\t\t?_topic AS t,\n\t\t\t\t\t?_blog AS b\n\t\t\t\tWHERE \n\t\t\t\t\t\tf.user_id = ?d\n\t\t\t\t\tAND\n\t\t\t\t\t\tf.target_publish = 1\n\t\t\t\t\tAND\n\t\t\t\t\t\tf.target_type = 'topic'\n\t\t\t\t\tAND\n\t\t\t\t\t\tf.target_id = t.topic_id\n\t\t\t\t\tAND \n\t\t\t\t\t\tt.blog_id = b.blog_id\n\t\t\t\t\tAND \n\t\t\t\t\t\tb.blog_type IN (?a)\n\t\t\t\t\t;"; $aRow = $this->oDb->selectRow($sql, $iUserId, $aOpenBlogTypes); return $aRow ? $aRow['cnt'] : false; }