isProtected()) return false;
// split any combined values + convert from array to comma separated string
$input = ($input) ? $input : array();
$input = $this->array2str($input);
$value = is_null($this->local) ? $this->default : $this->local;
if($value == $input) return false;
if($this->pattern && !preg_match($this->pattern, $input)) {
$this->error = true;
$this->input = $input;
return false;
}
$this->local = $input;
return true;
}
/** @inheritdoc */
public function html(\admin_plugin_config $plugin, $echo = false) {
$disable = '';
if($this->isProtected()) {
$value = $this->protected;
$disable = 'disabled="disabled"';
} else {
if($echo && $this->error) {
$value = $this->input;
} else {
$value = is_null($this->local) ? $this->default : $this->local;
}
}
$key = htmlspecialchars($this->key);
// convert from comma separated list into array + combine complimentary actions
$value = $this->str2array($value);
$default = $this->str2array($this->default);
$input = '';
foreach($this->choices as $choice) {
$idx = array_search($choice, $value);
$idx_default = array_search($choice, $default);
$checked = ($idx !== false) ? 'checked="checked"' : '';
// @todo ideally this would be handled using a second class of "default"
$class = (($idx !== false) == (false !== $idx_default)) ? " selectiondefault" : "";
$prompt = ($plugin->getLang($this->key . '_' . $choice) ?
$plugin->getLang($this->key . '_' . $choice) : htmlspecialchars($choice));
$input .= '
' . "\n";
$input .= '\n";
$input .= '\n";
$input .= "
\n";
// remove this action from the disabledactions array
if($idx !== false) unset($value[$idx]);
if($idx_default !== false) unset($default[$idx_default]);
}
// handle any remaining values
if($this->other != 'never') {
$other = join(',', $value);
// test equivalent to ($this->_other == 'always' || ($other && $this->_other == 'exists')
// use != 'exists' rather than == 'always' to ensure invalid values default to 'always'
if($this->other != 'exists' || $other) {
$class = (
(count($default) == count($value)) &&
(count($value) == count(array_intersect($value, $default)))
) ?
" selectiondefault" : "";
$input .= '' . "\n";
$input .= '\n";
$input .= '\n";
$input .= "
\n";
}
}
$label = '';
return array($label, $input);
}
/**
* convert comma separated list to an array and combine any complimentary values
*
* @param string $str
* @return array
*/
protected function str2array($str) {
$array = explode(',', $str);
if(!empty($this->combine)) {
foreach($this->combine as $key => $combinators) {
$idx = array();
foreach($combinators as $val) {
if(($idx[] = array_search($val, $array)) === false) break;
}
if(count($idx) && $idx[count($idx) - 1] !== false) {
foreach($idx as $i) unset($array[$i]);
$array[] = $key;
}
}
}
return $array;
}
/**
* convert array of values + other back to a comma separated list, incl. splitting any combined values
*
* @param array $input
* @return string
*/
protected function array2str($input) {
// handle other
$other = trim($input['other']);
$other = !empty($other) ? explode(',', str_replace(' ', '', $input['other'])) : array();
unset($input['other']);
$array = array_unique(array_merge($input, $other));
// deconstruct any combinations
if(!empty($this->combine)) {
foreach($this->combine as $key => $combinators) {
$idx = array_search($key, $array);
if($idx !== false) {
unset($array[$idx]);
$array = array_merge($array, $combinators);
}
}
}
return join(',', array_unique($array));
}
}