Fluid: Select mit zusätzlicher Option
Lange war ich auf der Suche nach einer einfachen Möglichkeit in einem Fluid Select eine default Option anzufügen, sprich eine Option wie “Produkt auswählen” oder ähnlich. Schlussendlich war die beste lösung einen ViewHelper für das Select zu erstellen.
Dabei bin ich erstmals auf folgenden Artikel gestossen: Fluid: Select in Formularen mit weiteren Optionen. Leider führte dies zu einer Fehlermeldung, und ausserdem waren in meinem Fall noch ein paar Anpassungen nötig.
Hier nun eine kurze Anleitung:
Als erstes erstellen wir einen neuen ViewHelper mit dem Namen SelectViewHelper.php unter typo3conf/ext/meineExt/Classes/ViewHelpers/. In diesen fügen wir nun folgenden Code ein:
class Tx_MeineExt_ViewHelpers_SelectViewHelper extends Tx_Fluid_ViewHelpers_Form_SelectViewHelper {
public function initializeArguments() {
parent::initializeArguments();
$this->registerArgument('additionalOptions', 'array', 'Associative array with values to prepend', FALSE);
}
protected function getOptions() {
$options = parent::getOptions();
$additionalOptions = array();
foreach ($this->arguments['additionalOptions'] as $key => $value) {
$additionalOptions[$key] = $value;
}
$return = $additionalOptions + $options;
return $return;
}
}
Hierbei noch den Namen der Klasse abändern und “meineExt” durch den eigenen Extension namen ersetzen.
Nun bearbeiten wir unser Fluid Template wo das Custom Select hin soll. Dort fügen wir zuoberst folgende Zeile ein:
{namespace meineExt=Tx_meineExt_ViewHelpers}
Der namespace kann eigentlich beliebig heissen, wie man es halt gerne hätte.
Und fügen dann an einer beliebigen Stelle darunter unser Select ein:
<meineExt:select additionalOptions="{- : '-- Produkt wählen --'}" sortByOptionLabel="name" name="products" property="products" options="{allProducts}" optionValueField="uid" optionLabelField="name" />
Der Parameter additionalOptions ist also für unseres Zusätzliche Feld, dort kann ein beliebiger Wert angegeben werden.
Wichtig: In meinem Fall wurde in der getOptions Methode in unserer ViewHelper Klasse keine array_merge verwendet, wie im Original Code, da die Array-Keys noch gebraucht wurden.
30. Juni 2011 at 14:14 | Michel
Die Funktion
t3lib_div::array_merge($arr1, $arr2);
erhält die Keys. Kommt der gleiche Key in beiden Arrays vor so überschreibt der Wert von $arr2 den aus $arr1
1. Oktober 2011 at 13:17 | ToBe
ich hab es gelöst, indem ich an das Array was ich an Fluid übergeben habe einfach noch ein Elemt “all” hinzugefügt habe…