Exemple #1
0
 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();
 }
Exemple #3
0
 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;
         //---
     }
 }
Exemple #5
0
 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);
 }
Exemple #6
0
 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();
 }
Exemple #8
0
 /**
  * Метод валидирует все доступные 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);
 }
Exemple #10
0
 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);
 }
Exemple #11
0
 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);
 }
Exemple #12
0
 /**
  * Очистка всех логов
  */
 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()}]");
     }
 }
Exemple #14
0
 /**
  * Загружает все таблицы, к которым может быть привязан кеш
  */
 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));
 }
Exemple #15
0
/**
 * Определим функцию, которая выполнит все действия - не будем лишними переменными засорять глобальное пространство
 */
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 : 'Ошибка выполнения действия');
    }
}
Exemple #16
0
 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();
 }
Exemple #17
0
 /**
  * Метод вызывается для выполнения периодических задач 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;
 }
Exemple #18
0
 /**
  * Метод сохраняет последний удачно отправленный 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);
     }
 }
Exemple #19
0
 /**
  * В конструкторе пробежимся по всем хранилищам и соберём все фолдинги
  */
 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();
     }
 }
Exemple #20
0
 /**
  * Метод возвращает экземпляр класса, подключающего библиотеки.
  * Для переопределения этого класса, на уровне проектного 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}");
 }
Exemple #22
0
$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()
Exemple #23
0
 public static function isProduction()
 {
     return ConfigIni::isProduction();
 }
Exemple #24
0
 public function resetAll()
 {
     check_condition(!ConfigIni::isProfilingEnabled(), 'Cannot clear profilers when profiling is on.');
     $this->dirManager->clearDir();
 }
Exemple #25
0
 /** @return PsDefineVar */
 public static final function NORMALIZE_PAGE()
 {
     return self::inst(PsDefines::TYPE_G, PsConst::PHP_TYPE_BOOLEAN, ConfigIni::isNormalizePage());
 }
Exemple #26
0
 /**
  * Конструктор класса для работы с кешем.
  * Кеширование идёт в два этапа:
  * 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();
 }
Exemple #27
0
 /**
  * КОНСТРУКТОР
  */
 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);
     }
 }
Exemple #28
0
 /**
  * Возвращает минимальный интервал между действиями.
  */
 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();
 }
Exemple #30
0
 /**
  * Метод подключает файл глобальных настроек
  */
 public static function init()
 {
     if (ConfigIni::isProject() && self::inst()->exists()) {
         require_once self::inst()->DI->getAbsPath();
     }
 }