allow types to specify config options

This commit is contained in:
Roland Gruber 2014-07-12 13:29:15 +00:00
parent 0e170f56ff
commit c40ce39bb8
5 changed files with 109 additions and 37 deletions

View File

@ -19,6 +19,7 @@
@ -40,7 +41,10 @@ This is a list of API changes for all LAM releases.
<br>
<h2>4.5 -&gt; 4.6</h2>The valid account types for each module must now
<h2>4.6 -&gt; 4.7</h2>Account types (e.g. user, group, host) may have config options now. See baseType::get_configOptions().<br>
<br>
<h2>4.5 -&gt; 4.6</h2>
The valid account types for each module must now
be set in can_manage(). This function is abstract in base module.
Setting the account type via meta data is no longer supported.<br>
<br>

View File

@ -3,7 +3,7 @@
$Id$
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2005 - 2012 Roland Gruber
Copyright (C) 2005 - 2014 Roland Gruber
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -185,7 +185,34 @@ class baseType {
public function runEditPagePostAction($container) {
}
/**
* Returns a list of configuration options.
*
* The field names are used as keywords to load and save settings.
* We recommend to use the type name as prefix for them (e.g. user_someSetting) to avoid naming conflicts.
*
* @return mixed htmlElement or array of htmlElement
*
* @see htmlElement
*/
public function get_configOptions() {
return null;
}
/**
* Checks input values of config settings.
* <br>
* If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ('message type', 'message head', 'message text').
* <br>If no errors occured the function returns an empty array.
*
* @param array $options hash array (option name => value) that contains the input. The option values are all arrays containing one or more elements.
* @return array list of error messages
*/
public function check_configOptions(&$options) {
return array();
}
}
?>

View File

@ -201,6 +201,48 @@ function LAMVersion() {
return '0.0.unknown';
}
/**
* Extracts config options from HTTP POST data.
*
* @param array $confTypes array (option name => type (e.g. multiselect))
* @return array list of config options (name => array(values))
*/
function extractConfigOptionsFromPOST($confTypes) {
$options = array();
foreach ($confTypes as $element => $type) {
// text fields
if ($type == "text") {
$options[$element] = array($_POST[$element]);
}
// text fields
elseif ($type == "text_obfuscated") {
$options[$element] = array(obfuscateText($_POST[$element]));
}
// hidden fields
elseif ($type == "hidden") {
$options[$element] = array($_POST[$element]);
}
// checkboxes
elseif ($type == "checkbox") {
if (isset($_POST[$element]) && ($_POST[$element] == "on")) $options[$element] = array('true');
else $options[$element] = array('false');
}
// dropdownbox
elseif ($type == "select") {
$options[$element] = array($_POST[$element]);
}
// multiselect
elseif ($type == "multiselect") {
$options[$element] = $_POST[$element]; // value is already an array
}
// textarea
elseif ($type == "textarea") {
$options[$element] = explode("\r\n", $_POST[$element]);
}
}
return $options;
}
/**
* Prints a meta refresh page

View File

@ -227,6 +227,7 @@ if (sizeof($availableTypes) > 0) {
$container->addElement($availableContainer, true);
}
$_SESSION['conftypes_optionTypes'] = array();
// show active types
if (sizeof($activeTypes) > 0) {
$container->addElement(new htmlSubTitle(_("Active account types")), true);
@ -264,6 +265,20 @@ if (sizeof($activeTypes) > 0) {
$attrsInput->setFieldSize(40);
$activeContainer->addElement($attrsInput);
$activeContainer->addNewLine();
// type options
$typeObj = new $activeTypes[$i];
$typeConfigOptions = $typeObj->get_configOptions();
if (!empty($typeConfigOptions)) {
foreach ($typeConfigOptions as $typeConfigOption) {
$activeContainer->addElement($typeConfigOption, true);
}
// save option types to session
ob_start();
$dummyIndex = 1;
$typeConfigOptionTypes = parseHtml(null, $typeConfigOptions, array(), true, $dummyIndex, 'user');
ob_end_clean();
$_SESSION['conftypes_optionTypes'] = array_merge($_SESSION['conftypes_optionTypes'], $typeConfigOptionTypes);
}
// advanced options
$advancedOptionsContent = new htmlTable();
// LDAP filter
@ -327,7 +342,13 @@ if (sizeof($activeTypes) > 0) {
}
$tabindex = 1;
parseHtml(null, $container, array(), false, $tabindex, 'user');
$dynamicTypeOptions = array();
foreach ($_SESSION['conftypes_optionTypes'] as $key => $value) {
if (isset($typeSettings[$key])) {
$dynamicTypeOptions[$key] = explode(LAMConfig::LINE_SEPARATOR, $typeSettings[$key]);
}
}
parseHtml(null, $container, $dynamicTypeOptions, false, $tabindex, 'user');
echo "<input type=\"hidden\" name=\"postAvailable\" value=\"yes\">\n";
@ -403,6 +424,7 @@ function checkInput() {
$typeSettings[$key] = $_POST[$key];
}
}
$typeConfigOptions = extractConfigOptionsFromPOST($_SESSION['conftypes_optionTypes']);
for ($i = 0; $i < sizeof($accountTypes); $i++) {
// set hidden
$key = "hidden_" . $accountTypes[$i];
@ -418,6 +440,16 @@ function checkInput() {
$key = "readOnly_" . $accountTypes[$i];
$typeSettings[$key] = (isset($_POST[$key]) && ($_POST[$key] == 'on'));
}
// check dynamic type settings
$typeObj = new $accountTypes[$i];
$typeMessages = $typeObj->check_configOptions($typeConfigOptions);
if (!empty($typeMessages)) {
$errors = array_merge($errors, $typeMessages);
}
}
// add dynamic type settings
foreach ($typeConfigOptions as $key => $value) {
$typeSettings[$key] = implode(LAMConfig::LINE_SEPARATOR, $value);
}
// save input
$conf->set_typeSettings($typeSettings);

View File

@ -273,40 +273,7 @@ function checkInput() {
// check module options
// create option array to check and save
$options = array();
$opt_keys = array_keys($_SESSION['conf_types']);
for ($i = 0; $i < sizeof($opt_keys); $i++) {
$element = $opt_keys[$i];
// text fields
if ($_SESSION['conf_types'][$element] == "text") {
$options[$element] = array($_POST[$element]);
}
// text fields
elseif ($_SESSION['conf_types'][$element] == "text_obfuscated") {
$options[$element] = array(obfuscateText($_POST[$element]));
}
// hidden fields
elseif ($_SESSION['conf_types'][$element] == "hidden") {
$options[$element] = array($_POST[$element]);
}
// checkboxes
elseif ($_SESSION['conf_types'][$element] == "checkbox") {
if (isset($_POST[$element]) && ($_POST[$element] == "on")) $options[$element] = array('true');
else $options[$element] = array('false');
}
// dropdownbox
elseif ($_SESSION['conf_types'][$element] == "select") {
$options[$element] = array($_POST[$element]);
}
// multiselect
elseif ($_SESSION['conf_types'][$element] == "multiselect") {
$options[$element] = $_POST[$element]; // value is already an array
}
// textarea
elseif ($_SESSION['conf_types'][$element] == "textarea") {
$options[$element] = explode("\r\n", $_POST[$element]);
}
}
$options = extractConfigOptionsFromPOST($_SESSION['conf_types']);
// get list of scopes of modules
$scopes = array();