From 0bbf26bc171a70fe21537f8ca6b0914597891241 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sat, 13 Feb 2016 14:29:25 +0000 Subject: [PATCH] support multi-value selects --- lam/lib/baseModule.inc | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/lam/lib/baseModule.inc b/lam/lib/baseModule.inc index 6cb3b721..48f219c6 100644 --- a/lam/lib/baseModule.inc +++ b/lam/lib/baseModule.inc @@ -1400,6 +1400,81 @@ abstract class baseModule { $this->attributes[$attrName] = array_values(array_unique($this->attributes[$attrName])); } + /** + * Adds a select field type that may contain multiple values to the given htmlTable. + * The field name will be the same as the attribute name plus a counting number (e.g. street_0). + * The last field will be followed by a button to add a new value. This is named add_{attribute name} (e.g. add_street). + * There must be a help entry with the attribute name as ID. + * A new line will also be added after this entry so multiple calls will show the fields one below the other. + * + * @param htmlTable $container parent container + * @param String $attrName attribute name + * @param String $label label name + * @param array $options options for the selects + * @param boolean $hasDescriptiveOptions has descriptive options + * @param boolean $required this is a required field (default false) + * @param integer $fieldSize field size + * @param array $htmlIDs reference to array where to add the generated HTML IDs of the input fields + */ + protected function addMultiValueSelectField(&$container, $attrName, $label, $options, $hasDescriptiveOptions = false, + $required = false, $fieldSize = 1, &$htmlIDs = null) { + $values = array(); + if (isset($this->attributes[$attrName][0])) { + $values = $this->attributes[$attrName]; + } + if (sizeof($values) == 0) { + $values[] = ''; + } + natcasesort($values); + $values = array_values($values); + if ($label !== null) { + $labelTextOut = new htmlOutputText($label); + $labelTextOut->alignment = htmlElement::ALIGN_TOP; + $container->addElement($labelTextOut); + } + $subContainer = new htmlTable(); + $subContainer->alignment = htmlElement::ALIGN_TOP; + for ($i = 0; $i < sizeof($values); $i++) { + $input = new htmlSelect($attrName . '_' . $i, $options, array($values[$i]), $fieldSize); + $subContainer->addElement($input); + if (!empty($htmlIDs)) { + $htmlIDs[] = $attrName . '_' . $i; + } + if (!empty($values[$i])) { + $subContainer->addElement(new htmlButton('del_' . $attrName . '_' . $i, 'del.png', true)); + } + if ($i == 0) { + $subContainer->addElement(new htmlButton('add_' . $attrName, 'add.png', true)); + } + $subContainer->addNewLine(); + } + $container->addElement($subContainer); + $help = new htmlHelpLink($attrName); + $help->alignment = htmlElement::ALIGN_TOP; + $container->addElement($help, true); + } + + /** + * Validates a multi-value select field. + * The select fields must be created with function addMultiValueSelectField(). + * + * @param String $attrName attribute name + */ + protected function processMultiValueSelectField($attrName) { + $counter = 0; + while (isset($_POST[$attrName . '_' . $counter])) { + $this->attributes[$attrName][$counter] = trim($_POST[$attrName . '_' . $counter]); + if (($this->attributes[$attrName][$counter] == '') || isset($_POST['del_' . $attrName . '_' . $counter])) { + unset($this->attributes[$attrName][$counter]); + } + $counter++; + } + if (isset($_POST['add_' . $attrName])) { + $this->attributes[$attrName][] = ''; + } + $this->attributes[$attrName] = array_values(array_unique($this->attributes[$attrName])); + } + /** * Adds a simple text input field for the self service. * The field name will be the same as the class name plus "_" plus attribute name (e.g. posixAccount_cn).