Eigene Formularelemente in der eigenen TYPO3 Extension im Backend

Mit FlexForms.

Wenn man die eigene Extension im Backend bzw. z.B. in eigenen Content-Elementen verwenden möchte, helfen die FlexForms dabei. Hierzu muss man diese in einer XML-Dateizunächst definieren.

Man kann diese ebenfalls in Sheets aufteilen, die per Tab (Reiter) dargestellt werden. Unter anderem die bekannte Extension tt_news setzt auf diese Technik.

Ein Anwendungsfall wäre zum Beispiel eine Auswahlbox, wie in tt_news, in der man auswählen kann, ob die Darstellung der eigenen Extension als Liste oder Teaser erfolgen soll.

In meinem Fall lege ich eine XML-Datei in das root-Verzeichnis meiner Extension 
die flexform_pi1.xml heißt:

    <T3DataStructure>
    <meta>
    <langDisable>1</langDisable>
    </meta>
    <ROOT>
    <TCEforms>
    <sheetTitle>Optionen</sheetTitle>
    </TCEforms>
    <type>array</type>
    <el>
    <what_to_display>
    <TCEforms>
    <label>Was soll angezeigt werden?</label>
    <config>
    <type>select</type>
    <items type="array">
    <numIndex index="0" type="array">
    <numIndex index="0">Liste</numIndex>
    <numIndex index="1">list</numIndex>
    </numIndex>
    <numIndex index="1" type="array">
    <numIndex index="0">Teaser</numIndex>
    <numIndex index="1">teaser</numIndex>
    </numIndex>
    </items>
    <maxitems>1</maxitems>
    <size>1</size>
    </config>
    </TCEforms>
    </what_to_display>
    </el>
    </ROOT>
    </T3DataStructure>

Anschließend müssen noch zwei Zeilen Code in der ext_tables.php der eigenen Extension eingefügt werden, um TYPO3 mit der XML-Datei bekannt zu machen.

    $TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1'] = 'pi_flexform';
    t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1', 'FILE:EXT:'.$_EXTKEY.'/flexform_pi1.xml');

Zugreifen kann man dann in der eigenen Klasse auf die Werte der FlexForms so:

// Die FlexForms werden initialisiert
$this->pi_initPIflexForm();
 
// Anschließend kann auf auf die Werte folgendermaßen zugegriffen werden
// in unserem Fall wurde ein Wert what_to_display in der XML definiert:
 
$whatToDisplay=$this->pi_getFFvalue($this->cObj->data['pi_flexform'],"what_to_display");