protected function _parseLevel(&$conf, $children, $ctx)
{
foreach ($children as $node) {
if ($node->nodeType != XML_ELEMENT_NODE) {
continue;
}
$name = $node->getAttribute('name');
$desc = $GLOBALS['injector']->getInstance('Horde_Core_Factory_TextFilter')->filter($node->getAttribute('desc'), 'linkurls');
$required = !($node->getAttribute('required') == 'false');
$quote = !($node->getAttribute('quote') == 'false');
$curctx = empty($ctx) ? $name : $ctx . '|' . $name;
switch ($node->tagName) {
case 'configdescription':
if (empty($name)) {
$name = uniqid(mt_rand());
}
$conf[$name] = array('_type' => 'description', 'desc' => $GLOBALS['injector']->getInstance('Horde_Core_Factory_TextFilter')->filter($this->_default($curctx, $this->_getNodeOnlyText($node)), 'linkurls'));
break;
case 'configheader':
if (empty($name)) {
$name = uniqid(mt_rand());
}
$conf[$name] = array('_type' => 'header', 'desc' => $this->_default($curctx, $this->_getNodeOnlyText($node)));
break;
case 'configswitch':
$values = $this->_getSwitchValues($node, $ctx);
list($default, $isDefault) = $quote ? $this->__default($curctx, $this->_getNodeOnlyText($node)) : $this->__defaultRaw($curctx, $this->_getNodeOnlyText($node));
if ($default === '') {
$default = key($values);
}
if (is_bool($default)) {
$default = $default ? 'true' : 'false';
}
$conf[$name] = array('desc' => $desc, 'switch' => $values, 'default' => $default, 'is_default' => $isDefault, 'quote' => $quote);
break;
case 'configenum':
$values = $this->_getEnumValues($node);
list($default, $isDefault) = $quote ? $this->__default($curctx, $this->_getNodeOnlyText($node)) : $this->__defaultRaw($curctx, $this->_getNodeOnlyText($node));
if ($default === '') {
$default = key($values);
}
if (is_bool($default)) {
$default = $default ? 'true' : 'false';
}
$conf[$name] = array('_type' => 'enum', 'required' => $required, 'quote' => $quote, 'values' => $values, 'desc' => $desc, 'default' => $default, 'is_default' => $isDefault);
break;
case 'configlist':
list($default, $isDefault) = $this->__default($curctx, null);
if (is_null($default)) {
$default = $this->_getNodeOnlyText($node);
} elseif (is_array($default)) {
$default = implode(', ', $default);
}
$conf[$name] = array('_type' => 'stringlist', 'required' => $required, 'desc' => $desc, 'default' => $default, 'is_default' => $isDefault);
break;
case 'configmultienum':
$default = $this->_getNodeOnlyText($node);
if (strlen($default)) {
$default = explode(',', $default);
} else {
$default = array();
}
list($default, $isDefault) = $this->__default($curctx, $default);
$conf[$name] = array('_type' => 'multienum', 'required' => $required, 'values' => $this->_getEnumValues($node), 'desc' => $desc, 'default' => Horde_Array::valuesToKeys($default), 'is_default' => $isDefault);
break;
case 'configpassword':
$conf[$name] = array('_type' => 'password', 'required' => $required, 'desc' => $desc, 'default' => $this->_default($curctx, $this->_getNodeOnlyText($node)), 'is_default' => $this->_isDefault($curctx, $this->_getNodeOnlyText($node)));
break;
case 'configstring':
$conf[$name] = array('_type' => 'text', 'required' => $required, 'desc' => $desc, 'default' => $this->_default($curctx, $this->_getNodeOnlyText($node)), 'is_default' => $this->_isDefault($curctx, $this->_getNodeOnlyText($node)));
if ($conf[$name]['default'] === false) {
$conf[$name]['default'] = 'false';
} elseif ($conf[$name]['default'] === true) {
$conf[$name]['default'] = 'true';
}
break;
case 'configboolean':
$default = $this->_getNodeOnlyText($node);
$default = !(empty($default) || $default === 'false');
$conf[$name] = array('_type' => 'boolean', 'required' => $required, 'desc' => $desc, 'default' => $this->_default($curctx, $default), 'is_default' => $this->_isDefault($curctx, $default));
break;
case 'configinteger':
$values = $this->_getEnumValues($node);
$conf[$name] = array('_type' => 'int', 'required' => $required, 'values' => $values, 'desc' => $desc, 'default' => $this->_default($curctx, $this->_getNodeOnlyText($node)), 'is_default' => $this->_isDefault($curctx, $this->_getNodeOnlyText($node)));
if ($node->getAttribute('octal') == 'true' && $conf[$name]['default'] != '') {
$conf[$name]['_type'] = 'octal';
$conf[$name]['default'] = sprintf('0%o', $this->_default($curctx, octdec($this->_getNodeOnlyText($node))));
}
break;
case 'configldap':
$conf[$node->getAttribute('switchname')] = $this->_configLDAP($ctx, $node);
break;
case 'configldapuser':
$conf = array_merge($conf, $this->_configLDAPUser($ctx, $node));
break;
case 'configphp':
$conf[$name] = array('_type' => 'php', 'required' => $required, 'quote' => false, 'desc' => $desc, 'default' => $this->_defaultRaw($curctx, $this->_getNodeOnlyText($node)), 'is_default' => $this->_isDefaultRaw($curctx, $this->_getNodeOnlyText($node)));
break;
case 'configsecret':
$conf[$name] = array('_type' => 'text', 'required' => true, 'desc' => $desc, 'default' => $this->_default($curctx, strval(new Horde_Support_Randomid())), 'is_default' => $this->_isDefault($curctx, $this->_getNodeOnlyText($node)));
break;
case 'configsql':
$conf[$node->getAttribute('switchname')] = $this->configSQL($ctx, $node);
break;
case 'confignosql':
$conf[$node->getAttribute('switchname')] = $this->configNoSQL($ctx, $node);
break;
case 'configvfs':
$conf[$node->getAttribute('switchname')] = $this->_configVFS($ctx, $node);
break;
case 'configsection':
$conf[$name] = array();
$cur =& $conf[$name];
if ($node->hasChildNodes()) {
$this->_parseLevel($cur, $node->childNodes, $curctx);
}
break;
case 'configtab':
$key = uniqid(mt_rand());
$conf[$key] = array('tab' => $name, 'desc' => $desc);
if ($node->hasChildNodes()) {
$this->_parseLevel($conf, $node->childNodes, $ctx);
}
break;
case 'configplaceholder':
$conf[uniqid(mt_rand())] = 'placeholder';
break;
default:
$conf[$name] = array();
$cur =& $conf[$name];
if ($node->hasChildNodes()) {
$this->_parseLevel($cur, $node->childNodes, $curctx);
}
break;
}
}
}