Auswahllisten im TYPO3-Backend optimieren
TYPO3 bietet ein mächtiges und simples Formularsystem für sein Backend. Gerade bei umfangreichen Auswahllisten (Selectboxen) werden die Standardelemente aber nicht immer den gewachsenen Anforderungen von komplexen Extensions und Webanwendungen gerecht. Der folgende Ansatz ermöglicht es, die Elemente von Auswahllisten innerhalb einer TCA- oder Flexform-Definition dynamisch mittels einer PHP-Funktion zu generieren. So ist es z.B. möglich weitere Informationen als nur ein Datenbankfeld als Titel anzuzeigen oder den zu speichernden Wert der Auswahl von der UID auf ein anderes Datenbankfeld zu ändern.
Flexform/TCA
Zunächst muss die eigene Flexform/TCA-Konfiguration um das Attribut itemsProcFunc ergänzt werden. Die dort angegebene Funktion erhält als Übergabeparameter die gesamte Konfiguration des aktuellen Elements als Array und kann dieses beliebig verändern und danach zurückliefern. Der Aufruf der eigenen Funktion ergibt sich aus dem Klassennamen (ich empfehle das Kürzel tx_, den Namen der Extension und als Anhang _flexform) und dem Namen der eigentlichen Funktion.
Flexform
<items>
<TCEforms>
<label>Single Items</label>
<config>
<type>select</type>
<multiple>1</multiple>
<itemsProcFunc>tx_myext_flexform->extendedItemList</itemsProcFunc>
<items type="array"></items>
<size>10</size>
<autosizemax>10</autosizemax>
<maxitems>99</maxitems>
<minitems>0</minitems>
</config>
</TCEforms>
</items>
TCA
'items' => array (
'label' => 'Single Items',
'config' => array (
'type' => 'select',
'multiple' => '1',
'itemsProcFunc' => 'tx_myext_flexform->extendedItemList',
'items' => array(),
'size' => '10',
'autosizemax' => '10',
'maxitems' => '99',
'minitems' => '0'
)
)
class.tx_myext_flexform.php
Als nächstes wird die eigene Klasse mit der entsprechenden Funktion zur Modifizierung der Konfiguration benötigt. Legen Sie dazu in der Extension einen Ordner classes und darin die Datei class.tx_myext_flexform.php an. Vergessen Sie nicht die Datei, den Klassennamen und den Funktionsnamen an Ihr Schema anzupassen. Der folgende Code zeigt wie Sie die einzelnen Elemente der Selectbox selbst definieren bzw. das gesamte Konfigurationsarray des Elements verändern können.
class tx_myext_flexform {
function extendedItemList($config){
// get data
...
// create option list
$optionList = array();
foreach($data as $item){
$label = '[' . $item['uid'] .'] ' . $item['title'] .' - ' . $item['subtitle'];
$value = $item['uid'];
$optionList[] = array(0 => $label, 1 => $value);
}
// return config
$config['items'] = array_merge($config['items'], $optionList);
return $config;
}
}
Werte anderer Flexform-Felder auslesen
Sie können innerhalb Ihrer Funktion natürlich auch auf die gespeicherten Werte von anderen Flexform-Felder zugreifen. Der folgenden Code liest zum Beispiel den gespeicherten Wert des Feldes myfield aus.
$flexformContent = t3lib_div::xml2array($config['row']['pi_flexform']);
if(is_array($flexformContent)) {
$myfield = $flexformContent['data']['tab1']['lDEF']['myfield']['vDEF'];
}
Um direkt auf Eingaben im Backend zu reagieren können Sie mittels Flexform-Attribut <onChange>reload</onChange> das gesamte Formular bei Veränderungen neu laden lassen. Siehe dazu auch: Sichtbarkeit von Eingabefeldern im TYPO3-Backend steuern
ext_tables.php
Zum Schluss müssen Sie die oben angelegte Klasse noch integrieren, damit TYPO3 diese auch aufrufen kann. Fügen Sie dazu die folgende Zeile Code in die Datei ext_tables.php ihrer Extension ein.
include_once(t3lib_extMgm::extPath($_EXTKEY).'classes/class.tx_myext_flexform.php');
Vielen Dank für den Beitrag! Der kam mir gerade sehr gelegen, da ich auf der Suche war, wie man die Anzeige der Datensätze optimieren kann.