blog.bartlweb - a technologist's external brain

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');

Dieser Artikel hat dir deinen Tag gerettet?
... und mühevolles Probieren, Recherchieren und damit Stunden an Zeit gespart? ... oder einfach nur dein Problem gelöst?

Dann würde ich mich freuen, wenn Du meine Zeit für die Erstellung dieses Blogartikels mit einer kleinen Spende honorierst:

Kommentare

  1. 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.

    kommentieren

  2. Thank you so much for your post. You saved my day :)

    In my code, I missed array merge with $config.

    Danke :)

    kommentieren

Kommentar schreiben

Deine E-Mailadresse wird nur für Benachrichtigungen und Rückfragen verwendet und wird nicht veröffentlicht.

Benachrichtigungen können jederzeit wieder abbestellt werden.

Bitte tippe die Zahlenkombination "8990" ein, nur dann kann ich deinen Kommentar entgegennehmen.

Bitte fülle dieses Feld nicht aus, nur dann kann ich deinen Kommentar entgegennehmen.