Esempio n. 1
0
 /**
  * @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;
 }
Esempio n. 2
0
 /**
  * Список опубликованых топиков в открытых блогах (с кешированием)
  *
  * @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;
 }
Esempio n. 3
0
 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;
 }
Esempio n. 4
0
 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);
 }
Esempio n. 5
0
 /**
  * Получает список блогов по регулярному выражению (поиск)
  *
  * @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;
 }
Esempio n. 6
0
 /**
  * Список коллективных блогов (с кешированием)
  *
  * @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();
 }
Esempio n. 8
0
 /**
  * Список пользователей (с кешированием)
  *
  * @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;
 }
Esempio n. 9
0
 /**
  * Возвращает количество сообщений для пользователя
  *
  * @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;
 }
Esempio n. 10
0
 /**
  * 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"));
 }
Esempio n. 12
0
 /**
  * @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;
 }
Esempio n. 13
0
 /**
  * Инициализирует языковой файл
  *
  */
 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();
 }
Esempio n. 14
0
 /**
  * Увеличивает число новых комментов у юзеров
  *
  * @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;
 }
Esempio n. 15
0
 /**
  * Получить статистику по юзерам
  * 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;
 }
Esempio n. 16
0
 /**
  * @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;
 }
Esempio n. 17
0
 /**
  * Вспомогательный метод проверки прав пользователя блога
  *
  * @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;
 }
Esempio n. 18
0
 /**
  * Проверяет массив правил. В качестве правил может быть задана колбэк-функция
  * или указан метод владельца сущности, который должен быть реализован заранее
  *
  * @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;
 }
Esempio n. 19
0
 /**
  * @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;
 }
Esempio n. 20
0
 /**
  * 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;
 }
Esempio n. 21
0
 /**
  * Пересчет рейтинга блогов
  */
 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);
     }
 }
Esempio n. 22
0
 /**
  * @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;
 }
Esempio n. 23
0
 /**
  * Разбирает текст и анализирует его на наличие сниппетов.
  * Если они найдены, то запускает хуки для их обработки.
  *
  * @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;
 }
Esempio n. 24
0
 /**
  * Clear cache for all menus
  */
 public function ClearAllMenuCache()
 {
     E::ModuleCache()->CleanByTags(array('menu'), ',file');
 }
Esempio n. 25
0
 /**
  * Получение последней ошибки
  */
 public function GetLastError()
 {
     return E::ModuleCache()->GetTmp('MODULE_API_LAST_ERROR');
 }
Esempio n. 26
0
 /**
  * Удалить тип блога
  *
  * @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;
 }
Esempio n. 27
0
 /**
  * Удаление пользователей
  *
  * @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;
 }
Esempio n. 28
0
 /**
  * Деактивация
  *
  * @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;
 }
Esempio n. 29
0
 /**
  * Удалить изображение
  *
  * @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'));
 }
Esempio n. 30
0
 /**
  * Деактивация
  *
  * @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;
 }