From 50d28a0ad8dcf5d9fe697278b6ea05aa00f8fb87 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 5 Nov 2019 18:01:37 +0100 Subject: [baseconfig] Overhaul hook system This enables us to finally properly show the inheritance flow of all the config variables when editing the baseconfig for a certain location or machine. --- modules-available/baseconfig/page.inc.php | 67 ++++++++++++++----------------- 1 file changed, 31 insertions(+), 36 deletions(-) (limited to 'modules-available/baseconfig/page.inc.php') diff --git a/modules-available/baseconfig/page.inc.php b/modules-available/baseconfig/page.inc.php index 0c11d5e1..a931d3f3 100644 --- a/modules-available/baseconfig/page.inc.php +++ b/modules-available/baseconfig/page.inc.php @@ -127,59 +127,47 @@ class Page_BaseConfig extends Page $where = ''; $params = array(); } + $parents = $this->getInheritanceData(); // List config options $settings = array(); - $vars = BaseConfigUtil::getVariables(); + $varsFromJson = BaseConfigUtil::getVariables(); // Remember missing variables - $missing = $vars; + $missing = $varsFromJson; // Populate structure with existing config from db - $this->fillSettings($vars, $settings, $missing, $this->qry_extra['table'], $fields, $where, $params, false); - if (isset($this->qry_extra['getfallback']) && !empty($missing)) { - $method = explode('::', $this->qry_extra['getfallback']); - $fieldValue = $this->qry_extra['field_value']; - $tries = 0; - while (++$tries < 100 && !empty($missing)) { - $ret = call_user_func($method, $fieldValue); - if ($ret === false) - break; - $fieldValue = $ret['value']; - $params = array('field_value' => $fieldValue); - $this->fillSettings($vars, $settings, $missing, $this->qry_extra['table'], $fields, $where, $params, $ret['display']); - } - } - if ($this->targetModule !== false && !empty($missing)) { - $this->fillSettings($vars, $settings, $missing, 'setting_global', '', '', array(), 'Global'); - } + $this->fillSettings($varsFromJson, $settings, $missing, $this->qry_extra['table'], $fields, $where, $params, false); // Add entries that weren't in the db (global), setup override checkbox (module specific) - foreach ($vars as $key => $var) { + foreach ($varsFromJson as $key => $var) { if ($this->targetModule !== false && !isset($settings[$var['catid']]['settings'][$key])) { // Module specific - value is not set in DB - $settings[$var['catid']]['settings'][$key] = $var + array( + $settings[$var['catid']]['settings'][$key] = array( 'setting' => $key ); } - if (!isset($settings[$var['catid']]['settings'][$key]['displayvalue'])) { - $settings[$var['catid']]['settings'][$key]['displayvalue'] = $var['defaultvalue']; - } - if (!isset($settings[$var['catid']]['settings'][$key]['defaultvalue'])) { - $settings[$var['catid']]['settings'][$key]['defaultvalue'] = $var['defaultvalue']; + $entry =& $settings[$var['catid']]['settings'][$key]; + if (!isset($entry['displayvalue'])) { + if (isset($parents[$key][0]['value'])) { + $entry['displayvalue'] = $parents[$key][0]['value']; + } else { + $entry['displayvalue'] = $var['defaultvalue']; + } } - if (!isset($settings[$var['catid']]['settings'][$key]['shadows'])) { - $settings[$var['catid']]['settings'][$key]['shadows'] = isset($var['shadows']) ? $var['shadows'] : null; + if (!isset($entry['shadows'])) { + $entry['shadows'] = isset($var['shadows']) ? $var['shadows'] : null; } - $settings[$var['catid']]['settings'][$key] += array( + $entry += array( 'item' => $this->makeInput( $var['validator'], $key, - $settings[$var['catid']]['settings'][$key]['displayvalue'], - $settings[$var['catid']]['settings'][$key]['shadows'], + $entry['displayvalue'], + $entry['shadows'], $editForbidden ), 'description' => Util::markup(Dictionary::translateFileModule($var['module'], 'config-variables', $key)), 'setting' => $key, + 'tree' => isset($parents[$key]) ? $parents[$key] : false, ); } - //die(); + unset($entry); // Sort categories @@ -216,10 +204,7 @@ class Page_BaseConfig extends Page continue; } unset($missing[$row['setting']]); - if ($sourceName !== false) { - $row['defaultvalue'] = ''; - $row['defaultsource'] = $sourceName; - } elseif ($this->targetModule !== false) { + if ($this->targetModule !== false) { $row['checked'] = 'checked'; } $row += $vars[$row['setting']]; @@ -280,6 +265,16 @@ class Page_BaseConfig extends Page $func = explode('::', $this->qry_extra['locationResolver']); return (int)call_user_func($func, $this->qry_extra['field_value']); } + + private function getInheritanceData() + { + if (!isset($this->qry_extra['getInheritance']) || !isset($this->qry_extra['field_value'])) { + BaseConfig::prepareDefaults(); + return ConfigHolder::getRecursiveConfig(true); + } + $func = explode('::', $this->qry_extra['getInheritance']); + return call_user_func($func, $this->qry_extra['field_value']); + } /** * Create html snippet for setting, based on given validator -- cgit v1.2.3-55-g7522