Index: branches/RC/core/units/general/helpers/sections_helper.php =================================================================== diff -u -N --- branches/RC/core/units/general/helpers/sections_helper.php (revision 11892) +++ branches/RC/core/units/general/helpers/sections_helper.php (revision 0) @@ -1,301 +0,0 @@ -BuildTree(); - } - - /** - * Builds xml for tree in left frame in admin - * - * @param Array $params - */ - function BuildTree() - { - if (!isset($this->Application->Memcached) || !($data = $this->Application->Memcached->get('master:sections_parsed'))) { - $data = $this->Conn->GetOne('SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "sections_parsed"'); - } - if ($data) { - $this->Tree = unserialize($data); - return ; - } - - if (!(defined('IS_INSTALL') && IS_INSTALL)) { - // don't reread all configs during install, because they are reread on every install step - $this->Application->UnitConfigReader->ReReadConfigs(); - } - - $this->Tree = Array(); - - // 1. build base tree (don't update parent with children list yet) - - // 1.1. process prefixes without priority - $prioritized_prefixes = Array (); - $prefixes = array_keys($this->Application->UnitConfigReader->configData); - - foreach ($prefixes as $prefix) { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - - if (array_key_exists('ConfigPriority', $config)) { - $prioritized_prefixes[$prefix] = $config['ConfigPriority']; - continue; - } - $this->_processPrefixSections($prefix); - } - - // 2. process prefixes with priority - asort($prioritized_prefixes); - foreach ($prioritized_prefixes as $prefix => $priority) { - $this->_processPrefixSections($prefix); - } - - // 2. apply section ajustments - foreach ($prefixes as $prefix) { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - $section_ajustments = getArrayValue($config, 'SectionAdjustments'); - if (!$section_ajustments) continue; - - foreach ($section_ajustments as $section_name => $ajustment_params) { - if (is_array($ajustment_params)) { - if (!array_key_exists($section_name, $this->Tree)) { - // don't process ajustments for non-existing sections - continue; - } - - $this->Tree[$section_name] = array_merge_recursive2($this->Tree[$section_name], $ajustment_params); - } - else { - // then remove section - unset($this->Tree[$section_name]); - } - } - } - - // 3. - foreach ($this->Tree as $section_name => $section_params) { - // 3.1. update parent -> children references - $parent_section = $section_params['parent']; - $section_order = "{$section_params['priority']}"; - - if (!array_key_exists('children', $this->Tree[$parent_section])) { - $this->Tree[$parent_section]['children'] = Array (); - } - - if (array_key_exists($section_order, $this->Tree[$parent_section]['children'])) { - trigger_error( - 'Section "' . $section_name . '" has replaced section "' . - $this->Tree[$parent_section]['children'][$section_order] . - '" (parent section: "' . $parent_section . - '"; duplicate priority: ' . $section_order . ')', - E_USER_WARNING - ); - } - - $this->Tree[$parent_section]['children'][$section_order] = $section_name; - - if ($section_params['type'] == stTAB) { - // if this is tab, then mark parent section as TabOnly - $this->Tree[$parent_section]['tabs_only'] = true; - } - - // 3.2. process icons here, because they also can be ajusted - if (isset($section_params['icon']) && preg_match('/([^:]+):(.*)/', $section_params['icon'], $regs)) { - $this->Tree[$section_name]['icon'] = $regs[2]; - $this->Tree[$section_name]['icon_module'] = $regs[1]; // set "icon_module" used in "combined_header" block - $module_folder = trim( $this->Application->findModule('Name', $regs[1], 'Path'), '/'); - if ($module_folder == '') { - $module_folder = 'core'; - } - } - else { - $module_folder = $this->Application->getUnitOption($section_params['SectionPrefix'], 'ModuleFolder'); - if (!array_key_exists('icon_module', $section_params)) { - $this->Tree[$section_name]['icon_module'] = $module_folder; // set "icon_module" used in "combined_header" block - } - } - - // this is to display HELP icon instead of missing one.. can be replaced with some other icon to draw attention - $icon_file = $module_folder.'/admin_templates/img/icons/icon24_'.$this->Tree[$section_name]['icon']; - - /*$core_file = FULL_PATH.'/core/admin_templates/img/icons/icon24_' . $this->Tree[$section_name]['icon'].'.gif'; - if ($module_folder != 'core' && file_exists($core_file) && file_exists(FULL_PATH.'/'.$icon_file.'.gif')) { - if (crc32(file_get_contents($core_file)) == crc32(file_get_contents(FULL_PATH.'/'.$icon_file.'.gif'))) { - trigger_error('Section "' . $section_name . '" uses icon copy from "Core" module', E_USER_NOTICE); - } - }*/ - - if (!file_exists(FULL_PATH.'/'.$icon_file.'.gif')) { - $this->Tree[$section_name]['icon'] = 'help'; - $this->Tree[$section_name]['icon_module'] = 'core'; - } - } - $this->Application->HandleEvent( new kEvent('adm:OnAfterBuildTree') ); - - if (isset($this->Application->Memcached)) { - $this->Application->Memcached->set('master:sections_parsed',serialize($this->Tree), 0, 0); - return; - } - - $this->Conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("sections_parsed", '.$this->Conn->qstr(serialize($this->Tree)).', '.adodb_mktime().')'); - } - - function _processPrefixSections($prefix) - { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - $sections = getArrayValue($config, 'Sections'); - if (!$sections) { - return ; - } - -// echo 'Prefix: ['.$prefix.'] has ['.count($sections).'] sections
'; - - foreach ($sections as $section_name => $section_params) { - // we could also skip not allowed sections here in future - if ( isset($section_params['SectionPrefix']) ) { - $section_prefix = $section_params['SectionPrefix']; - } - elseif ( $this->Application->getUnitOption($prefix, 'SectionPrefix') ) { - $section_prefix = $this->Application->getUnitOption($prefix, 'SectionPrefix'); - } - else { - $section_prefix = $prefix; - } - $section_params['SectionPrefix'] = $section_prefix; - $section_params['url']['m_opener'] = 'r'; - $section_params['url']['no_pass_through'] = 1; - $pass_section = getArrayValue($section_params, 'url', 'pass_section'); - - if ($pass_section) { - unset($section_params['url']['pass_section']); - $section_params['url']['section'] = $section_name; - if (!isset($section_params['url']['module'])) { - $module_name = $this->Application->findModule('Path', $config['ModuleFolder'].'/', 'Name'); - $section_params['url']['module'] = $module_name; - } - } - - if (!isset($section_params['url']['t'])) { - $section_params['url']['t'] = 'index'; - } - - if (!isset($section_params['onclick'])) { - $section_params['onclick'] = 'checkEditMode()'; - } - - if (!isset($section_params['container'])) { - $section_params['container'] = 0; // for js tree printing to xml - } - - $current_data = isset($this->Tree[$section_name]) ? $this->Tree[$section_name] : Array(); - - if ($current_data) { - trigger_error('Section "' . $section_name . '" declaration (originally defined in "' . $current_data['SectionPrefix'] . '") was overwriten from "' . $prefix . '"', E_USER_NOTICE); - } - - $this->Tree[$section_name] = array_merge_recursive2($current_data, $section_params); - } - } - - /** - * Returns details information about section - * - * @param string $section_name - * @return Array - */ - function &getSectionData($section_name) - { - if (isset($this->Tree[$section_name])) { - $ret =& $this->Tree[$section_name]; - } - else { - $ret = Array(); - } - return $ret; - } - - /** - * Returns first child, that is not a folder - * - * @param string $section_name - * @param Array $tree - * @return stirng - */ - function getFirstChild($section_name, $check_permission = false) - { - $section_data =& $this->getSectionData($section_name); - - $children = isset($section_data['children']) && $section_data['children'] ? $section_data['children'] : false; - if ($children) { - // get 1st child - ksort($children, SORT_NUMERIC); - foreach ($children as $child_priority => $child_section) { - $section_data =& $this->getSectionData($child_section); - - $perm_section = $this->getPermSection($child_section); - $perm_status = $check_permission ? $this->Application->CheckPermission($perm_section.'.view') : true; - if ((isset($section_data['show_mode']) && $section_data['show_mode']) || !$perm_status) { - continue; - } - - break; - } - - return $this->getFirstChild($child_section, $check_permission); - } - - return $section_name; - } - - /** - * Returns section for permission checking based on given section - * - * @param string $section_name - * @return string - */ - function getPermSection($section_name) - { - $ret = $section_name; - $section_data =& $this->getSectionData($section_name); - - if ($section_data && isset($section_data['perm_prefix'])) { - // this section uses other section permissions - $ret = $this->Application->getUnitOption($section_data['perm_prefix'].'.main', 'PermSection'); - } - return $ret; - } - } - -?> \ No newline at end of file