Flex Form
Flex Form
Flex Form
1 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
Translations
Info
All page names need to be in English.
en da de fr it ja km nl ru zh
From TYPO3Wiki
[edit] (https://wiki.typo3.org/wiki/index.php?title=Extension_Development,_using_Flexforms&
action=edit§ion=0)
Contents
1 FlexForms In Action
2 Before You Start
2.1 Create Your Extension
3 Configure the Extension for configuration in the BE
3.1 Modify ext_tables.php
3.2 Creating flexform_ds_pi1.xml
3.2.1 An Example flexform_ds_pi1.xml
3.2.2 Brief Overview
3.3 Dynamic Data in Flexforms
3.4 Display conditions and dynamic reloading of form
3.5 Modifying the Language Data
4 Programming Your Plugin for the FE output
4.1 Accessing Flexform Options
4.2 Accessing Flexform Values in ExtBase Extensions
5 Final Notes
6 Existing/finished documents
6.1 Existing References
FlexForms In Action
The following is a short list of plugins that currently utilize the power of FlexForms:
tt_news
ab_linklist
ab_downloads
chc_forum
better_login_box
templavoila
ve_guestbook
newscalendar
wfqbe
01.03.2016 20:52
2 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
While this list is not complete, it gives you an idea of the wide variety of applications of flexforms.
Modify ext_tables.php
By default you'll have a file that looks similar to this one (with the exception that this module does not have
any database tables to ensure simple demonstration):
PHP script:
<?php
if (!defined ('TYPO3_MODE'))
die ('Access denied.');
// you can exclude some fields form backend-rendering - it have nothing to do with your extension
$TCA['tt_content']['types']['list']['subtypes_excludelist'][$_EXTKEY.'_pi1']='layout,select_key,pages';
// your plugin is added to the Plugin-List
t3lib_extMgm::addPlugin(Array('LLL:EXT:/locallang_db.php:tt_content.list_type_pi1', $_EXTKEY.'_pi1'),'list_type'
//
t3lib_extMgm::addStaticFile($_EXTKEY,"pi1/static/","A Sample Flexform Plugin");
// you can add an backend-wizard like the formular or table-wizard
if (TYPO3_MODE=="BE")
$TBE_MODULES_EXT["xMOD_db_new_content_el"]["addElClasses"]["tx_sampleflex_pi1_wizicon"
?>
You'll need to add a couple of lines as marked at the end of the lines (not needed for "totally new content
element type"):
PHP script:
<?php
if (!defined ('TYPO3_MODE'))
die ('Access denied.');
$TCA['tt_content']['types']['list']['subtypes_excludelist'][$_EXTKEY.'_pi1']='layout,select_key,pages';
// you add pi_flexform to be renderd when your plugin is shown
$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';
// new!
t3lib_extMgm::addPlugin(Array('LLL:EXT:/locallang_db.php:tt_content.list_type_pi1', $_EXTKEY.'_pi1'),'list_type'
t3lib_extMgm::addStaticFile($_EXTKEY,"pi1/static/","A Sample Flexform Plugin");
// now, add your flexform xml-file
t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1', 'FILE:EXT:'.$_EXTKEY.'/flexform_ds_pi1.xml');
// new!
01.03.2016 20:52
3 of 13
if (TYPO3_MODE=="BE")
?>
https://wiki.typo3.org/Extension_Development,_using_Flexforms
$TBE_MODULES_EXT["xMOD_db_new_content_el"]["addElClasses"]["tx_sampleflex_pi1_wizicon"
If you try to add the plugin as as "totally new content element type" instead of a ordinary entry in the plugin
list, following change has to be made in ext_tables.php:
PHP script:
These extra lines add the Flexform XML (located in the file EXT:sampleflex/flexform_ds_pi1.xml) to our
extension allowing us to use flexforms with our plugin.
Creating flexform_ds_pi1.xml
You can create the flexform manually or let it be generated by the extension T3Dev (http://typo3.org
/extensions/repository/view/t3dev/). When changing an existing flexform XML file or want to create it from
scratch you should know something about its structure. Follow the lines below to get a basic understanding.
Create the file flexform_ds_pi1.xml in the above mentioned directory of your extension. It must be properly
formatted XML, so be careful about the tag opening/closing. In the examples below we use text and captions
references to the file 'locallang_db.php'. This is the 'old style' of handling localisation. You can change
'locallang_db.php' to 'locallang_db.xml' if you want to use the modern style. Note: T3dev is generating the
flexform with 'locallang_db.php', so find and replace could help ;-).
An Example flexform_ds_pi1.xml
A sample flexform_ds_pi1.xml looks like:
XML / HTML:
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_general</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<pages>
<TCEforms>
<exclude>1</exclude>
<label>LLL:EXT:lang/locallang_general.php:LGL.startingpoint</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>3</size>
<maxitems>22</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</pages>
<recursive>
<TCEforms>
<label>LLL:EXT:lang/locallang_general.php:LGL.recursive</label>
<config>
01.03.2016 20:52
4 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"></numIndex>
<numIndex index="1"></numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.1</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.2</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.3</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.4</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="5" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.5</numIndex>
<numIndex index="1">250</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
<size>1</size>
</config>
</TCEforms>
</recursive>
</el>
</ROOT>
</sDEF>
<display>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_display</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<disable_rte>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.disable_rte</label>
<config>
<type>check</type>
</config>
</TCEforms>
</disable_rte>
</el>
</ROOT>
</display>
<error>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_error</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<show_errors>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.show_errors</label>
<config>
<type>check</type>
</config>
</TCEforms>
</show_errors>
<prepend_text>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.prepend_text</label>
<config>
<type>input</type>
<size>30</size>
</config>
</TCEforms>
</prepend_text>
</el>
</ROOT>
01.03.2016 20:52
5 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
</error>
</sheets>
</T3DataStructure>
Brief Overview
Let's dissect this XML and go over some of the parts.
XML / HTML:
<T3DataStructure>
<sheets>
All of our sheets go inside this (<sheets>) tag. Sheets are tabs which allow different pages to be displayed to
further separate our configuration options. This allows us to separate the general configuration options such
as Starting Point from display configuration options such as Disabling the RTE.
XML / HTML:
<sDEF>
<ROOT>
We need to assign a label for the tab. We need to ensure future capabilities, so we are using the builtin
language features.
XML / HTML:
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_general</sheetTitle>
</TCEforms>
<type>array</type>
<el>
The following is one option on that page. This specific field overrides the default starting point, which is just
groovy! It opens a new window allowing for record lookup similar to the default behavior of Starting Point.
XML / HTML:
<pages>
<TCEforms>
<exclude>1</exclude>
<label>LLL:EXT:lang/locallang_general.php:LGL.startingpoint</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>pages</allowed>
<size>3</size>
<maxitems>22</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</pages>
01.03.2016 20:52
6 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
The following option allows us to specify the recursive style to use when looking for records in our starting
point. It is a selector box with pre-defined options.
XML / HTML:
<recursive>
<TCEforms>
<label>LLL:EXT:lang/locallang_general.php:LGL.recursive</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"></numIndex>
<numIndex index="1"></numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.1</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.2</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.3</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.4</numIndex>
<numIndex index="1">4</numIndex>
</numIndex>
<numIndex index="5" type="array">
<numIndex index="0">LLL:EXT:cms/locallang_ttc.php:recursive.I.5</numIndex>
<numIndex index="1">250</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
<size>1</size>
</config>
</TCEforms>
</recursive>
</el>
</ROOT>
</sDEF>
Note : this will create a duplicate starting point dialog box since the TCA already shows one by
default.
In order to get rid of the TCA starting point dialog and only have the flexform one displayed, proceed as is :
In your ext_tables.php file, look for this line :
PHP script:
$TCA["tt_content"]["types"]["list"]["subtypes_excludelist"][$_EXTKEY."_pi1"]="layout,select_key";
add the following field to be hidden : pages (not needed for "totally new content element type")
PHP script:
$TCA['tt_content']['types']['list']['subtypes_excludelist'][$_EXTKEY.'_pi1']='layout,select_key,pages';
Then hit the link "Clear cache in typo3conf/" (above "Clear FE cache" in the modules columun of the Typo3
01.03.2016 20:52
7 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
interface) and reload your flexform. The TCA startingpoint should now have disapeared.
</sDEF> marks the end of our General sheet. We could use one sheet for the entire config, however, we
want to separate a few options by placing them on their own sheet. So, we create another sheet for the
display.
XML / HTML:
<display>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_display</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<disable_rte>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.disable_rte</label>
<config>
<type>check</type>
</config>
</TCEforms>
</disable_rte>
</el>
</ROOT>
</display>
Let's add an additional sheet for dealing with errors... For this one, while the format is the same, we also
require a Checkbox and a String Input on this sheet.
XML / HTML:
<error>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_error</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<show_errors>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.show_errors</label>
<config>
<type>check</type>
</config>
</TCEforms>
</show_errors>
<prepend_text>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.prepend_text</label>
<config>
<type>input</type>
<size>30</size>
</config>
</TCEforms>
</prepend_text>
</el>
</ROOT>
</error>
This is the end of our sheets, so we'll close the opening tags, save and continue our efforts!
XML / HTML:
</sheets>
</T3DataStructure>
8 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
There are several different types of elements you can insert into pages such as color selectors,
database selectors, etc. These are basic examples. If you require more complex or further options,
please read the appropriate manuals. Link to each are located at the end of this document.
<dynField>
<TCEforms>
<label>LLL:EXT:sampleflex/locallang_db.php:sampleflex.pi_flexform.dynField</label>
<config>
<type>select</type>
<itemsProcFunc>tx_sampleflex_addFieldsToFlexForm->addFields</itemsProcFunc>
</config>
</TCEforms>
</dynField>
You can now create a file class.tx_sampleflex_addFieldsToFlexForm.php in your extension directory and
include it in ext_tables.php as
PHP script:
include_once(t3lib_extMgm::extPath($_EXTKEY).'class.tx_sampleflex_addFieldsToFlexForm.php');
class tx_sampleflex_addFieldsToFlexForm {
function addFields ($config) {
$optionList = array();
// add first option
$optionList[0] = array(0 => 'option1', 1 => 'value1');
// add second option
$optionList[1] = array(0 => 'option2', 1 => 'value2');
$config['items'] = array_merge($config['items'],$optionList);
return $config;
}
}
Now you will see 'option1' and 'option2' in the list, you can select from in the backend.
Note : Your class name has to start with 'tx_' or it won't work
<onChange>reload</onChange>
01.03.2016 20:52
9 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
You can then add a special condition tag to all FlexForm fields which expects a certain value of the type
field. (displayCondition)
XML / HTML:
<displayCond>FIELD:myField:=:myValue</displayCond>
The current field is only displayed if the field myField is set to the value "myValue".
Note: The tags on same level/sheet. If <langChildren> is enabled, then the value of other fields on same
level is taken from the same language.
The field-values of the FlexForm-parent record are prefixed with "parentRec.". These fields can be used like
every other field (since TYPO3 4.3).
This example would require the header-field of the FlexForm-parent record to be true, otherwise the
FlexForm field is not displayed (works only within FlexForm datastructure definitions):
XML / HTML:
<displayCond>FIELD:parentRec.header:REQ:true</displayCond>
XML / HTML:
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>LLL:EXT:sampleflex/locallang_db.php:tt_content.pi_flexform.sheet_general</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<myField>
<TCEforms>
<label>myField</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"></numIndex>
<numIndex index="1"></numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">My Value 1</numIndex>
<numIndex index="1">myValue1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">My Value 2</numIndex>
<numIndex index="1">myValue2</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
01.03.2016 20:52
10 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
<maxitems>1</maxitems>
<size>1</size>
</config>
</TCEforms>
</myField>
<myOtherField>
<TCEforms>
<label>This field is only visible if "myField=myValue1"</label>
<displayCond>FIELD:myField:=:myValue1</displayCond>
<config>
<type>input</type>
</config>
</TCEforms>
</myOtherField>
</el>
</ROOT>
</display>
</sheets>
</T3DataStructure>
Aside from any additional fields you may have, the following example sets all of our flexform labels
properly. I only speak one language, so I create only the default language. If you know multiple languages,
go ahead and fill them out accordingly.
A sample EXT:sampleflex/locallang_db.php
PHP script:
<?php
$LOCAL_LANG = Array (
'default' => Array (
'tt_content.list_type_pi1' => 'Sample Flexform Plugin',
'tt_content.pi_flexform.sheet_general' => 'General Settings',
'tt_content.pi_flexform.sheet_display' => 'Display Settings',
'tt_content.pi_flexform.sheet_error' => 'Error Handling Settings',
'tt_content.pi_flexform.disable_rte' => 'Disable the Rich Text Editor',
'tt_content.pi_flexform.show_errors' => 'Show Errors',
'tt_content.pi_flexform.prepend_text' => 'Text to prepend errors with',
),
);
?>
Theoretically we should now be able to insert our new plugin into a page and have a flexform for the
configuration in the backend!
Configuration for new format multilang file locallang_db.xml
XML / HTML:
01.03.2016 20:52
11 of 13
</data>
</T3locallang>
https://wiki.typo3.org/Extension_Development,_using_Flexforms
If all went well, you should be able to configure your plugin with a flexform. The question now is, "How do
I access that information from my plugin?"
For me, I stopped configuring plugins with setup/constants, so I create a new variable $lConf in my plugin
class to store the data. This allows me to use TypoScript Setup/Constants if I really need to use them. I wrote
my own function for handling/parsing the Flexform data and inserting it into my $this->lConf array.
Warning: This might not work if you use template_file as there are several keys by that name in the
array!
PHP script:
/**
* initializes the flexform and all config options ;-)
*/
function init(){
$this->pi_initPIflexForm(); // Init and get the flexform data of the plugin
$this->lConf = array(); // Setup our storage array...
// Assign the flexform data to a local variable for easier access
$piFlexForm = $this->cObj->data['pi_flexform'];
// Traverse the entire array based on the language...
// and assign each configuration option to $this->lConf array...
foreach ( $piFlexForm['data'] as $sheet => $data ) {
foreach ( $data as $lang => $value ) {
foreach ( $value as $key => $val ) {
$this->lConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
}
}
}
}
While there are other methods of handling the flexform options, I like handling them myself. You could just
as easily add the following to any function (including the main function) and handle it appropriately:
PHP script:
...
...
$this->pi_initPIflexForm(); // Init and get the flexform data of the plugin
...
...
The line above stores all of the flexform options in the array $this->cObj->data['pi_flexform']. You can
access the data stored in that array either directly, or by using the
$this->pi_getFFvalue($this->cObj->data['pi_flexform'], "key_name", "sheet_name") function. By
using the init() function above, I get an array similar to the standard $this->conf, which allows me to easily
migrate my existing plugin from the TypoScript Setup/Constant method to flexforms.
Note
01.03.2016 20:52
12 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
$piFlexForm = $this->cObj->data['pi_flexform'];
$index = $GLOBALS['TSFE']->sys_language_uid;
$sDef = current($piFlexForm['data']);
$lDef = array_keys($sDef);
$flexFormValuesArray['department'] = $this->pi_getFFvalue($piFlexForm, 'department', 'sDEF', $lDef[$index]);
$index = $GLOBALS['TSFE']->sys_language_uid;
$sDef = current($piFlexForm['data']);
$lDef = array_keys($sDef);
foreach ( $piFlexForm['data'] as $sheet => $data ) {
foreach ($data[$lDef[$index]] as $key => $val ) {
$this->lConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet,$lDef[$index]);
}
}
<T3DataStructure>
<ROOT>
<type>array</type>
<el>
<settings.itemName>
<TCEforms>
<label>Configuration options for xxx</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0"></numIndex>
<numIndex index="1"></numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</settings.itemName>
</el>
</ROOT>
</T3DataStructure>
Final Notes
You'll need to decide how you want to handle your flexform data, but you should have very little problem
getting the data at this point. If you need to continue using the standard Setup/Constant method, I
recommend reading the link at the end entitled: Merge plugin TS configuration with flexform
01.03.2016 20:52
13 of 13
https://wiki.typo3.org/Extension_Development,_using_Flexforms
configuration.
Existing/finished documents
You find all the different extension manuals either by the extensions (http://typo3.org/extensions/) themself
or in the TYPO3 documentation matrix (https://docs.typo3.org/typo3cms/).
Existing References
Merge plugin TS configuration with flexform configuration. (https://docs.typo3.org/typo3cms
/extensions/api_macmade/DeveloperApi/Php5Classes/TxApimacmadeFlexform/Index.html)
EXT: Library for Frontend plugins (https://docs.typo3.org/typo3cms/extensions/sg_zfelib/)
Retrieved from "https://wiki.typo3.org/wiki/index.php?title=Extension_Development,_using_Flexforms&
oldid=75317"
Categories: Developer Extension HowTo FlexForms Extension development 2009
This page was last modified on 24 May 2015, at 13:27.
01.03.2016 20:52