[ 'addAll' => 'Add all', 'removeAll' => 'Remove all', 'itemsSelected' => 'items selected', ], ]; protected function _extractOptions(array &$attribs, array $names, array $defaults = []) { $options = []; foreach ($names as $name) { if (array_key_exists($name, $attribs)) { if (array_key_exists($name, $defaults) && is_array($defaults[$name])) { $options[$name] = array_merge($defaults[$name], (array) $attribs[$name]); } else { $options[$name] = $attribs[$name]; } unset($attribs[$name]); } elseif (array_key_exists($name, $defaults)) { $options[$name] = $defaults[$name]; } } return $options; } protected function _extractSpecialOptions(array &$attribs) { $this->_specialOptions = $this->_extractOptions( $attribs, $this->_specialOptionNames, $this->_specialOptionDefaults ); return $this->_specialOptions; } /** * Renders * * @param string $name * @param array|null $value Indexed array with ids of selected options * @param array|null $attribs * @param array|null $options Associative array with all available options (id => title) * @param string $listsep * @return string Html */ public function formMultiDraggableSelect($name, $value = null, $attribs = null, $options = null, $listsep = null) { $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); $id = $disable = $escape = null; extract($info); // name, id, value, attribs, options, listsep, disable, escape $value = (array) $value; $options = (array) $options; $name .= ('[]' === substr($name, -2)) ? '' : '[]'; $this->_name = $name; $attribs['id'] = $this->_id = $id; $this->_extractSpecialOptions($attribs); $availableOptions = $options; array_walk($availableOptions, function (&$title, $value) { $title = compact('value', 'title'); }); $selectedOptions = []; foreach ($value as $selectedValue) { if (array_key_exists($selectedValue, $availableOptions)) { $selectedOptions[$selectedValue] = $availableOptions[$selectedValue]; unset($availableOptions[$selectedValue]); } } return $this->_renderElement($attribs, $availableOptions, $selectedOptions); } protected function _renderElement(array $attribs, array $available, array $selected) { if (($width = $this->_getWidth())) { $attribs['style'] = 'width: ' . $width; } $xhtml = '