Zwischen wE 9.1.5 und 9.2.2 wurde das Tag we:formfield type=select so verändert, dass immer ein leeres Option-Element ausgegeben wird. Dieses Option ist zudem disabled.
Dadurch wird aber der Redaktion die Möglichkeit genommen, einen Wert an Index-Position 0 im Select auszugeben, was durchaus der Fall sein kann. Stattdesseb wird eine wird der User gezwungen eine Auswahl zu treffen.
M.E. wäre es sinnvoll, statt der Vorgabe eines leeren Elements der Redaktion oder den Templateantwicklern an die Hand zu geben, wie sie das Element belegen möchten. Dafür könnte die Möglichkeit ergänzt werden, Value und Option-Inhalt getrennt anzugeben.
Die Funktion in der Klasse des formfield könnte ab Zeile 218 etwa so aussehen (nur unvollständig getestet in 9.2.2):
/**
*
* @param string $name
* @param array $tagAtts
* @param array $ff
* @param array $attribs @unused-param
* @return string
*/
protected static function select(string $name, array $tagAtts, array $ff, array $attribs): string{
$selected = $ff['value']['value'] ?? self::$doc->getElementFromKey($name, 'ffdefault');
$foo = explode("\n", strtr(self::$doc->getElementFromKey($name, 'ffvalues'), ["\r\n" => "\n", "\r" => "\n",]));
// $tagContent = (isset($attribs['multiple']) || !isset($attribs['required']) ? '' :
// self::htmlTag('option', ['disabled' => 'disabled', 'selected' => 'selected', 'value' => ''], ' '));
$tagContent ='';
foreach ($foo as $v) {
$v = trim($v);
if ($v === '') {
continue;
}
if (strpos($v, ',') !== false) {
$parts = explode(',', $v);
$part1 = trim($parts[0]);
$part2 = trim($parts[1]);
$atts = ['value' => htmlspecialchars($part1)];
if ($selected == $v) {
$atts['selected'] = 'selected';
}
$tagContent .= self::htmlTag('option', $atts, htmlspecialchars($part2));
} else {
$atts = ['value' => htmlspecialchars($v)];
if ($selected == $v) {
$atts['selected'] = 'selected';
}
$tagContent .= self::htmlTag('option', $atts, htmlspecialchars($v));
}
}
return self::htmlTag('select', $tagAtts, $tagContent, true);
}
Display More
Dabei können die Option-Values und Inhalte wie beisher pro Zeile eingegeben werden. Wenn es ein Komma in der Zeile gibt, wird der Wert vor dem Komma als value und der hinter als Inhalt ausgegeben. Dadurch kann man auch ein leeres value-Attribut ausgeben, das man für required braucht.
Diese Funktion funktioniert vermutlich auch, wenn mehr als ein Komma angegeben wird, weil die Teile ignoriert werden. (Ohne Gewähr;-)