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 Anerkennung honorierst:

Zahlung mit PayPal oder Kreditkarte.

Hinweis zur Verwendung

Die Übermittlung einer Zahlung ist eine persönliche Anerkennung Ihrerseits an den Entwickler (Christian Bartl, Privatperson). Eine Zahlung ist nicht zweckgebunden und es ist keine Gegenleistung zu erwarten. Bitte beachten Sie, dass für eine übermittelte Zahlung keine Quittung ausgestellt werden kann.

Über den Autor

Christian Bartl

Christian Bartl Requirements Engineer
& Solution Architect für Online und Mobile

Als Technologie-Enthusiast und begeisterter Programmierer entwickle ich in meiner Freizeit Websites, Software und IT-Lösungen, die mir selbst und anderen den Alltag vereinfachen.

mehr auf christian.bartl.me

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

Der hier angegebene Name wird gemeinsam mit deinem Kommentar auf der Website veröffentlicht.

Deine E-Mail-Adresse wird zur einmaligen Benachrichtigung bei Veröffentlichung des Kommentars genutzt.

Benachrichtigung per E-Mail über Antworten auf meinen Kommentar erhalten.

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

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