public function buildContent() { $RQ = GetArrayAdapter::inst(); $AL = PsLogger::controller(); $PARAMS['num'] = $AL->getLastSessionId(); $PARAMS['enabled'] = ConfigIni::isLoggingEnabled(); $mode = null; if ($RQ->has('file')) { $mode = self::MODE_FILE; $PARAMS['folder'] = $RQ->str('folder'); $PARAMS['files'] = $AL->getLogFiles($RQ->str('folder')); $PARAMS['file'] = $AL->getLogFile($RQ->str('folder'), $RQ->str('file')); } if (!$mode && $RQ->has('folder')) { $mode = self::MODE_FILES; $PARAMS['folder'] = $RQ->str('folder'); $PARAMS['files'] = $AL->getLogFiles($RQ->str('folder')); } if (!$mode) { $PARAMS['folders'] = $AL->getLogDirs(); $mode = self::MODE_FOLDERS; } $PARAMS['mode'] = $mode; echo $this->getFoldedEntity()->fetchTpl($PARAMS); }
/** * Метод возвращает экземпляр класса-хранилища маппингов. * Может быть переопределён в config.ini */ private static final function inst() { if (isset(self::$inst)) { return self::$inst; //---- } /* * Получим название класса */ $class = ConfigIni::mappingStorage(); /* * Класс совпадает с базовым? */ if (__CLASS__ == $class) { return self::$inst = new MappingStorage(); } /* * Нам передан класс, который отличается от SDK */ $classPath = Autoload::inst()->getClassPath($class); if (!PsCheck::isNotEmptyString($classPath)) { return PsUtil::raise('Не удалось найти класс хранилища маппингов [{}]', $class); } /* * Указанный класс должен быть наследником данного */ if (!PsUtil::isInstanceOf($class, __CLASS__)) { return PsUtil::raise('Указанное хранилище маппингов [{}] не является наследником класса [{}]', $class, __CLASS__); } return self::$inst = new $class(); }
public function buildContent() { $navigation = AdminPageNavigation::inst(); $PARAMS['mode'] = self::MODE_TABLES_LIST; /* * Просмотр содержимого таблицы */ $table = RequestArrayAdapter::inst()->str('table'); if ($table) { $PARAMS['mode'] = self::MODE_TABLE_VIEW; $table = PsTable::inst($table); $PARAMS['table'] = $table; $PARAMS['rows'] = $table->getRows(); $navigation->addPath(self::urlTables(), 'Настройки'); $navigation->setCurrent('Просмотр ' . $table->getName()); } /* * Просмотр и настройка всех таблиц */ if ($PARAMS['mode'] == self::MODE_TABLES_LIST) { $PARAMS['errors'] = PsDbIniHelper::validateAll(); foreach (ConfigIni::getAllowedScopes() as $scope) { $PARAMS['data'][$scope] = TableExporter::inst()->getTables($scope); $PARAMS['data']["{$scope}.ini"] = DbIni::getIniContent($scope); } $navigation->setCurrent('Настройки'); } echo $this->getFoldedEntity()->fetchTpl($PARAMS); }
/** * Метод вызывается для инициализации окружения: * 1. Директория ресурсов окружения будет подключена в Autoload * 2. Файл, включающий окружение, будет выполнен */ public static function init() { if (self::$inited) { return; //--- } self::$inited = true; //--- /* * Проверим, нужно ли подключать окружение */ if (self::isSkipInclude()) { return; //--- } $env = self::env(); if (!$env) { return; //--- } $envDir = array_get_value($env, ConfigIni::environments()); if (!$envDir) { return PsUtil::raise('Environment [{}] not found', $env); } if (!is_dir($envDir)) { return PsUtil::raise('Environment dir for [{}] not found', $env); } $envSrcDir = next_level_dir($envDir, DirManager::DIR_SRC); $envIncFile = file_path($envDir, $env, PsConst::EXT_PHP); if (!is_file($envIncFile)) { return PsUtil::raise('Environment include file for [{}] not found', $env); } $LOGGER = PsLogger::inst(__CLASS__); if ($LOGGER->isEnabled()) { $LOGGER->info('Including \'{}\' environment for context \'{}\'', $env, PsContext::describe()); $LOGGER->info('Env dir: {}', $envDir); $LOGGER->info('Src dir: {}', $envSrcDir); $LOGGER->info('Inc file: {}', $envIncFile); } //Проинициализировано окружение self::$included = true; //Регистрируем директорию с классами, специфичными только для данного окружения Autoload::inst()->registerBaseDir($envSrcDir, false); //Выполним необходимое действие $PROFILER = PsProfiler::inst(__CLASS__); try { $LOGGER->info('{'); $PROFILER->start($env); self::initImpl($LOGGER, $envIncFile); $secundomer = $PROFILER->stop(); $LOGGER->info('}'); $LOGGER->info('Inc file included for {} sec', $secundomer->getTime()); } catch (Exception $ex) { $PROFILER->stop(false); $LOGGER->info('Inc file execution error: [{}]', $ex->getMessage()); throw $ex; //--- } }
public function buildContent() { $navigation = AdminPageNavigation::inst(); $PARAMS['mode'] = self::MODE_TABLES_LIST; foreach (ConfigIni::getAllowedScopes() as $scope) { $PARAMS['data']["{$scope}.ini"] = ConfigIni::getIniContent($scope); } $navigation->setCurrent('Настройки'); echo $this->getFoldedEntity()->fetchTpl($PARAMS); }
public function buildContent() { if (PsGlobals::inst()->exists()) { $PARAMS['exists'] = true; $PARAMS['props'] = PsGlobals::inst()->getProps(); } else { $PARAMS['exists'] = false; $PARAMS['path'] = ConfigIni::projectGlobalsFilePath(); } echo $this->getFoldedEntity()->fetchTpl($PARAMS); }
protected function executeImpl(ArrayAdapter $params) { $action = $params->str('action'); switch ($action) { case 'saveIni': ConfigIni::saveIniContent($params->str('scope'), $params->str('content')); break; default: raise_error("Неизвестный тип действия: [{$action}]"); } return new AjaxSuccess(); }
/** * Метод валидирует все доступные db.ini */ public static function validateAll() { PsProfiler::inst(__CLASS__)->start(__FUNCTION__); $errors = array(); foreach (ConfigIni::getAllowedScopes() as $scope) { $err = self::validateIni($scope); if ($err) { $errors[$scope] = $err; } } PsProfiler::inst(__CLASS__)->stop(); return $errors; }
public function __construct() { /** * Подключаем cache lite */ PsLibs::inst()->CacheLite(); /* * Конфигурируем */ $liteOptions = array('readControl' => true, 'writeControl' => true, 'readControlType' => 'md5', 'automaticSerialization' => true, 'cacheDir' => DirManager::autogen('cache-lite')->absDirPath(), 'lifeTime' => ConfigIni::cacheFileLifetime() * 60, 'caching' => true); if (PsLogger::isEnabled()) { PsLogger::inst(__CLASS__)->info('Lite options: {}', print_r($liteOptions, true)); } $this->IMPL = new Cache_Lite($liteOptions); }
protected function __construct() { PsLibs::inst()->Smarty(); /* * Начиная с версии 5.4 в функции htmlentities параметр encoding был изменён на UTF-8, * до этого момента после применения данного метода к тексту шаблона мы будем получать кракозябру. */ SmartyCompilerException::$escape = is_phpver_is_or_greater(5, 4); //Получим и сконфигурируем экземпляр Smarty $this->smarty = new Smarty(); $this->smarty->compile_check = true; $this->smarty->force_compile = false; //$this->smarty->caching = TRUE; /* * УПРАВЛЯЮЩИЕ ДИРЕКТОРИИ */ //Директории с шаблонами .tpl : PSSmarty::template('common/citata.tpl'); $this->smarty->setTemplateDir(ConfigIni::smartyTemplates()); //Директория, в которую складываются скомпилированные шаблоны $this->smarty->setCompileDir(DirManager::autogen('/smarty/templates_c/')->absDirPath()); //Директория, в которую складываются кеши $this->smarty->setCacheDir(DirManager::autogen('/smarty/cache/')->absDirPath()); //Директория с конфигами $this->smarty->setConfigDir(PATH_BASE_DIR . PS_DIR_INCLUDES . '/smarty/configs/'); //Директории с плагинами - блочными функциями, функциями, модификатор $this->smarty->addPluginsDir(ConfigIni::smartyPlugins()); /* * Импортируем константы некоторых классов, чтобы на них можно было ссылаться через * {$smarty.const.CONST_NAME} */ //PsConstJs::defineAllConsts(); /* * ПОДКЛЮЧИМ ФИЛЬТРЫ */ PSSmartyFilter::inst()->bind($this->smarty); /* * ПОДКЛЮЧАЕМ ПЛАГИНЫ */ PSSmartyPlugin::inst()->bind($this->smarty); }
public function buildContent() { $navigation = AdminPageNavigation::inst(); $RQ = GetArrayAdapter::inst(); $AL = PsProfiler::controller(); $PARAMS['enabled'] = ConfigIni::isProfilingEnabled(); $mode = null; if ($RQ->has('profiler')) { $mode = self::MODE_PROFILER; $profiler = $RQ->str('profiler'); $PARAMS['profilers'] = $AL->getStats($profiler); $navigation->addPath(self::url(), 'Профайлеры'); $navigation->setCurrent($profiler); } if (!$mode) { $mode = self::MODE_LIST; $PARAMS['profilers'] = $AL->getStats(); $navigation->setCurrent('Профайлеры'); } $PARAMS['mode'] = $mode; echo $this->getFoldedEntity()->fetchTpl($PARAMS); }
/** * Очистка всех логов */ public function clearLogs() { check_condition(!ConfigIni::isLoggingEnabled(), 'Cannot clear logs when logging is on.'); $this->DM()->clearDir(); }
/** * Метод сохраняет ошибку выполнения в файл * * @param Exception $exception */ public static function dumpError(Exception $exception, $additionalInfo = '') { if (ConfigIni::exceptionsMaxDumpCount() <= 0) { return; //--- } $additionalInfo = trim("{$additionalInfo}"); //Поставим защиту от двойного дампинга ошибки $SafePropName = 'ps_ex_dumped'; if (property_exists($exception, $SafePropName)) { return; //--- } $exception->{$SafePropName} = true; try { $INFO[] = 'SERVER: ' . (isset($_SERVER) ? print_r($_SERVER, true) : ''); $INFO[] = 'REQUEST: ' . (isset($_REQUEST) ? print_r($_REQUEST, true) : ''); $INFO[] = 'SESSION: ' . (isset($_SESSION) ? print_r($_SESSION, true) : ''); $INFO[] = 'FILES: ' . (isset($_FILES) ? print_r($_FILES, true) : ''); if ($additionalInfo) { $INFO[] = "ADDITIONAL:\n{$additionalInfo}\n"; } $INFO[] = 'STACK:'; $INFO[] = ExceptionHelper::formatStackFile($exception); $original = ExceptionHelper::extractOriginal($exception); $fname = get_file_name($original->getFile()); $fline = $original->getLine(); $DM = DirManager::autogen('exceptions'); if ($DM->getDirContentCnt() >= ConfigIni::exceptionsMaxDumpCount()) { $DM->clearDir(); } $DM->getDirItem(null, PsUtil::fileUniqueTime() . " [{$fname} {$fline}]", 'err')->putToFile(implode("\n", $INFO)); } catch (Exception $ex) { //Если в методе дампа эксепшена ошибка - прекращаем выполнение. die("Exception [{$exception->getMessage()}] dump error: [{$ex->getMessage()}]"); } }
/** * Загружает все таблицы, к которым может быть привязан кеш */ private static function getTablesWithCache($scope) { return to_array(ConfigIni::getPropCheckType(ConfigIni::GROUP_TABLE_CHANGE_TRIGGERS, 'tables', array(PsConst::PHP_TYPE_NULL, PsConst::PHP_TYPE_ARRAY), $scope)); }
/** * Определим функцию, которая выполнит все действия - не будем лишними переменными засорять глобальное пространство */ function psExecuteAjaxAction() { /* * Название действия должно быть в переменной запроса. Оно же - название класса, который будет выполнен. * Группа действия должны быть не обязательна, при определении действия группа нужна обязательно. */ $actionName = RequestArrayAdapter::inst()->str(AJAX_ACTION_PARAM); $actionGroup = RequestArrayAdapter::inst()->str(AJAX_ACTION_GROUP_PARAM, 'client'); if (!PsCheck::notEmptyString($actionName) || !PsCheck::notEmptyString($actionGroup)) { return json_error('Не передан код действия или его группа'); //--- } /* * Экземпляр класса действия - должен быть наследником AbstractAjaxAction */ $action = null; /* * Поищем в проектных действиях, они для нас имеют больший приоритет */ foreach (ConfigIni::ajaxActionsAbs($actionGroup) as $dirAbsPath) { $classPath = file_path($dirAbsPath, $actionName, PsConst::EXT_PHP); if (is_file($classPath)) { /* * Нашли файл. Загрузим и проверим, является ли он наследником AbstractAjaxAction */ require_once $classPath; if (!PsUtil::isInstanceOf($actionName, AbstractAjaxAction::getClassName())) { continue; //--- } $action = new $actionName(); break; //--- } } /* * Проверим, существует ли действие. * Для безопасности не будем писать детали обработки. */ if (!$action || !$action instanceof AbstractAjaxAction) { return json_error('Действие не опеределено'); //--- } /* * Выполняем */ $result = null; try { $result = $action->execute(); } catch (Exception $e) { $result = $e->getMessage(); } /* * Проверим результат */ if ($result instanceof AjaxSuccess) { json_success($result->getJsParams()); } else { json_error($result ? $result : 'Ошибка выполнения действия'); } }
private function __construct() { $this->CLASS = get_called_class(); $this->CACHE = new SimpleDataCache(); $this->DBTYPE = $this->isStoreToDb() ? $this->CLASS : null; $this->DIR_MANAGER = DirManager::inst(array(ConfigIni::uploadsDirRel(), $this->CLASS)); $this->LOGGER = PsLogger::inst($this->CLASS); $this->LOGGER->info('Instance created. Work with db ? {}. Is autonomous ? {}.', var_export($this->isStoreToDb(), true), var_export($this->isAutonomous(), true)); $this->LOGGER->info('Upload dir: [{}].', $this->DIR_MANAGER->relDirPath()); $this->LOGGER->info(); }
/** * Метод вызывается для выполнения периодических задач cron * * @return type */ public function execute() { if ($this->called) { return $this->executed; //--- } $this->called = true; $LOGGER = PsLogger::inst(__CLASS__); $LOGGER->info('Executing {}', __CLASS__); /* * Получим список классов, которые нужно выполнить */ $processes = ConfigIni::cronProcesses(); if (empty($processes)) { $LOGGER->info('No cron processes configured, fast return...'); return $this->executed; //--- } $processes = array_unique($processes); $LOGGER->info('Configured processes: {}', array_to_string($processes)); foreach ($processes as $class) { if (!PsUtil::isInstanceOf($class, 'PsCronProcess')) { PsUtil::raise("Class {$class} cannot be executed as cron process, it should be instance of PsCronProcess"); } } $locked = PsLock::lock(__CLASS__, false); $LOGGER->info('Lock accured ? {}', var_export($locked, true)); if (!$locked) { return $this->executed; //--- } $LOCKFILE = DirManager::autoNoDel(DirManager::DIR_SERVICE)->getDirItem(null, __CLASS__, PsConst::EXT_LOCK); $LOCKFILE_LIFETIME = $LOCKFILE->getFileLifetime(); $MAX_LIFETIME = 5 * 60; $NED_PROCESS = $LOCKFILE_LIFETIME === null || $LOCKFILE_LIFETIME > $MAX_LIFETIME; $LOGGER->info("Lock file {}: {}", $LOCKFILE_LIFETIME === null ? 'NOT EXISTS' : 'EXISTS', $LOCKFILE->getRelPath()); if ($LOCKFILE_LIFETIME !== null) { $LOGGER->info('Last modified: {} seconds ago. Max process delay: {} seconds.', $LOCKFILE_LIFETIME, $MAX_LIFETIME); // } if (!$NED_PROCESS) { $LOGGER->info('Skip execution.'); //Отпустим лок PsLock::unlock(); //Выходим return $this->executed; //--- } //Обновим время последнего выполнения $LOCKFILE->touch(); //Отпустим лок, так как внутри он может потребоваться для выполнения других действий, например для перестройки спрайтов PsLock::unlock(); $LOGGER->info(); $LOGGER->info('External process execution started...'); //Запускаем режим неограниченного выполнения PsUtil::startUnlimitedMode(); //Начинаем выполнение $this->executed = true; //Создаём профайлер $PROFILER = PsProfiler::inst(__CLASS__); //Создадим конфиг выполнения процесса $config = new PsCronProcessConfig(); //Пробегаемся по процессам и выполняем. При первой ошибке - выходим. foreach ($processes as $class) { $LOGGER->info('Executing cron process {}', $class); $PROFILER->start($class); try { $inst = new $class(); $inst->onCron($config); $secundomer = $PROFILER->stop(); $LOGGER->info(" > Cron process '{}' executed in {} seconds", $class, $secundomer->getTotalTime()); } catch (Exception $ex) { $PROFILER->stop(); $LOGGER->info(" > Cron process '{}' execution error: '{}'", $class, $ex->getMessage()); } } $LOGGER->info('Removing cron lock file.'); $LOCKFILE->remove(); return $this->executed; }
/** * Метод сохраняет последний удачно отправленный email */ private function dumpEmail() { if (ConfigIni::emailsMaxDumpCount() > 0) { $DM = DirManager::autogen('emails'); if ($DM->getDirContentCnt() >= ConfigIni::emailsMaxDumpCount()) { $DM->clearDir(); } $DM->getDirItem(null, PsUtil::fileUniqueTime(), 'mail')->putToFile($this); } }
/** * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги */ protected function __construct() { $this->LOGGER = PsLogger::inst(__CLASS__); $this->PROFILER = PsProfiler::inst(__CLASS__); /* * Инициалилизируем коллекцию */ $this->PROVIDERS = array(); /* * Собираем полный список доступных хранилищ и менеджеров фолдингов в них */ $providerClasses = ConfigIni::getPropCheckType(ConfigIni::GROUP_FOLDINGS, 'providers', array(PsConst::PHP_TYPE_ARRAY, PsConst::PHP_TYPE_NULL)); $providerClasses = to_array($providerClasses); $providerClasses[] = FoldingsProviderSdk::calledClass(); $this->LOGGER->info('Providers: {}', array_to_string($providerClasses)); foreach ($providerClasses as $provider) { if (in_array($provider, $this->PROVIDERS)) { $this->LOGGER->info('[-] {} - {}', $provider, 'is already registered'); continue; //--- } if (!class_exists($provider)) { $this->LOGGER->info('[-] {} - {}', $provider, 'is not included'); continue; //--- } if (!PsUtil::isInstanceOf($provider, FoldingsProviderAbstract::calledClass())) { $this->LOGGER->info('[-] {} - {}', $provider, 'is not instance of ' . FoldingsProviderAbstract::calledClass()); continue; //--- } $this->LOGGER->info('[+] {}', $provider); $this->PROVIDERS[] = $provider; /* * Для каждого хранилища загружаем список входящих в него фолдингов */ $this->PROFILER->start($provider . '::list'); /* @var $folding FoldedResources */ foreach ($provider::listFoldings() as $folding) { $funique = $folding->getUnique(); if (array_key_exists($funique, $this->UNIQUE_2_PROVIDER)) { raise_error(PsStrings::replaceWithBraced('Folding {} is provided by: {}, {}', $funique, $this->UNIQUE_2_PROVIDER[$funique], $provider)); } $this->LOGGER->info(' [>] {}', $funique); $this->UNIQUE_2_PROVIDER[$funique] = $provider; $this->UNIQUE_2_FOLDING[$funique] = $folding; } $this->PROFILER->stop(); } }
/** * Метод возвращает экземпляр класса, подключающего библиотеки. * Для переопределения этого класса, на уровне проектного config.ini * должен быть задан другой класс, отвечающий за подключение библиотек. * * Это позволит: * 1. Использовать стандартизованный метод подключения внешних библиотек * 2. Переопределить подключение библиотек из SDK */ public static final function inst() { if (isset(self::$inst)) { return self::$inst; //---- } /* * Получим название класса, отвечающего за подключение библиотек */ $class = ConfigIni::libsIncluder(); /* * Подготовим директории */ $SDK_LIB_DIR = DirManager::inst(PS_DIR_INCLUDES, DirManager::DIR_LIB)->absDirPath(); $PROJ_LIB_DIR = DirManager::inst(PS_DIR_ADDON, DirManager::DIR_LIB)->absDirPath(); /* * Класс подключения библиотек совпадает с базовым */ if (__CLASS__ == $class) { self::$inst = new PsLibs(); self::$inst->SDK_LIB_DIR = $SDK_LIB_DIR; self::$inst->LOGGER = PsLogger::inst($class); self::$inst->LOGGER->info('Libs includer SDK: [{}]', __FILE__); self::$inst->LOGGER->info('Libs directory SDK: [{}]', $SDK_LIB_DIR); return self::$inst; //--- } /* * Нам передан класс, который отличается от SDK */ $classPath = Autoload::inst()->getClassPath($class); if (!PsCheck::isNotEmptyString($classPath)) { return PsUtil::raise('Не удалось найти класс загрузчика библиотек [{}]', $class); } /* * Указанный класс должен быть наследником данного */ if (!PsUtil::isInstanceOf($class, __CLASS__)) { return PsUtil::raise('Указанный загрузчик библиотек [{}] не является наследником класса [{}]', $class, __CLASS__); } self::$inst = new $class(); self::$inst->SDK_LIB_DIR = $SDK_LIB_DIR; self::$inst->PROJ_LIB_DIR = $PROJ_LIB_DIR; self::$inst->LOGGER = PsLogger::inst($class); self::$inst->LOGGER->info('Libs includer CUSTOM: [{}]', $classPath); self::$inst->LOGGER->info('Libs directory SDK: [{}]', $SDK_LIB_DIR); self::$inst->LOGGER->info('Libs directory CUSTOM: [{}]', $PROJ_LIB_DIR); return self::$inst; //--- }
/** * Метод возвращает настройки подключения к БД * * @param type $connection * @param type $scope * @return PsConnectionParams */ public static function get($connection, $scope = ENTITY_SCOPE_ALL) { return new PsConnectionParams(ConfigIni::getPropCheckType(ConfigIni::GROUP_CONNECTIONS, $connection, array(PsConst::PHP_TYPE_ARRAY), $scope), "{$connection}/{$scope}"); }
$params = array('client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'response_type' => 'code'); echo urlencode(http_build_query($params)); //echo PsEnvironment::isIncluded(); //print_r(PsMathRebusSolver::solve('драма+драма=театр')); die; PSSmarty::smarty(); echo (new SmartyFunctions())->psctrl(array()); die; print_r(FoldedStorage::listFoldingUniques()); print_r(FoldedStorageInsts::listFoldingUniques()); die; var_dump(ConfigIni::projectSrcAdminDir()); br(); var_dump(ConfigIni::projectSrcCommonDir()); br(); var_dump(ConfigIni::projectGlobalsFilePath()); br(); new YouTubePluginAdmin(); die; ExceptionHandler::dumpError(new Exception('XXXX'), 'Additional info'); die; class X { protected function __construct() { echo 'X'; } } class Y extends X { function __construct()
public static function isProduction() { return ConfigIni::isProduction(); }
public function resetAll() { check_condition(!ConfigIni::isProfilingEnabled(), 'Cannot clear profilers when profiling is on.'); $this->dirManager->clearDir(); }
/** @return PsDefineVar */ public static final function NORMALIZE_PAGE() { return self::inst(PsDefines::TYPE_G, PsConst::PHP_TYPE_BOOLEAN, ConfigIni::isNormalizePage()); }
/** * Конструктор класса для работы с кешем. * Кеширование идёт в два этапа: * 1. Кеширование на уровне класса для максимально быстрого доступа * 2. Кеширование в долгосрочном хранилище, которое реализуется отдельным классом - "движком" кеширования * * Движок кеширования должен быть задан на уровне config.ini * * @return PSCache */ protected function __construct() { $this->LOGGER = PsLogger::inst(__CLASS__); /* * Получим название класса "движка" кеширования */ $class = ConfigIni::cacheEngine(); /* * Проверим наличие класса */ $classPath = Autoload::inst()->getClassPath($class); if (!PsCheck::isNotEmptyString($classPath)) { return PsUtil::raise('Не удалось найти класс для кеширования [{}]', $class); } /* * Правильный ли класс указан? */ if (!PsUtil::isInstanceOf($class, 'PSCacheEngine')) { return PsUtil::raise('Указанный класс кеширования [{}] не является наследником класса [{}]', $class, 'PSCacheEngine'); } $this->LOGGER->info('Используем движок кеширования: {}', $class); $this->CACHE_ENGINE = new $class(); }
/** * КОНСТРУКТОР */ private function __construct() { $this->LOGGER = self::getLogger(); $this->AUTOLOAD = array($this, 'load'); $this->COMMON_EXCLUDED_DI = DirManager::autogen('classpath')->getDirItem(null, 'excluded'); $this->SDK_SRC_DIR = PS_DIR_INCLUDES . DIR_SEPARATOR . DirManager::DIR_SRC . DIR_SEPARATOR; /* * Директория src/common должна быть подключена всегда */ $this->registerBaseDir($this->SDK_SRC_DIR . DirManager::DIR_COMMON); /* * Если проект, то подключим проектные общие ресурсы */ if (ConfigIni::isProject()) { $this->registerBaseDir(ConfigIni::projectSrcCommonDir(), false); } }
/** * Возвращает минимальный интервал между действиями. */ public static function ACTIVITY_INTERVAL() { return AuthManager::isAuthorizedAsAdmin() ? 0 : ConfigIni::userActivityInterval(); }
/** * Метод возвращает экземпляр класса-плагина Smarty. * Для переопределения этого класса, на уровне проектного config.ini * должен быть задан другой класс. * * Это позволит использовать стандартизованный метод подключения плагинов */ public static final function inst() { if (isset(self::$inst)) { return self::$inst; //---- } /* * Получим название класса */ $class = ConfigIni::smartyPlugin(); /* * Класс подключения библиотек совпадает с базовым */ if (__CLASS__ == $class) { return self::$inst = new PSSmartyPlugin(); } /* * Нам передан класс, который отличается от SDK */ $classPath = Autoload::inst()->getClassPath($class); if (!PsCheck::isNotEmptyString($classPath)) { return PsUtil::raise('Не удалось найти класс плагинов Smarty [{}]', $class); } /* * Указанный класс должен быть наследником данного */ if (!PsUtil::isInstanceOf($class, __CLASS__)) { return PsUtil::raise('Указанный плагин Smarty [{}] не является наследником класса [{}]', $class, __CLASS__); } return self::$inst = new $class(); }
/** * Метод подключает файл глобальных настроек */ public static function init() { if (ConfigIni::isProject() && self::inst()->exists()) { require_once self::inst()->DI->getAbsPath(); } }