Esempio n. 1
0
 /**
  * Инициализация модуля
  *
  */
 public function Init()
 {
     E::ModuleHook()->Run('lang_init_start');
     $this->sDefaultLang = Config::Get('lang.default');
     $this->aLangPaths = F::File_NormPath(Config::Get('lang.paths'));
     // Проверку на языки делаем, только если сайт мультиязычный
     if (Config::Get('lang.multilang')) {
         // Время хранение языка в куках
         $nSavePeriod = F::ToSeconds(Config::Get('lang.save'));
         $sLangKey = is_string(Config::Get('lang.in_get')) ? Config::Get('lang.in_get') : 'lang';
         // Получаем язык, если он был задан в URL
         $this->sCurrentLang = R::GetLang();
         // Проверка куки, если требуется
         if (!$this->sCurrentLang && $nSavePeriod) {
             $sLang = (string) E::ModuleSession()->GetCookie($sLangKey);
             if ($sLang) {
                 $this->sCurrentLang = $sLang;
             }
         }
         if (!$this->sCurrentLang) {
             $this->sCurrentLang = Config::Get('lang.current');
         }
     } else {
         $this->sCurrentLang = Config::Get('lang.current');
     }
     // Проверяем на случай старого обозначения языков
     $this->sDefaultLang = $this->_checkLang($this->sDefaultLang);
     $this->sCurrentLang = $this->_checkLang($this->sCurrentLang);
     if ($this->sCurrentLang && Config::Get('lang.multilang') && $nSavePeriod) {
         // Пишем в куки, если требуется
         E::ModuleSession()->SetCookie($sLangKey, $this->sCurrentLang, $nSavePeriod);
     }
     $this->InitLang();
 }
Esempio n. 2
0
 /**
  * Инициализация модуля
  *
  */
 public function Init()
 {
     E::ModuleHook()->Run('lang_init_start');
     $this->sDefaultLang = Config::Get('lang.default');
     $this->aLangPaths = F::File_NormPath(Config::Get('lang.paths'));
     $this->bDeleteUndefinedVars = Config::Get('module.lang.delete_undefined');
     // Allowed languages
     $aLangsAllow = (array) Config::Get('lang.allow');
     // Проверку на языки делаем, только если сайт мультиязычный
     if (Config::Get('lang.multilang')) {
         // Время хранение языка в куках
         $iSavePeriod = F::ToSeconds(Config::Get('lang.save'));
         $sLangKey = is_string(Config::Get('lang.in_get')) ? Config::Get('lang.in_get') : 'lang';
         // Получаем язык, если он был задан в URL
         $this->sCurrentLang = R::GetLang();
         // Проверка куки, если требуется
         if (!$this->sCurrentLang && $iSavePeriod) {
             $sLang = (string) E::ModuleSession()->GetCookie($sLangKey);
             if ($sLang) {
                 $this->sCurrentLang = $sLang;
             }
         }
         if (!$this->sCurrentLang) {
             $this->sCurrentLang = Config::Get('lang.current');
         }
     } else {
         $this->sCurrentLang = Config::Get('lang.current');
         $iSavePeriod = 0;
         $sLangKey = null;
     }
     // Current language must be in allowed languages
     if (!in_array($this->sCurrentLang, $aLangsAllow)) {
         $this->sCurrentLang = reset($aLangsAllow);
     }
     // Проверяем на случай старого обозначения языков
     $this->sDefaultLang = $this->_checkLang($this->sDefaultLang);
     $this->sCurrentLang = $this->_checkLang($this->sCurrentLang);
     if ($this->sCurrentLang && Config::Get('lang.multilang') && $iSavePeriod) {
         // Пишем в куки, если требуется
         E::ModuleSession()->SetCookie($sLangKey, $this->sCurrentLang, $iSavePeriod);
     }
     $this->InitLang();
 }
Esempio n. 3
0
 /**
  * Set templator options
  *
  * @param array $aOptions
  */
 protected function _tplSetOptions($aOptions)
 {
     self::$_renderOptionsStack[] = array('caching' => $this->oSmarty->caching, 'cache_lifetime' => $this->oSmarty->cache_lifetime);
     if (isset($aOptions['cache'])) {
         $this->oSmarty->caching = Smarty::CACHING_LIFETIME_SAVED;
         if ($aOptions['cache'] === false) {
             // Отключаем кеширование
             $this->oSmarty->cache_lifetime = 0;
         } elseif (isset($aOptions['cache']['time'])) {
             if ($aOptions['cache']['time'] == -1) {
                 // Задаем бессрочное кеширование
                 $this->oSmarty->cache_lifetime = -1;
             } elseif ($aOptions['cache']['time']) {
                 // Задаем время кеширования
                 $this->oSmarty->cache_lifetime = F::ToSeconds($aOptions['cache']['time']);
             } else {
                 // Отключаем кеширование
                 $this->oSmarty->cache_lifetime = 0;
             }
         }
     }
 }
Esempio n. 4
0
 /**
  * Записать значение в кеш
  *
  * The following life time periods are recognized:
  * <pre>
  * Time interval    | Number of seconds
  * ----------------------------------------------------
  * 3600             | 3600 seconds
  * 2 hours          | Two hours = 60 * 60 * 2 = 7200 seconds
  * 1 day + 12 hours | One day and 12 hours = 60 * 60 * 24 + 60 * 60 * 12 = 129600 seconds
  * 3 months         | Three months = 3 * 30 days = 3 * (60 * 60 * 24 * 30) = 7776000 seconds
  * PT3600S          | 3600 seconds
  * P1DT12H          | One day and 12 hours = 60 * 60 * 24 + 60 * 60 * 12 = 129600 seconds
  * P3M              | Three months = 3 * 30 days = 3 * (60 * 60 * 24 * 30) = 7776000 seconds
  * ----------------------------------------------------
  * Full ISO 8601 interval format: PnYnMnDTnHnMnS
  * </pre>
  *
  * @param   mixed               $xData      - Данные для хранения в кеше
  * @param   string              $sCacheKey  - Имя ключа кеширования
  * @param   array               $aTags      - Список тегов, для возможности удалять сразу несколько кешей по тегу
  * @param   string|int|bool     $nTimeLife  - Время жизни кеша (в секундах или в строковом интервале)
  * @param   string|bool|null    $sCacheType - Тип используемого кеша
  *
  * @return  bool
  */
 public function Set($xData, $sCacheKey, $aTags = array(), $nTimeLife = false, $sCacheType = null)
 {
     if ($sCacheType && strpos($sCacheType, ',') !== false) {
         $aCacheTypes = explode(',', $sCacheType);
         $bResult = false;
         foreach ($aCacheTypes as $sCacheType) {
             if (!$sCacheType && in_array($this->sCacheType, $aCacheTypes)) {
                 // skip double cache
                 continue;
             }
             $bResult = $bResult || $this->Set($xData, $sCacheKey, $aTags, $nTimeLife, $sCacheType ? $sCacheType : null);
         }
         return $bResult;
     }
     // Проверяем возможность кеширования
     $nMode = $this->_cacheOn($sCacheType);
     if (!$nMode) {
         return false;
     }
     /*
     // Если модуль завершил свою работу и не включено принудительное кеширование, то ничего не кешируется
     if ($this->isDone() && ($nMode != self::CACHE_MODE_FORCE)) {
         return false;
     }
     */
     if ($this->iDisabled & self::DISABLED_SET && $nMode != self::CACHE_MODE_FORCE) {
         return false;
     }
     // Теги - это массив строковых значений
     $aTags = $this->_prepareTags($aTags);
     if (is_string($nTimeLife)) {
         $nTimeLife = F::ToSeconds($nTimeLife);
     } else {
         $nTimeLife = intval($nTimeLife);
     }
     if (!$sCacheType) {
         $sCacheType = $this->sCacheType;
     }
     // Если необходимо разрешение конкурирующих запросов к кешу, то реальное время жизни кеша увеличиваем
     if ($nTimeLife && ($nConcurrentDaley = $this->_backendIsConcurrent($sCacheType))) {
         $aData = array('time' => time() + $nTimeLife, 'tags' => $aTags, 'data' => $xData);
         $nTimeLife += $nConcurrentDaley;
     } else {
         $aData = array('time' => false, 'tags' => $aTags, 'data' => $xData);
     }
     return $this->_backendSave($sCacheType, $aData, $this->_hash($sCacheKey), $aTags, $nTimeLife);
 }
Esempio n. 5
0
 protected function _checkLimits()
 {
     $iLimitQueries = intval(C::Get('module.search.limit.queries'));
     $iLimitPeriod = F::ToSeconds(C::Get('module.search.limit.period'));
     $iLimitInterval = F::ToSeconds(C::Get('module.search.limit.interval'));
     if (!F::GetRequest('q') || !$iLimitQueries || !$iLimitPeriod) {
         return true;
     }
     $sLastSearchQueries = E::ModuleSession()->Get('last_search_queries');
     if (empty($sLastSearchQueries)) {
         $aLastSearchQueries = array();
     } else {
         $aLastSearchQueries = F::Unserialize($sLastSearchQueries);
     }
     $iCount = 0;
     if (!empty($aLastSearchQueries)) {
         $iTimeLimit = time() - $iLimitPeriod;
         //echo date('H:i:s', time()), '--', date('H:i:s', $iTimeLimit), '<br>';
         foreach ($aLastSearchQueries as $iIndex => $aQuery) {
             //echo $iIndex, ' - ', date('H:i:s', $aQuery['time']);
             if ($aQuery['time'] >= $iTimeLimit) {
                 $iCount += 1;
                 //echo ' * ';
             }
             //echo '<br>';
         }
         $aLastQuery = end($aLastSearchQueries);
     } else {
         $aLastQuery = null;
     }
     if (count($aLastSearchQueries) > $iLimitQueries) {
         $aLastSearchQueries = array_slice($aLastSearchQueries, -$iLimitQueries);
     }
     $aLastSearchQueries[] = array('time' => time(), 'query' => F::GetRequest('q'));
     E::ModuleSession()->Set('last_search_queries', F::Serialize($aLastSearchQueries));
     //die('iCount:' . $iCount);
     if ($iCount > $iLimitQueries) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('search_err_frequency', array('num' => $iLimitQueries, 'sec' => $iLimitPeriod)));
         return false;
     }
     if (!empty($aLastQuery['time']) && $iLimitInterval && $aLastQuery['time'] > time() - $iLimitInterval) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('search_err_interval', array('sec' => $iLimitInterval)));
         return false;
     }
     return true;
 }
Esempio n. 6
0
 /**
  * Site settings > Edit
  */
 protected function _eventConfigEdit()
 {
     $aUnits = array('S' => array('name' => 'seconds'), 'M' => array('name' => 'minutes'), 'H' => array('name' => 'hours'), 'D' => array('name' => 'days'));
     if ($this->GetPost('submit_data_save')) {
         $aConfig = array();
         if ($this->GetPost('view--wysiwyg')) {
             $aConfig['view.wysiwyg'] = true;
         } else {
             $aConfig['view.wysiwyg'] = false;
         }
         if ($this->GetPost('view--noindex')) {
             $aConfig['view.noindex'] = true;
         } else {
             $aConfig['view.noindex'] = false;
         }
         //$aConfig['view.img_resize_width'] = intval($this->GetPost('view--img_resize_width'));
         //$aConfig['view.img_max_width'] = intval($this->GetPost('view--img_max_width'));
         //$aConfig['view.img_max_height'] = intval($this->GetPost('view--img_max_height'));
         $aConfig['module.uploader.images.default.max_width'] = intval($this->GetPost('view--img_max_width'));
         $aConfig['module.uploader.images.default.max_height'] = intval($this->GetPost('view--img_max_height'));
         if ($this->GetPost('tag_required')) {
             $aConfig['module.topic.allow_empty_tags'] = false;
         } else {
             $aConfig['module.topic.allow_empty_tags'] = true;
         }
         if ($nVal = intval($this->GetPost('module--topic--max_length'))) {
             $aConfig['module.topic.max_length'] = $nVal;
         }
         $aConfig['module.comment.edit.enable'] = false;
         if ($this->GetPost('edit_comment') == 'on') {
             $nEditTime = intval($this->GetPost('edit_comment_time'));
             if ($nEditTime) {
                 $sEditUnit = '';
                 if ($this->GetPost('edit_comment_unit')) {
                     foreach ($aUnits as $sKey => $sUnit) {
                         if ($sUnit['name'] == $this->GetPost('edit_comment_unit')) {
                             $sEditUnit = $sKey;
                             break;
                         }
                     }
                 }
                 if (!$sEditUnit) {
                     $sEditUnit = 'S';
                 }
                 if ($sEditUnit == 'D') {
                     $nEditTime = F::ToSeconds('P' . $nEditTime . 'D');
                 } else {
                     $nEditTime = F::ToSeconds('PT' . $nEditTime . $sEditUnit);
                 }
                 $aConfig['module.comment.edit.enable'] = $nEditTime;
             }
         }
         Config::WriteCustomConfig($aConfig);
         R::Location('admin/settings-site/');
         exit;
     }
     $this->SetTemplateAction('settings/edit');
     $nCommentEditTime = F::ToSeconds(Config::Get('module.comment.edit.enable'));
     if ($nCommentEditTime) {
         $sCommentEditUnit = $aUnits['S']['name'];
         if ($nCommentEditTime % 60 == 0) {
             $nCommentEditTime = $nCommentEditTime / 60;
             $sCommentEditUnit = $aUnits['M']['name'];
             if ($nCommentEditTime % 60 == 0) {
                 $nCommentEditTime = $nCommentEditTime / 60;
                 $sCommentEditUnit = $aUnits['H']['name'];
                 if ($nCommentEditTime % 24 == 0) {
                     $nCommentEditTime = $nCommentEditTime / 24;
                     $sCommentEditUnit = $aUnits['D']['name'];
                 }
             }
         }
     } else {
         $sCommentEditUnit = $aUnits['S']['name'];
     }
     E::ModuleViewer()->Assign('nCommentEditTime', $nCommentEditTime);
     E::ModuleViewer()->Assign('sCommentEditUnit', $sCommentEditUnit);
     E::ModuleViewer()->Assign('aTimeUnits', $aUnits);
 }
Esempio n. 7
0
 /**
  * Генерация URL топиков. Процесс может быть долгим, поэтому стараемся предотвратить ошибку по таймауту
  */
 public function GenerateTopicsUrl()
 {
     $nRecLimit = 500;
     $nTimeLimit = F::ToSeconds(ini_get('max_execution_time')) * 0.8 - 5 + time();
     $nResult = -1;
     while (true) {
         $aData = $this->oMapper->GetTitleTopicsWithoutUrl($nRecLimit);
         if (!$aData) {
             $nResult = 0;
             break;
         }
         foreach ($aData as $nTopicId => $sTopicTitle) {
             $aData[$nTopicId]['topic_url'] = substr(F::TranslitUrl($aData[$nTopicId]['topic_title']), 0, 240);
         }
         if (!$this->oMapper->SaveTopicsUrl($aData)) {
             return -1;
         }
         // если время на исходе, то завершаем
         if (time() >= $nTimeLimit) {
             break;
         }
     }
     if ($nResult == 0) {
         // нужно ли проверять ссылки на дубликаты
         $iOnDuplicateUrl = Config::Val('module.topic.on_duplicate_url', 1);
         if ($iOnDuplicateUrl) {
             $this->CheckDuplicateTopicsUrl();
         }
     } else {
         $nResult = $this->GetNumTopicsWithoutUrl();
     }
     return $nResult;
 }
Esempio n. 8
0
 /**
  * @return bool
  */
 protected function _checkLimits()
 {
     $iLimitQueries = (int) C::Get('module.search.limit.queries');
     $iLimitPeriod = F::ToSeconds(C::Get('module.search.limit.period'));
     $iLimitInterval = F::ToSeconds(C::Get('module.search.limit.interval'));
     if (!F::GetRequest('q') || !$iLimitQueries || !$iLimitPeriod) {
         return true;
     }
     $aLastSearchQueries = $this->_statLoad();
     $iCount = 0;
     if (count($aLastSearchQueries) > 0) {
         $iTimeLimit = time() - $iLimitPeriod;
         foreach ($aLastSearchQueries as $iIndex => $aQuery) {
             if ($aQuery['time'] >= $iTimeLimit) {
                 ++$iCount;
             }
         }
         $aLastQuery = end($aLastSearchQueries);
     } else {
         $aLastQuery = null;
     }
     if (count($aLastSearchQueries) > $iLimitQueries) {
         $aLastSearchQueries = array_slice($aLastSearchQueries, -$iLimitQueries);
     }
     $aLastSearchQueries[] = array('time' => time(), 'query' => F::GetRequest('q'));
     $this->_statSave($aLastSearchQueries);
     if ($iCount > $iLimitQueries) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('search_err_frequency', array('num' => $iLimitQueries, 'sec' => $iLimitPeriod)));
         return false;
     }
     if (!empty($aLastQuery['time']) && $iLimitInterval && $aLastQuery['time'] > time() - $iLimitInterval) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('search_err_interval', array('sec' => $iLimitInterval)));
         return false;
     }
     return true;
 }
Esempio n. 9
0
 /**
  * Вышло ли время для голосования
  *
  * @return bool
  */
 public function isVoteExpired()
 {
     $nTimeLimit = Config::Get('acl.vote.comment.limit_time');
     if (!$nTimeLimit) {
         return false;
     }
     return strtotime($this->getDate()) < time() - F::ToSeconds($nTimeLimit);
 }
Esempio n. 10
0
 /**
  * Sets cookie
  *
  * @param   string          $sName
  * @param   string          $sValue
  * @param   int|string|null $xPeriod - period in seconds or in string like 'P<..>'
  * @param   bool            $bHttpOnly
  * @param   bool            $bSecure
  */
 public function SetCookie($sName, $sValue, $xPeriod = null, $bHttpOnly = true, $bSecure = false)
 {
     if ($xPeriod) {
         $nTime = time() + F::ToSeconds($xPeriod);
     } else {
         $nTime = 0;
     }
     setcookie($sName, $sValue, $nTime, Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'), $bSecure, $bHttpOnly);
 }
Esempio n. 11
0
 /**
  * Sets cookie
  *
  * @param   string          $sName
  * @param   string          $sValue
  * @param   int|string|null $xPeriod - period in seconds or in string like 'P<..>'
  * @param   bool            $bHttpOnly
  * @param   bool            $bSecure
  *
  * @return bool
  */
 public function SetCookie($sName, $sValue, $xPeriod = null, $bHttpOnly = true, $bSecure = false)
 {
     if ($xPeriod) {
         $nTime = time() + F::ToSeconds($xPeriod);
     } else {
         $nTime = 0;
     }
     $bResult = setcookie($sName, $sValue, $nTime, Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'), $bSecure, $bHttpOnly);
     if (DEBUG) {
         if (!$bResult) {
             if (headers_sent($sFilename, $iLine)) {
                 F::SysWarning('Cannot set cookie "' . $sName . '" - header was sent in file ' . $sFilename . '(' . $iLine . ')');
             } else {
                 F::SysWarning('Cannot set cookie "' . $sName . '"');
             }
         }
     }
     return $bResult;
 }