Index: branches/RC/core/kernel/utility/unit_config_reader.php
===================================================================
diff -u -N
--- branches/RC/core/kernel/utility/unit_config_reader.php (revision 11892)
+++ branches/RC/core/kernel/utility/unit_config_reader.php (revision 0)
@@ -1,925 +0,0 @@
-_directorySeparator = preg_quote(DIRECTORY_SEPARATOR);
- $this->_skipFolders[] = trim(WRITEBALE_BASE, '/'); // system folder (where web server can write)
- $this->_skipFolders[] = array_pop( explode('/', trim(EDITOR_PATH, '/')) ); // last of cmseditor folders
- }
-
- function CacheParsedData()
- {
- $event_manager =& $this->Application->recallObject('EventManager');
- $aggregator =& $this->Application->recallObject('TagsAggregator', 'kArray');
-
- $config_vars = Array (
- 'SessionTimeout',
- 'SessionCookieName',
- 'SessionReferrerCheck',
- 'CookieSessions',
- 'UseCronForRegularEvent',
- 'User_GuestGroup',
- 'User_LoggedInGroup',
- 'SessionTimeout',
- 'UseModRewrite',
- 'UseOutputCompression',
- 'OutputCompressionLevel',
- 'KeepSessionOnBrowserClose',
- 'Config_Server_Time',
- 'Config_Site_Time',
- 'UseChangeLog',
- );
-
- foreach ($config_vars as $var) {
- $this->Application->ConfigValue($var);
- }
-
- $cache = Array(
- 'Factory.Files' => $this->Application->Factory->Files,
- 'Factory.realClasses' => $this->Application->Factory->realClasses,
- 'Factory.Dependencies' => $this->Application->Factory->Dependencies,
- 'ConfigReader.prefixFiles' => $this->prefixFiles,
- 'EventManager.buildEvents' => $event_manager->buildEvents,
- 'EventManager.beforeRegularEvents' => $event_manager->beforeRegularEvents,
- 'EventManager.afterRegularEvents' => $event_manager->afterRegularEvents,
- 'EventManager.beforeHooks' => $event_manager->beforeHooks,
- 'EventManager.afterHooks' => $event_manager->afterHooks,
- 'TagsAggregator.data' => $aggregator->_Array,
-
- // the following caches should be reset based on admin interaction (adjusting config, enabling modules etc)
- 'Application.Caches.ConfigVariables' => $this->Application->Caches['ConfigVariables'],
- 'Application.ConfigCacheIds' => $this->Application->ConfigCacheIds,
- 'Application.ConfigHash' => $this->Application->ConfigHash,
- 'Application.ReplacementTemplates' => $this->Application->ReplacementTemplates,
- 'Application.ModuleInfo' => $this->Application->ModuleInfo,
- );
-
- $conn =& $this->Application->GetADODBConnection();
- if (isset($this->Application->Memcached)) {
- $this->Application->Memcached->set('master:configs_parsed', serialize($cache));
- $this->Application->Memcached->set('master:config_files', serialize($this->configFiles));
- }
- else {
- $conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("configs_parsed", '.$conn->qstr(serialize($cache)).', '.adodb_mktime().')');
- $conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("config_files", '.$conn->qstr(serialize($this->configFiles)).', '.adodb_mktime().')');
- }
-
- $cache_rebuild_by = SERVER_NAME . ' (' . getenv('REMOTE_ADDR') . ') - ' . adodb_date('d/m/Y H:i:s');
- $conn->Query('REPLACE ' . TABLE_PREFIX . 'Cache (VarName, Data, Cached) VALUES ("last_cache_rebuild", ' . $conn->qstr($cache_rebuild_by) . ', ' . adodb_mktime() . ')');
-
- unset($this->configFiles);
- }
-
- function RestoreParsedData()
- {
- $conn =& $this->Application->GetADODBConnection();
- if (!isset($this->Application->Memcached) || !($data = $this->Application->Memcached->get('master:configs_parsed'))) {
- $data = $conn->GetOne('SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "configs_parsed"');
- }
- if ($data) {
- $cache = unserialize($data);
- $this->Application->Factory->Files = $cache['Factory.Files'];
- $this->Application->Factory->realClasses = $cache['Factory.realClasses'];
- $this->Application->Factory->Dependencies = $cache['Factory.Dependencies'];
- $this->prefixFiles = $cache['ConfigReader.prefixFiles'];
-
- $event_manager =& $this->Application->recallObject('EventManager');
- $event_manager->buildEvents = $cache['EventManager.buildEvents'];
- $event_manager->beforeRegularEvents = $cache['EventManager.beforeRegularEvents'];
- $event_manager->afterRegularEvents = $cache['EventManager.afterRegularEvents'];
- $event_manager->beforeHooks = $cache['EventManager.beforeHooks'];
- $event_manager->afterHooks = $cache['EventManager.afterHooks'];
-
- $aggregator =& $this->Application->recallObject('TagsAggregator', 'kArray');
- $aggregator->_Array = $cache['TagsAggregator.data'];
-
- $this->Application->ConfigHash = $cache['Application.ConfigHash'];
-
- $this->Application->Caches['ConfigVariables'] = $cache['Application.ConfigCacheIds'];
- $this->Application->ConfigCacheIds = $cache['Application.ConfigCacheIds'];
-
- $this->Application->ReplacementTemplates = $cache['Application.ReplacementTemplates'];
-
- $this->Application->ModuleInfo = $cache['Application.ModuleInfo'];
-
- return true;
-
- }
- else return false;
- }
-
- function ResetParsedData($include_sections = false)
- {
- $conn =& $this->Application->GetADODBConnection();
- $conn->Query('DELETE FROM '.TABLE_PREFIX.'Cache WHERE VarName = "configs_parsed"');
- if (isset($this->Application->Memcached)) {
- $this->Application->Memcached->delete('master:configs_parsed');
- }
-
- if ($include_sections) {
- $conn->Query('DELETE FROM '.TABLE_PREFIX.'Cache WHERE VarName = "sections_parsed"');
- if (isset($this->Application->Memcached)) {
- $this->Application->Memcached->delete('master:sections_parsed');
- }
- }
- }
-
- function scanModules($folderPath, $cache = true)
- {
- if (defined('IS_INSTALL') && IS_INSTALL && !defined('FORCE_CONFIG_CACHE')) {
- // disable config caching during installation
- $cache = false;
- }
-
- if ($cache) {
- $restored = $this->RestoreParsedData();
- if ($restored) return;
- }
-
- $this->ProcessAllConfigs = true;
-
- $this->includeConfigFiles($folderPath, $cache);
- $this->ParseConfigs();
-
- // tell AfterConfigRead to store cache if neede
- // can't store it here beacuse AfterConfigRead needs ability to change config data
- $this->StoreCache = $cache;
- }
-
- function findConfigFiles($folderPath, $level = 0)
- {
- /*if ($level == 0) {
- if ($this->Application->isDebugMode()) {
- $start_time = getmicrotime();
- $this->Application->Debugger->appendHTML('kUnitConfigReader::findConfigFiles("' . $folderPath . '")');
- $this->Application->Debugger->appendTrace();
- }
- }*/
-
- // if FULL_PATH = "/" ensure, that all "/" in $folderPath are not deleted
- $reg_exp = '/^' . preg_quote(FULL_PATH, '/') . '/';
- $folderPath = preg_replace($reg_exp, '', $folderPath, 1); // this make sense, since $folderPath may NOT contain FULL_PATH
-
- $base_folder = FULL_PATH . $folderPath . DIRECTORY_SEPARATOR;
- $sub_folders = glob($base_folder . '*', GLOB_ONLYDIR);
-
- if ($level == 0) {
- // don't scan Front-End themes because of extensive directory structure
- $sub_folders = array_diff($sub_folders, Array ($base_folder . 'themes', $base_folder . 'tools'));
- }
-
- foreach ($sub_folders as $full_path) {
- $sub_folder = substr($full_path, strlen($base_folder));
-
- if (in_array($sub_folder, $this->_skipFolders)) {
- continue;
- }
-
- if (preg_match('/^\./', $sub_folder)) {
- // don't scan ".folders"
- continue;
- }
-
- if (file_exists(FULL_PATH . $this->getConfigName($folderPath . DIRECTORY_SEPARATOR . $sub_folder))) {
- $this->configFiles[] = $this->getConfigName($folderPath . DIRECTORY_SEPARATOR . $sub_folder);
- }
-
- $this->findConfigFiles($full_path, $level + 1);
- }
-
- /*if ($level == 0) {
- if ($this->Application->isDebugMode()) {
- $this->Application->Debugger->appendHTML('kUnitConfigReader::findConfigFiles("' . FULL_PATH . $folderPath . '"): ' . (getmicrotime() - $start_time));
- }
- }*/
- }
-
- function includeConfigFiles($folderPath, $cache = true)
- {
- $this->Application->refreshModuleInfo();
-
- $conn =& $this->Application->GetADODBConnection();
- if (!isset($this->Application->Memcached) || !($data = $this->Application->Memcached->get('master:config_files'))) {
- $data = $conn->GetOne('SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "config_files"');
- }
- if ($cache && $data) {
- $this->configFiles = unserialize($data);
- shuffle($this->configFiles);
- }
- else {
- $old_kernel_path = FULL_PATH . DIRECTORY_SEPARATOR . 'kernel' . DIRECTORY_SEPARATOR . 'kernel4';
- if (file_exists($old_kernel_path)) {
- // when we got both kernel (one from "kernel/kernel4" and other from "core/kernel") version after upgrade
- die('Please remove "' . $old_kernel_path . '" folder.');
- }
-
- $this->findConfigFiles($folderPath); // search from base directory
- }
-
- foreach ($this->configFiles as $filename)
- {
- $prefix = $this->PreloadConfigFile($filename);
- if (!$prefix) {
- trigger_error('Prefix not defined in config file '.$filename, E_USER_ERROR);
- }
- }
- }
-
- /**
- * Process all read config files - called ONLY when there is no cache!
- *
- */
- function ParseConfigs()
- {
- // 1. process normal configs and their dependencies
- $prioritized_configs = array();
- foreach ($this->configData as $prefix => $config) {
- if (isset($config['ConfigPriority'])) {
- $prioritized_configs[$prefix] = $config['ConfigPriority'];
- continue;
- }
- $this->parseConfig($prefix);
- }
-
- foreach ($this->configData as $prefix => $config) {
- $this->ProcessDependencies($prefix);
- $this->postProcessConfig($prefix, 'AggregateConfigs', 'sub_prefix');
- $clones = $this->postProcessConfig($prefix, 'Clones', 'prefix');
- }
-
- // 2. process prioritized configs and their dependencies
- asort($prioritized_configs);
- foreach ($prioritized_configs as $prefix => $priority) {
- $this->parseConfig($prefix);
- }
-
- foreach ($prioritized_configs as $prefix => $priority) {
- $this->ProcessDependencies($prefix);
- }
- }
-
- function AfterConfigRead($store_cache = null)
- {
-// if (!$this->ProcessAllConfigs) return ;
- $this->FinalStage = true;
- foreach ($this->configData as $prefix => $config) {
- if (in_array($prefix, $this->AfterConfigProcessed)) {
- continue;
- }
-
- $this->Application->HandleEvent( new kEvent($prefix.':OnAfterConfigRead') );
- $this->AfterConfigProcessed[] = $prefix;
- }
-
- if (!isset($store_cache)) {
- // store cache not overrided -> use global setting
- $store_cache = $this->StoreCache;
- }
-
- if ($store_cache || (defined('IS_INSTALL') && IS_INSTALL)) {
- // cache is not stored during install, but dynamic clones should be processed in any case
- $this->processDynamicClones();
- }
-
- if ($store_cache) {
- $this->CacheParsedData();
-
- if ($this->Application->isDebugMode(false) && constOn('DBG_VALIDATE_CONFIGS')) {
- // validate configs here to have changes from OnAfterConfigRead hooks to prefixes
- foreach ($this->configData as $prefix => $config) {
- if (!isset($config['TableName'])) continue;
- $this->ValidateConfig($prefix);
- }
- }
-
- $after_event = new kEvent('adm:OnAfterCacheRebuild');
- $this->Application->HandleEvent($after_event);
- }
- }
-
- /**
- * Re-reads all configs
- *
- */
- function ReReadConfigs()
- {
- // clear restored cache (not in db)
- $this->Application->Factory->Files = Array ();
- $this->Application->Factory->realClasses = Array ();
- $this->Application->Factory->Dependencies = Array ();
-
- $this->Application->EventManager->beforeRegularEvents = Array ();
- $this->Application->EventManager->afterRegularEvents = Array ();
- $this->Application->EventManager->beforeHooks = Array ();
- $this->Application->EventManager->afterHooks = Array ();
-
- // otherwise ModulesHelper indirectly used from includeConfigFiles won't work
- $this->Application->RegisterDefaultClasses();
-
- // parse all configs
- $this->ProcessAllConfigs = true;
- $this->includeConfigFiles(MODULES_PATH, false);
- $this->ParseConfigs();
- $this->AfterConfigRead(false);
- $this->processDynamicClones();
- }
-
- /**
- * Process clones, that were defined via OnAfterConfigRead event
- *
- */
- function processDynamicClones()
- {
- $new_clones = Array();
- foreach ($this->configData as $prefix => $config) {
- $clones = $this->postProcessConfig($prefix, 'Clones', 'prefix');
- if ($clones) {
- $new_clones = array_merge($new_clones, $clones);
- }
- }
-
- // call OnAfterConfigRead for cloned configs
- $new_clones = array_unique($new_clones);
- foreach ($new_clones as $prefix) {
- if (in_array($prefix, $this->AfterConfigProcessed)) {
- continue;
- }
-
- $this->Application->HandleEvent( new kEvent($prefix.':OnAfterConfigRead') );
- $this->AfterConfigProcessed[] = $prefix;
- }
- }
-
- /**
- * Register nessasary classes
- * This method should only process the data which is cached!
- *
- * @param string $prefix
- * @access private
- */
- function parseConfig($prefix)
- {
- $config =& $this->configData[$prefix];
- $event_manager =& $this->Application->recallObject('EventManager');
-
- $register_classes = getArrayValue($config,'RegisterClasses');
- if (!$register_classes) $register_classes = Array();
- $class_params=Array('ItemClass','ListClass','EventHandlerClass','TagProcessorClass');
- foreach($class_params as $param_name)
- {
- if ( !(isset($config[$param_name]) ) ) continue;
- $config[$param_name]['pseudo'] = $this->getPrefixByParamName($param_name,$prefix);
- $register_classes[] = $config[$param_name];
- }
-
- foreach($register_classes as $class_info)
- {
- $require_classes = getArrayValue($class_info, 'require_classes');
- if ($require_classes) {
- if (!is_array($require_classes)) {
- $require_classes = array($require_classes);
- }
- if (!isset($config['_Dependencies'][$class_info['class']])) {
- $config['_Dependencies'][$class_info['class']] = array();
- }
- $config['_Dependencies'][$class_info['class']] = array_merge($config['_Dependencies'][$class_info['class']], $require_classes);
- }
-
- $this->Application->registerClass(
- $class_info['class'],
- $config['BasePath'] . DIRECTORY_SEPARATOR . $class_info['file'],
- $class_info['pseudo']/*,
- getArrayValue($class_info, 'require_classes')*/
- );
- if (getArrayValue($class_info, 'build_event')) {
- $event_manager->registerBuildEvent($class_info['pseudo'],$class_info['build_event']);
- }
- }
-
- $regular_events = getArrayValue($config, 'RegularEvents');
- if($regular_events)
- {
- foreach($regular_events as $short_name => $regular_event_info)
- {
- $event_manager->registerRegularEvent( $short_name, $config['Prefix'].':'.$regular_event_info['EventName'], $regular_event_info['RunInterval'], $regular_event_info['Type'] );
- }
- }
-
- $hooks = getArrayValue($config, 'Hooks');
- if (is_array($hooks) && count($hooks) > 0) {
- foreach ($hooks as $hook) {
- if (isset($config['ParentPrefix']) && $hook['HookToPrefix'] == $config['ParentPrefix']) {
- trigger_error('Depricated Hook Usage [prefix: '.$config['Prefix'].'; do_prefix: '.$hook['DoPrefix'].'] use #PARENT# as HookToPrefix value, where HookToPrefix is same as ParentPrefix', E_USER_NOTICE);
- }
-
- if ($hook['HookToPrefix'] == '') {
- $hook['HookToPrefix'] = $config['Prefix']; // new: set hooktoprefix to current prefix if not set
- }
-
- if (isset($config['ParentPrefix'])) {
- // new: allow to set hook to parent prefix what ever it is
- if ($hook['HookToPrefix'] == '#PARENT#') {
- $hook['HookToPrefix'] = $config['ParentPrefix'];
- }
-
- if ($hook['DoPrefix'] == '#PARENT#') {
- $hook['DoPrefix'] = $config['ParentPrefix'];
- }
- }
- elseif ($hook['HookToPrefix'] == '#PARENT#' || $hook['DoPrefix'] == '#PARENT#') {
- continue; // we need parent prefix but it's not set !
- }
-
- $do_prefix = $hook['DoPrefix'] == '' ? $config['Prefix'] : $hook['DoPrefix'];
-
- if ( !is_array($hook['HookToEvent']) ) {
- $hook_events = Array( $hook['HookToEvent'] );
- }
- else {
- $hook_events = $hook['HookToEvent'];
- }
- foreach ($hook_events as $hook_event) {
- $this->Application->registerHook($hook['HookToPrefix'], $hook['HookToSpecial'], $hook_event, $hook['Mode'], $do_prefix, $hook['DoSpecial'], $hook['DoEvent'], $hook['Conditional']);
- }
- }
- }
-
- if ( is_array(getArrayValue($config, 'AggregateTags')) ) {
- foreach ($config['AggregateTags'] as $aggregate_tag) {
- if (isset($config['ParentPrefix'])) {
- if ($aggregate_tag['AggregateTo'] == $config['ParentPrefix']) {
- trigger_error('Depricated Aggregate Tag Usage [prefix: '.$config['Prefix'].'; AggregateTo: '.$aggregate_tag['AggregateTo'].'] use #PARENT# as AggregateTo value, where AggregateTo is same as ParentPrefix', E_USER_NOTICE);
- }
-
- if ($aggregate_tag['AggregateTo'] == '#PARENT#') {
- $aggregate_tag['AggregateTo'] = $config['ParentPrefix'];
- }
- }
- $aggregate_tag['LocalPrefix'] = $config['Prefix'];
- $this->Application->registerAggregateTag($aggregate_tag);
- }
- }
-
- if (isset($config['ReplacementTemplates']) && $config['ReplacementTemplates']) {
- // replacement templates defined in this config
- $this->Application->ReplacementTemplates = array_merge_recursive2($this->Application->ReplacementTemplates, $config['ReplacementTemplates']);
- }
- }
-
- function ValidateConfig($prefix)
- {
- global $debugger;
-
- $config =& $this->configData[$prefix];
-
- $tablename = $config['TableName'];
- $float_types = Array ('float', 'double', 'numeric');
- $conn =& $this->Application->GetADODBConnection();
-
- $table_found = $conn->Query('SHOW TABLES LIKE "'.$tablename.'"');
- if (!$table_found) {
- // config present, but table missing, strange
- $debugger->appendHTML("Config Warning: Table $tablename missing, but prefix ".$config['Prefix']." requires it!");
- safeDefine('DBG_RAISE_ON_WARNINGS', 1);
- return ;
- }
-
- $res = $conn->Query('DESCRIBE '.$tablename);
- $config_link = $debugger->getFileLink(FULL_PATH.$this->prefixFiles[$config['Prefix']], 1, $config['Prefix']);
-
- $error_messages = Array (
- 'field_not_found' => 'Field %s exists in the database, but is not defined in config',
- 'default_missing' => 'Default value for field %s not set in config',
- 'not_null_error1' => 'Field %s is NOT NULL in the database, but is not configured as not_null', // or required',
- 'not_null_error2' => 'Field %s is described as NOT NULL in config, but does not have DEFAULT value',
- 'not_null_error3' => 'Field %s is described as NOT NULL in config, but is NULL in db',
- 'invalid_default' => 'Default value for field %s%s not sync. to db (in config = %s, in db = %s)',
- 'type_missing' => 'Type definition for field %s missing in config',
- );
-
- $config_errors = Array ();
- $tablename = preg_replace('/^'.preg_quote(TABLE_PREFIX, '/').'(.*)/', '\\1', $tablename); // remove table prefix
-
- foreach ($res as $field) {
- $f_name = $field['Field'];
-
- if (getArrayValue($config, 'Fields')) {
- if (preg_match('/l[\d]+_[\w]/', $f_name)) {
- // skip multilingual fields
- continue;
- }
-
- if (!array_key_exists ($f_name, $config['Fields'])) {
- $config_errors[] = sprintf($error_messages['field_not_found'], $f_name);
- }
- else {
- if (is_numeric($field['Default'])) {
- $field['Default'] = preg_match('/[\.,]/', $field['Default']) ? (float)$field['Default'] : (int)$field['Default'];
- }
-
- $options = $config['Fields'][$f_name];
- $default_missing = false;
- if (!array_key_exists('default', $options)) {
- $config_errors[] = sprintf($error_messages['default_missing'], $f_name);
- $default_missing = true;
- }
-
- if ($field['Null'] != 'YES') {
- // field is NOT NULL in database (MySQL5 for null returns "NO", but MySQL4 returns "")
- if ( $f_name != $config['IDField'] && !isset($options['not_null']) /*&& !isset($options['required'])*/ ) {
- $config_errors[] = sprintf($error_messages['not_null_error1'], $f_name);
- }
- if (isset($options['not_null']) && $options['not_null'] && !isset($options['default']) ) {
- $config_errors[] = sprintf($error_messages['not_null_error2'], $f_name);
- }
- }
- else {
- if (isset($options['not_null']) && $options['not_null']) {
- $config_errors[] = sprintf($error_messages['not_null_error3'], $f_name);
- }
- }
-
- if (!array_key_exists('type', $options)) {
- $config_errors[] = sprintf($error_messages['type_missing'], $f_name);
- }
-
- if (!$default_missing) {
- if ($f_name == $config['IDField'] && $options['type'] != 'string' && $options['default'] !== 0) {
- $config_errors[] = sprintf($error_messages['invalid_default'], 'IDField ', $f_name, $this->varDump($options['default']), $this->varDump($field['Default']));
- }
- else if ($options['default'] != '#NOW#' && $field['Default'] !== $options['default'] && !in_array($options['type'], $float_types)) {
- $config_errors[] = sprintf($error_messages['invalid_default'], '', $f_name, $this->varDump($options['default']), $this->varDump($field['Default']));
- }
- }
- }
- }
- }
-
- if ($config_errors) {
- $error_prefix = 'Config Error'.(count($config_errors) > 1 ? 's' : '').': for prefix '.$config_link.' ('.$tablename.') in unit config:
';
- $config_errors = $error_prefix.' '.implode('
', $config_errors);
-
- $debugger->appendHTML($config_errors);
- safeDefine('DBG_RAISE_ON_WARNINGS', 1);
- }
- }
-
- function varDump($value)
- {
- return ''.var_export($value, true).' of '.gettype($value);
- }
-
- function ProcessDependencies($prefix)
- {
- $config =& $this->configData[$prefix];
- $deps = getArrayValue($config, '_Dependencies');
- if (!$deps) return ;
-
- foreach ($deps as $real_class => $requires) {
- foreach ($requires as $class) {
- $this->Application->registerDependency($real_class, $class);
- }
- }
- unset($config['_Dependencies']);
- }
-
- function postProcessConfig($prefix, $config_key, $dst_prefix_var)
- {
- $main_config =& $this->configData[$prefix];
- $sub_configs = isset($main_config[$config_key]) && $main_config[$config_key] ? $main_config[$config_key] : false; // getArrayValue($main_config, $config_key);
- if (!$sub_configs) {
- return array();
- }
- unset($main_config[$config_key]);
-
- $processed = array();
- foreach ($sub_configs as $sub_prefix => $sub_config) {
- if ($config_key == 'AggregateConfigs' && !isset($this->configData[$sub_prefix])) {
- $this->loadConfig($sub_prefix);
- }
- $sub_config['Prefix'] = $sub_prefix;
- $this->configData[$sub_prefix] = array_merge_recursive2($this->configData[$$dst_prefix_var], $sub_config);
-
- // when merging empty array to non-empty results non-empty array, but empty is required
- foreach ($sub_config as $sub_key => $sub_value) {
- if (!$sub_value) {
- unset($this->configData[$sub_prefix][$sub_key]);
- }
- }
- if ($config_key == 'Clones') {
- $this->prefixFiles[$sub_prefix] = $this->prefixFiles[$prefix];
- }
-
- $this->postProcessConfig($sub_prefix, $config_key, $dst_prefix_var);
- if ($config_key == 'AggregateConfigs') {
- $processed = array_merge($this->postProcessConfig($sub_prefix, 'Clones', 'prefix'), $processed);
- }
- elseif ($this->ProcessAllConfigs) {
- $this->parseConfig($sub_prefix);
- }
- array_push($processed, $sub_prefix);
- }
-
- if (!$prefix) {
- // configs, that used only for cloning & not used ifself
- unset($this->configData[$prefix]);
- }
- return array_unique($processed);
- }
-
- function PreloadConfigFile($filename)
- {
- $config_found = file_exists(FULL_PATH.$filename) && $this->configAllowed($filename);
-
- if (defined('DEBUG_MODE') && DEBUG_MODE && defined('DBG_PROFILE_INCLUDES') && DBG_PROFILE_INCLUDES) {
- if ( in_array($filename, get_required_files()) ) {
- return;
- }
-
- global $debugger;
-
- if ($config_found) {
- $file = FULL_PATH . $filename;
- $file_crc = crc32($file);
-
- $debugger->ProfileStart('inc_' . $file_crc, $file);
- include_once($file);
- $debugger->ProfileFinish('inc_' . $file_crc);
- $debugger->profilerAddTotal('includes', 'inc_' . $file_crc);
- }
- }
- elseif ($config_found) {
- include_once(FULL_PATH . $filename);
- }
-
- if ($config_found) {
- if (isset($config) && $config) {
- // config file is included for 1st time -> save it's content for future processing
- $prefix = array_key_exists('Prefix', $config) ? $config['Prefix'] : '';
-
- preg_match('#' . $this->_directorySeparator . '(.*)' . $this->_directorySeparator . '#U', $filename, $rets);
- $config['ModuleFolder'] = $rets[1];
- $config['BasePath'] = dirname(FULL_PATH . $filename);
-
- if (array_key_exists('AdminTemplatePath', $config)) {
- // append template base folder for admin templates path of this prefix
- $module_templates = $rets[1] == 'core' ? '' : $rets[1] . '/';
- $config['AdminTemplatePath'] = $module_templates . $config['AdminTemplatePath'];
- }
-
- $this->configData[$prefix] = $config;
- $this->prefixFiles[$prefix] = $filename;
- return $prefix;
- }
- elseif ($prefix = array_search($filename, $this->prefixFiles)) {
- // attempt is made to include config file twice or more, but include_once prevents that,
- // but file exists on hdd, then it is already saved to all required arrays, just return it's prefix
- return $prefix;
- }
- }
-
- return 'dummy';
- }
-
- function loadConfig($prefix)
- {
- if (!isset($this->prefixFiles[$prefix])) {
- if ($this->Application->isDebugMode()) $this->Application->Debugger->appendTrace();
- trigger_error('Configuration file for prefix '.$prefix.' is unknown', E_USER_ERROR);
- return ;
- }
- $file = $this->prefixFiles[$prefix];
- $prefix = $this->PreloadConfigFile($file);
-
- $clones = $this->postProcessConfig($prefix, 'AggregateConfigs', 'sub_prefix');
- $clones = array_merge($this->postProcessConfig($prefix, 'Clones', 'prefix'), $clones);
-
- if ($this->FinalStage) {
- array_unshift($clones, $prefix);
- $clones = array_unique($clones);
- foreach ($clones as $a_prefix) {
- $this->Application->HandleEvent( new kEvent($a_prefix.':OnAfterConfigRead') );
- }
- }
- }
-
- /**
- * Reads unit (specified by $prefix)
- * option specified by $option
- *
- * @param string $prefix
- * @param string $name
- * @param mixed $default
- * @return string
- * @access public
- */
- function getUnitOption($prefix, $name, $default = false)
- {
- if (preg_match('/(.*)\.(.*)/', $prefix, $rets)) {
- if (!isset($this->configData[$rets[1]])) {
- $this->loadConfig($rets[1]);
- }
- $ret = isset($this->configData[$rets[1]][$name][$rets[2]]) ? $this->configData[$rets[1]][$name][$rets[2]] : false;
-// $ret = getArrayValue($this->configData, $rets[1], $name, $rets[2]);
- }
- else {
- if (!isset($this->configData[$prefix])) {
- $this->loadConfig($prefix);
- }
- $ret = isset($this->configData[$prefix][$name]) ? $this->configData[$prefix][$name] : false;
-// $ret = getArrayValue($this->configData, $prefix, $name);
- }
- return $ret === false ? $default : $ret;
- }
-
- /**
- * Read all unit with $prefix options
- *
- * @param string $prefix
- * @return Array
- * @access public
- */
- function getUnitOptions($prefix)
- {
- if (!isset($this->configData[$prefix])) {
- $this->loadConfig($prefix);
- }
-
- return $this->configData[$prefix];
- }
-
- /**
- * Set's new unit option value
- *
- * @param string $prefix
- * @param string $name
- * @param string $value
- * @access public
- */
- function setUnitOption($prefix, $name, $value)
- {
- if (preg_match('/(.*)\.(.*)/', $prefix, $rets)) {
- if (!isset($this->configData[$rets[1]])) {
- $this->loadConfig($rets[1]);
- }
- $this->configData[$rets[1]][$name][$rets[2]] = $value;
- }
- else {
- if (!isset($this->configData[$prefix])) {
- $this->loadConfig($prefix);
- }
- $this->configData[$prefix][$name] = $value;
- }
-
- }
-
- function getPrefixByParamName($paramName,$prefix)
- {
- $pseudo_class_map=Array(
- 'ItemClass'=>'%s',
- 'ListClass'=>'%s_List',
- 'EventHandlerClass'=>'%s_EventHandler',
- 'TagProcessorClass'=>'%s_TagProcessor'
- );
- return sprintf($pseudo_class_map[$paramName],$prefix);
- }
-
- /**
- * Get's config file name based
- * on folder name supplied
- *
- * @param string $folderPath
- * @return string
- * @access private
- */
- function getConfigName($folderPath)
- {
- return $folderPath . DIRECTORY_SEPARATOR . basename($folderPath) . '_config.php';
- }
-
- /**
- * Checks if config file is allowed for includion (if module of config is installed)
- *
- * @param string $config_path relative path from in-portal directory
- */
- function configAllowed($config_path)
- {
- if (defined('IS_INSTALL') && IS_INSTALL) {
- // at installation start no modules in db and kernel configs could not be read
- return true;
- }
-
- if (preg_match('#' . $this->_directorySeparator . 'plugins' . $this->_directorySeparator . '|' . $this->_directorySeparator . 'core#', $config_path)) {
- // always allow to include configs from core and plugins folder
- return true;
- }
-
- $module_found = false;
- if (!$this->Application->ModuleInfo) {
- return false;
- }
-
- foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
- $module_path = DIRECTORY_SEPARATOR . trim($module_info['Path'], '/') . DIRECTORY_SEPARATOR;
-
- // config file path starts with module folder path
- if (substr($config_path, 0, strlen($module_path)) == $module_path) {
-// if (preg_match('#^' . preg_quote($module_path, '/') . '#', $config_path)) {
- $module_found = true;
- break;
- }
- }
-
- return $module_found;
- }
-
- /**
- * Returns true if config exists and is allowed for reading
- *
- * @param string $prefix
- * @return bool
- */
- function prefixRegistred($prefix)
- {
- return isset($this->prefixFiles[$prefix]) ? true : false;
- }
-
- /**
- * Returns config file for given prefix
- *
- * @param string $prefix
- * @return string
- */
- function getPrefixFile($prefix)
- {
- return array_key_exists($prefix, $this->prefixFiles) ? $this->prefixFiles[$prefix] : false;
- }
-
- function iterateConfigs($callback_function, $params)
- {
- $this->includeConfigFiles(MODULES_PATH); //make sure to re-read all configs
- $this->AfterConfigRead();
-
- foreach ($this->configData as $prefix => $config_data) {
- $callback_function[0]->$callback_function[1]($prefix, $config_data, $params);
- }
- }
-
-}
-
-
-?>
\ No newline at end of file