/** * @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; }
/** * Список опубликованых топиков в открытых блогах (с кешированием) * * @param int $iPage * * @return array */ public function getTopicsForSitemap($iPage = 0) { $sCacheKey = "sitemap_topics_{$iPage}_" . C::Get('plugin.sitemap.items_per_page'); if (false === ($aData = E::ModuleCache()->Get($sCacheKey))) { $aFilter = $this->GetNamedFilter('sitemap'); $aTopics = E::ModuleTopic()->GetTopicsByFilter($aFilter, $iPage, C::Get('plugin.sitemap.items_per_page'), array('blog' => array('owner' => array()))); $aData = array(); $iIndex = 0; $aPriority = F::Array_Str2Array(C::Get('plugin.sitemap.type.topics.priority')); $nPriority = sizeof($aPriority) ? reset($aPriority) : null; $aChangeFreq = F::Array_Str2Array(C::Get('plugin.sitemap.type.topics.changefreq')); $sChangeFreq = sizeof($aChangeFreq) ? reset($aChangeFreq) : null; /** @var ModuleTopic_EntityTopic $oTopic */ foreach ($aTopics['collection'] as $oTopic) { if ($aPriority) { if (isset($aPriority[$iIndex])) { $nPriority = $aPriority[$iIndex]; } } if ($aChangeFreq) { if (isset($aChangeFreq[$iIndex])) { $sChangeFreq = $aChangeFreq[$iIndex]; } } $aData[] = E::ModuleSitemap()->GetDataForSitemapRow($oTopic->getLink(), $oTopic->getDateLastMod(), $sChangeFreq, $nPriority); $iIndex += 1; } // тег 'blog_update' т.к. при редактировании блога его тип может измениться // с открытого на закрытый или наоборот E::ModuleCache()->Set($aData, $sCacheKey, array('topic_new', 'topic_update', 'blog_update'), C::Get('plugin.sitemap.type.topics.cache_lifetime')); } return $aData; }
public function getComments($iTopicId, $iPageNum, $iPageSize) { $sCacheKey = 'api_topic_' . $iTopicId; $oTopic = E::ModuleCache()->GetTmp($sCacheKey); if (!$oTopic) { $oTopic = E::ModuleTopic()->GetTopicById($iTopicId); } if (!$oTopic || !($oBlog = $oTopic->getBlog())) { return array(); } $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(); } $aComments = E::ModuleComment()->GetCommentsByTargetId($oTopic, 'topic', $iPageNum, $iPageSize); $aResult = array('total' => $oTopic->getCountComment(), 'list' => array()); foreach ($aComments['comments'] as $oComment) { $aResult['list'][] = $oComment->getApiData(); } return $aResult; }
public static function Init($sFuncStats) { if (!self::IsAvailable()) { return false; } $oCache = new Zend_Cache_Backend_File(array('cache_dir' => C::Get('sys.cache.dir'), 'file_name_prefix' => E::ModuleCache()->GetCachePrefix(), 'read_control_type' => 'crc32', 'hashed_directory_level' => C::Get('sys.cache.directory_level'), 'read_control' => true, 'file_locking' => true)); return new self($oCache, $sFuncStats); }
/** * Получает список блогов по регулярному выражению (поиск) * * @param $sRegexp * @param $iPage * @param $iPerPage * @param array $aParams * * @return array */ public function GetBlogsIdByRegexp($sRegexp, $iPage, $iPerPage, $aParams = array()) { $s = md5(serialize($sRegexp) . serialize($aParams)); $sCacheKey = 'search_blogs_' . $s . '_' . $iPage . '_' . $iPerPage; if (false === ($data = E::ModuleCache()->Get($sCacheKey))) { $data = array('collection' => $this->oMapper->GetBlogsIdByRegexp($sRegexp, $iCount, $iPage, $iPerPage, $aParams), 'count' => $iCount); E::ModuleCache()->Set($data, $sCacheKey, array('blog_update', 'blog_new'), 'PT1H'); } return $data; }
/** * Список коллективных блогов (с кешированием) * * @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; }
/** * @param int|ModuleComment_EntityComment $xComment * * @return array */ public function getInfo($xComment) { /** @var ModuleComment_EntityComment $oComment */ if (!is_object($xComment)) { $iCommentId = intval($xComment); $sCacheKey = 'api_blog_' . $iCommentId; $oComment = E::ModuleCache()->GetTmp($sCacheKey); if (!$oComment) { $oComment = E::ModuleComment()->GetCommentById($iCommentId); } } else { $oComment = $xComment; $sCacheKey = 'api_blog_' . $oComment->getid(); } if (!$oComment) { return array(); } E::ModuleCache()->SetTmp($oComment, $sCacheKey); return $oComment->getApiData(); }
/** * Список пользователей (с кешированием) * * @param integer $iPage * * @return array */ public function getUsersForSitemap($iPage) { $iPerPage = C::Get('plugin.sitemap.users_per_page'); $sCacheKey = "sitemap_users_{$iPage}_{$iPerPage}"; if (false === ($aData = E::ModuleCache()->Get($sCacheKey))) { $aFilter = array('activate' => 1); $aUsers = E::ModuleUser()->GetUsersByFilter($aFilter, array(), $iPage, $iPerPage); $aData = array(); /** @var ModuleUser_EntityUser $oUser */ foreach ($aUsers['collection'] as $oUser) { // профиль пользователя $aData[] = E::ModuleSitemap()->GetDataForSitemapRow($oUser->getProfileUrl(), $oUser->getDateLastMod(), C::Get('plugin.sitemap.type.users.profile.changefreq'), C::Get('plugin.sitemap.type.users.profile.priority')); // публикации пользователя $aData[] = E::ModuleSitemap()->GetDataForSitemapRow($oUser->getUserTopicsLink(), null, C::Get('plugin.sitemap.type.users.my.changefreq'), C::Get('plugin.sitemap.type.users.my.priority')); // комментарии пользователя $aData[] = E::ModuleSitemap()->GetDataForSitemapRow($oUser->getUserCommentsLink(), $oUser->getDateCommentLast(), C::Get('plugin.sitemap.type.users.comments.changefreq'), C::Get('plugin.sitemap.type.users.comments.priority')); E::ModuleCache()->Set($aData, $sCacheKey, array('user_new', 'user_update'), C::Get('plugin.sitemap.type.users.cache_lifetime')); } } return $aData; }
/** * Возвращает количество сообщений для пользователя * * @param bool $sTemplate * @return int|mixed|string */ public function CountMessages($sTemplate = false) { if (!E::IsUser()) { return ''; } $sKeyString = 'menu_count_messages_' . E::UserId() . '_' . (string) $sTemplate; if (FALSE === ($sData = E::ModuleCache()->GetTmp($sKeyString))) { $iValue = (int) $this->CountTrack() + (int) $this->NewTalk(); if ($sTemplate && $iValue) { $sData = str_replace('{{count_messages}}', $iValue, $sTemplate); } else { $sData = $iValue ? $iValue : ''; } E::ModuleCache()->SetTmp($sData, $sKeyString); } return $sData; }
/** * Save sitemap conten in cache * * @param $sType * @param $sContent * @param $sPeriod */ protected function _setCache($sType, $sContent, $sPeriod) { E::ModuleCache()->Set($sContent, 'plugin.sitemap.' . $sType, array(), $sPeriod, ',file'); }
public function clearSandboxCache() { E::ModuleCache()->CleanByTags(array("comment_online_update_sandbox")); }
/** * @param ModuleTopic_EntityTopic $oTopic */ public function UpdateTopic($oTopic) { $bResult = parent::UpdateTopic($oTopic); E::ModuleCache()->CleanByTags(array('comment_online_update_sandbox', 'comment_online_update_topic')); return $bResult; }
/** * Инициализирует языковой файл * */ protected function InitLang($sLang = null) { if (!$sLang) { $sLang = $this->sCurrentLang; } UserLocale::setLocale(Config::Get('lang.current'), array('locale' => Config::get('i18n.locale'), 'timezone' => Config::get('i18n.timezone'))); if (!is_array($this->aLangMsg)) { $this->aLangMsg = array(); } $this->aLangMsg[$sLang] = array(); // * Если используется кеширование через memcaсhed, то сохраняем данные языкового файла в кеш if (Config::Get('sys.cache.type') == 'memory' && Config::Get('sys.cache.use')) { $sCacheKey = 'lang_' . $sLang . '_' . Config::Get('view.skin'); if (false === ($this->aLangMsg[$sLang] = E::ModuleCache()->Get($sCacheKey))) { // if false then empty array $this->aLangMsg[$sLang] = array(); $this->LoadLangFiles($this->sDefaultLang, $sLang); if ($sLang != $this->sDefaultLang) { $this->LoadLangFiles($sLang, $sLang); } E::ModuleCache()->Set($this->aLangMsg[$sLang], $sCacheKey, array(), 60 * 60); } } else { $this->LoadLangFiles($this->sDefaultLang, $sLang); if ($sLang != $this->sDefaultLang) { $this->LoadLangFiles($sLang, $sLang); } } if ($sLang != Config::Get('lang.current')) { //Config::Set('lang.current', $sLang); } $this->LoadLangJs(); }
/** * Увеличивает число новых комментов у юзеров * * @param int $nTalkId ID разговора * @param array $aExcludeId Список ID пользователей для исключения * * @return int */ public function increaseCountCommentNew($nTalkId, $aExcludeId = null) { $xResult = $this->oMapper->increaseCountCommentNew($nTalkId, $aExcludeId); E::ModuleCache()->Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("update_talk_user_{$nTalkId}")); E::ModuleCache()->Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("update_talk_user")); return $xResult; }
/** * Получить статистику по юзерам * cnt_topics_p / cnt_topics_m - Количество голосований за топик +/- * sum_topics_p / sum_topics_m - Количество голосований за топик +/- * cnt_comments_p / cnt_comments_m - Количество голосований за комментарий +/- * sum_comments_p / sum_comments_m - Количество голосований за комментарий +/- * cnt_user_p / cnt_user_m - Количество голосований за пользователя +/- * sum_user_p / sum_user_m - Количество голосований за пользователя +/- * * @param int $iUserId ID пользователя * * @return array */ public function GetUserVoteStats($iUserId) { $sCacheKey = 'user_vote_stats_' . $iUserId; if (false === ($aResult = E::ModuleCache()->Get($sCacheKey))) { $aResult = $this->oMapper->GetUserVoteStats($iUserId); E::ModuleCache()->Set($aResult, $sCacheKey, array("vote_update_topic_{$iUserId}", "vote_update_comment_{$iUserId}", "vote_update_user_{$iUserId}")); } return $aResult; }
/** * @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; }
/** * Вспомогательный метод проверки прав пользователя блога * * @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 $aRules * @param bool $bConcatenateResult * @param bool $sOwnerClassName * @return bool */ public function checkCustomRules($aRules, $bConcatenateResult = FALSE, $sOwnerClassName = FALSE) { // Ключ кэша $sCacheKey = md5(serialize($aRules) . (string) $bConcatenateResult . (string) $sOwnerClassName); if (!(FALSE === ($data = E::ModuleCache()->GetTmp($sCacheKey)))) { return $data; } // Правило жёстко задано - вернем его if (is_bool($aRules)) { return $aRules; } // Правило жёстко задано - вернем его if (is_string($aRules)) { return $aRules; } /** @var callable[]|[][] $aActiveRule Правило вычисления активности */ // Нет правила, кнопка вообще не активна будет if (!$aRules) { return FALSE; } // Правило задается методаом меню if (!is_array($aRules)) { return FALSE; } if (!$sOwnerClassName) { $aOwnerClassName = E::getInstance()->GetClassInfo($this, Engine::CI_MODULE); $sOwnerClassName = reset($aOwnerClassName); } // Все проверки пройдены, запускаем вычисление активности $bResult = FALSE; foreach ($aRules as $sMethodName => $xRule) { if (is_bool($xRule)) { if ($bConcatenateResult) { $bResult .= $xRule; } else { $bResult = $bResult || $xRule; } if ($bResult && !$bConcatenateResult) { break; } continue; } if (is_string($xRule) && $bConcatenateResult) { if (strpos($xRule, 'hook:') === 0) { $bResult .= E::ModuleHook()->Run(substr($xRule, 5)); } elseif (strpos($xRule, 'text:') === 0) { $bResult .= substr($xRule, 5); } elseif (strpos($xRule, 'func:') === 0) { $bResult .= call_user_func(substr($xRule, 5)); } else { $bResult .= $xRule; } continue; } // Передан колбэк if (is_callable($xRule)) { $bResult = $bResult || $xRule(); if ($bResult && !$bConcatenateResult) { break; } continue; } /** * Передан вызов функции, например * $xRule = array('compare_action' => array('index')) */ $sTmpMethodName = FALSE; $aTmpMethodParams = FALSE; // Метод передан строкой if (is_int($sMethodName) && is_string($xRule)) { $sTmpMethodName = $xRule; $aTmpMethodParams = array(); } // Метод передан массивом if (is_string($sMethodName) && is_array($xRule)) { $sTmpMethodName = $sMethodName; $aTmpMethodParams = $xRule; } // Вызовем метод if ($sTmpMethodName && $aTmpMethodParams !== FALSE) { if (strpos($sTmpMethodName, 'hook:') === 0) { $xCallResult = E::ModuleHook()->Run(substr($sTmpMethodName, 5), $aTmpMethodParams, false); } elseif (strpos($sTmpMethodName, 'text:') === 0) { $xCallResult = substr($sTmpMethodName, 5); } elseif (strpos($sTmpMethodName, 'func:') === 0) { $xCallResult = call_user_func_array(substr($sTmpMethodName, 5), $aTmpMethodParams); } else { $sTmpMethodName = $sOwnerClassName . '_' . F::StrCamelize($sTmpMethodName); $xCallResult = call_user_func_array(array($this, $sTmpMethodName), $aTmpMethodParams); } if ($bConcatenateResult) { if (!empty($xCallResult) && (is_string($xCallResult) || is_numeric($xCallResult))) { $bResult .= $xCallResult; } } else { $bResult = $bResult || $xCallResult; } if ($bResult && !$bConcatenateResult) { break; } continue; } } // Закэшируем результат E::ModuleCache()->SetTmp($bResult, $sCacheKey); return $bResult; }
/** * @param string $sTargetType * @param int|array $xTargetId * @param int $iUserId * * @return bool */ public function DeleteMresourcesRelByTargetAndUser($sTargetType, $xTargetId, $iUserId) { $aMresourceRel = $this->oMapper->GetMresourcesRelByTargetAndUser($sTargetType, $xTargetId, $iUserId); if ($aMresourceRel) { $aMresId = array(); if ($this->oMapper->DeleteTargetRel($sTargetType, $xTargetId)) { /** @var ModuleMresource_EntityMresourceRel $oResourceRel */ foreach ($aMresourceRel as $oResourceRel) { $aMresId[] = $oResourceRel->GetMresourceId(); } $aMresId = array_unique($aMresId); } if ($aMresId) { return $this->DeleteMresources($aMresId); } } E::ModuleCache()->CleanByTags(array('mresource_rel_update')); return true; }
/** * Returns full path to email templates by name and plugin * * @param string $sName Template name * @param string|object $xPlugin Name or class of plugin * * @return string */ public function GetTemplatePath($sName, $xPlugin = null) { if ($xPlugin) { $sPluginName = Plugin::GetPluginName($xPlugin); } else { $sPluginName = ''; } $sCacheKey = 'template_path_' . $sName . '-' . $sPluginName; if (false === ($sResult = E::ModuleCache()->Get($sCacheKey, 'tmp'))) { $bFound = false; if ($sPluginName) { $sDir = Plugin::GetTemplateDir($sPluginName) . $this->sDir . '/'; } else { $sDir = F::File_NormPath(E::ModuleViewer()->GetTemplateDir() . '/' . $this->sDir . '/'); } // Find template by current language $sLangDir = $sDir . E::ModuleLang()->GetLang(); if (is_dir($sLangDir)) { $sResult = $sLangDir . '/' . $sName; $bFound = true; } if (!$bFound) { // Find by aliases of current language if ($aAliases = E::ModuleLang()->GetLangAliases()) { foreach ($aAliases as $sAlias) { if (is_dir($sLangDir = $sDir . $sAlias)) { $sResult = $sLangDir . '/' . $sName; $bFound = true; break; } } } } if (!$bFound) { // Find template by default language $sLangDir = $sDir . E::ModuleLang()->GetDefaultLang(); if (is_dir($sLangDir)) { $sResult = $sLangDir . '/' . $sName; $bFound = true; } } if (!$bFound) { // Find by aliases of default language if ($aAliases = E::ModuleLang()->GetDefaultLangAliases()) { foreach ($aAliases as $sAlias) { if (is_dir($sLangDir = $sDir . $sAlias)) { $sResult = $sLangDir . '/' . $sName; $bFound = true; break; } } } } if (!$bFound) { $sResult = $sDir . E::ModuleLang()->GetLangDefault() . '/' . $sName; } if (is_dir($sResult)) { E::ModuleCache()->Set($sResult, $sCacheKey, array(), 'P30D', 'tmp'); } } return $sResult; }
/** * Пересчет рейтинга блогов */ protected function EventRecalculateBlogRating() { $this->sMainMenuItem = 'tools'; $this->_setTitle(E::ModuleLang()->Get('action.admin.recalcblograting_title')); $this->SetTemplateAction('tools/recalcblograting'); if (F::isPost('recalcblograting_submit')) { E::ModuleSecurity()->ValidateSendForm(); set_time_limit(0); E::ModuleRating()->RecalculateBlogRating(); E::ModuleCache()->Clean(); E::ModuleMessage()->AddNotice(E::ModuleLang()->Get('action.admin.blograting_recalculated'), E::ModuleLang()->Get('attention')); } else { E::ModuleViewer()->Assign('sMessage', E::ModuleLang()->Get('action.admin.recalcblograting_message')); E::ModuleViewer()->Assign('bActionEnable', true); } }
/** * @param string $sTagName * @param array $aTagAttributes * @param string $sСontent * * @return string */ public function CallbackTagSnippet($sTagName, $aTagAttributes, $sСontent) { if (isset($aTagAttributes['data-alto-tag-name'])) { $sSnippetName = $aTagAttributes['data-alto-tag-name']; } elseif (isset($aTagAttributes['name'])) { $sSnippetName = $aTagAttributes['name']; } else { // Нет имени сниппета, оставляем, как есть return $this->_buildTag($sTagName, $aTagAttributes, $sСontent); } // Имя сниппета есть, обрабатываем его $sCacheKey = serialize(array($sTagName, $aTagAttributes, $sСontent)); // Может сниппет уже был в обработке, тогда просто возьмем его из кэша $sResult = E::ModuleCache()->GetTmp($sCacheKey); // Если результата в кеше нет, то обрабатываем if (FALSE === $sResult) { $aParams = array(); if (!empty($aTagAttributes['data-alto-tag-attr'])) { $aTagAttr = explode(';', $aTagAttributes['data-alto-tag-attr']); foreach ($aTagAttr as $sAttr) { if ($sAttr) { list($sAttrName, $sAttrValue) = explode(':', $sAttr); $aParams[$sAttrName] = $sAttrValue; } } } // Добавим в параметры текст, который был в топике, вдруг какой-нибудь сниппет // захочет с ним поработать. //$aSnippetParams['target_text'] = $sText; // Добавим контент сниппета $aParams['snippet_text'] = $sСontent; // Добавим в параметры имя сниппета $aParams['snippet_name'] = $sSnippetName; // Попытаемся получить результат от обработчика // Определим тип сниппета, может быть шаблонным, а может и исполняемым // по умолчанию сниппет ссчитаем исполняемым. Если шаблонный, то его // обрабатывает предопределенный хук snippet_template_type $sHookName = 'snippet_' . $sSnippetName; $sHookName = E::ModuleHook()->IsEnabled($sHookName) ? 'snippet_' . $sSnippetName : 'snippet_template_type'; // Вызовем хук E::ModuleHook()->Run($sHookName, array('params' => &$aParams, 'result' => &$sResult)); if ($sHookName === 'snippet_template_type' && $sResult === false) { // Шаблонный хук не отработал, оставлям тег, как есть $sResult = $this->_buildTag($sTagName, $aTagAttributes, $sСontent); } // Запишем результат обработки в кэш E::ModuleCache()->SetTmp($sResult, $sCacheKey); } return $sResult; }
/** * Разбирает текст и анализирует его на наличие сниппетов. * Если они найдены, то запускает хуки для их обработки. * * @version 0.1 Базовый функционал * @version 0.2 Добавлены блочный и шаблонный сниппеты * * @param string $sText * * @return string */ public function SnippetParser($sText) { // Массив регулярки для поиска сниппетов $aSnippetRegexp = array('~<alto:(\\w+)((?:\\s+\\w+(?:\\s*=\\s*(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>\\s]+))?)*)\\s*>([.\\s\\S\\r\\n]*)</alto:\\1>~Ui', '~<alto:(\\w+)((?:\\s+\\w+(?:\\s*=\\s*(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>\\s]+))?)*)\\s*\\/*>~Ui'); // Получим массив: сниппетов, их имён и параметров по каждой регклярке // Здесь получаем в $aMatches три/четыре массива из которых первым идет массив найденных сниппетов, // который позже будет заменён на результат полученный от хука. Вторым массивом идут имена // найденных сниппетов, которые будут использоваться для формирвоания имени хука. // Третим массивом будут идти параметры сниппетов. Если сниппет блочный, то четвертым параметром // будет текст-содержимое блока. foreach ($aSnippetRegexp as $sRegExp) { if (preg_match_all($sRegExp, $sText, $aMatches)) { // Данные для замены сниппетов на полученный код. $aReplaceData = array(); /** * @var int $k Порядковый номер найденного сниппета * @var string $sSnippetName Имя (идентификатор) сниппета */ foreach ($aMatches[1] as $k => $sSnippetName) { // Получим параметры в виде массива. Вообще-то их может и не быть воовсе, // но мы всё-таки попробуем это сделать... $aParams = array(); if (preg_match_all('~([a-zA-Z]+)\\s*=\\s*[\'"]([^\'"]+)[\'"]~Ui', $aMatches[2][$k], $aMatchesParams)) { foreach ($aMatchesParams[1] as $pk => $sParamName) { $aParams[$sParamName] = @$aMatchesParams[2][$pk]; } } // Добавим в параметры текст, который был в топике, вдруг какой-нибудь сниппет // захочет с ним поработать. $aParams['target_text'] = $sText; // Если это блочный сниппет, то добавим в параметры еще и текст блока $aParams['snippet_text'] = isset($aMatches[3][$k]) ? $aMatches[3][$k] : ''; // Добавим в параметры имя сниппета $aParams['snippet_name'] = $sSnippetName; // Попытаемся получить результат от обработчика // Может сниппет уже был в обработке, тогда просто возьмем его из кэша $sCacheKey = $sSnippetName . md5(serialize($aParams)); if (FALSE === ($sResult = E::ModuleCache()->GetTmp($sCacheKey))) { // Определим тип сниппета, может быть шаблонным, а может и исполняемым // по умолчанию сниппет ссчитаем исполняемым. Если шаблонный, то его // обрабатывает предопределенный хук snippet_template_type $sHookName = 'snippet_' . $sSnippetName; $sHookName = E::ModuleHook()->IsEnabled($sHookName) ? 'snippet_' . $sSnippetName : 'snippet_template_type'; // Установим хук E::ModuleHook()->Run($sHookName, array('params' => &$aParams, 'result' => &$sResult)); // Запишем результат обработки в кэш E::ModuleCache()->SetTmp($sResult, $sCacheKey); } $aReplaceData[$k] = is_string($sResult) ? $sResult : ''; } // Произведем замену. Если обработчиков не было, то сниппеты // будут заменены на пустую строку. $sText = str_replace(array_values($aMatches[0]), array_values($aReplaceData), $sText); } } return $sText; }
/** * Clear cache for all menus */ public function ClearAllMenuCache() { E::ModuleCache()->CleanByTags(array('menu'), ',file'); }
/** * Получение последней ошибки */ public function GetLastError() { return E::ModuleCache()->GetTmp('MODULE_API_LAST_ERROR'); }
/** * Удалить тип блога * * @param ModuleBlog_EntityBlogType$oBlogType * * @return bool */ public function DeleteBlogType($oBlogType) { $aInfo = $this->oMapper->GetBlogCountsByTypes($oBlogType->GetTypeCode()); // Если есть блоги такого типа, то НЕ удаляем тип if (!empty($aInfo[$oBlogType->GetTypeCode()])) { $bResult = $this->oMapper->DeleteBlogType($oBlogType->GetTypeCode()); if ($bResult) { //чистим зависимые кеши E::ModuleCache()->CleanByTags(array('blog_update')); E::ModuleCache()->Delete("blog_type_{$oBlogType->getId()}"); return true; } } return false; }
/** * Удаление пользователей * * @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 string $sPluginId * @param bool $bRemove * * @return null|bool */ public function Deactivate($sPluginId, $bRemove = false) { // get activated plugin by ID $oPlugin = $this->_getPluginById($sPluginId, true); if ($oPlugin) { /** * TODO: Проверять зависимые плагины перед деактивацией */ $bResult = $oPlugin->Deactivate(); if ($bRemove) { $oPlugin->Remove(); } } else { // Исполняемый файл плагина не найден $sPluginClassFile = Plugin::GetPluginClass($sPluginId) . '.class.php'; E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.plugin_file_not_found', array('file' => $sPluginClassFile)), E::ModuleLang()->Get('error'), true); return false; } if ($bResult) { // * Переопределяем список активированных пользователем плагинов $aActivePlugins = $this->GetActivePlugins(); // * Вносим данные в файл о деактивации плагина unset($aActivePlugins[$sPluginId]); // * Сбрасываем весь кеш, т.к. могут быть закешированы унаследованые плагинами сущности E::ModuleCache()->SetDesabled(true); E::ModuleCache()->Clean(); if (!$this->SetActivePlugins($aActivePlugins)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.plugin_activation_file_write_error'), E::ModuleLang()->Get('error'), true); return false; } // * Очищаем компилированные шаблоны Smarty E::ModuleViewer()->ClearSmartyFiles(); } return $bResult; }
/** * Удалить изображение * * @param ModuleTopic_EntityTopicPhoto $oPhoto - Объект фото */ public function DeleteTopicPhoto($oPhoto) { $this->oMapper->deleteTopicPhoto($oPhoto->getId()); $sFile = E::ModuleUploader()->Url2Dir($oPhoto->getPath()); E::ModuleImg()->Delete($sFile); E::ModuleCache()->CleanByTags(array('photoset_photo_update')); }
/** * Деактивация * * @param string $sPluginId - код плагина * * @return null|bool */ public function Deactivate($sPluginId) { // получаем список активированных плагинов $aPlugins = $this->GetPluginsList(true); if (!isset($aPlugins[$sPluginId])) { return null; } $sPluginName = F::StrCamelize($sPluginId); $sPluginDir = $aPlugins[$sPluginId]->getDirname(); if (!$sPluginDir) { $sPluginDir = $sPluginId; } $sClassName = "Plugin{$sPluginName}"; if (class_exists($sClassName)) { /** @var Plugin $oPlugin */ $oPlugin = new $sClassName(); /** * TODO: Проверять зависимые плагины перед деактивацией */ $bResult = $oPlugin->Deactivate(); } else { // Исполняемый файл плагина не найден $sFile = F::File_NormPath("{$this->sPluginsCommonDir}{$sPluginDir}/Plugin{$sPluginName}.class.php"); E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.plugin_file_not_found', array('file' => $sFile)), E::ModuleLang()->Get('error'), true); return false; } if ($bResult) { // * Переопределяем список активированных пользователем плагинов $aActivePlugins = $this->GetActivePlugins(); // * Вносим данные в файл о деактивации плагина unset($aActivePlugins[$sPluginId]); // * Сбрасываем весь кеш, т.к. могут быть закешированы унаследованые плагинами сущности E::ModuleCache()->SetDesabled(true); E::ModuleCache()->Clean(); if (!$this->SetActivePlugins($aActivePlugins)) { E::ModuleMessage()->AddError(E::ModuleLang()->Get('action.admin.plugin_activation_file_write_error'), E::ModuleLang()->Get('error'), true); return false; } // * Очищаем компилированные шаблоны Smarty E::ModuleViewer()->ClearSmartyFiles(); } return $bResult; }