With TCEFORM in Page TS, you can remove a FlexForm field from an extension plugin, e.g. from EXT:news:
TCEFORM.tt_content.pi_flexform.news_pi1.additional.settings\.detailPid.disabled = 1
The example above is working, but how can I remove a field from a gridelements FlexForm?
This is not working:
TCEFORM.tt_content.pi_flexform.gridelements_pi1.mySheet.myField.disabled = 1
More detailled:
I use EXT:bootstrap_grids, which provides FlexForm "flexform_2col.xml". From this FlexForm, I want to disable tab "largeDevices" with fields "lgCol1" and "lgCol2":
<T3DataStructure>
<sheets>
[...]
<largeDevices>
<ROOT type="array">
<TCEforms>
<sheetTitle>LLL:EXT:bootstrap_grids/Resources/Private/Language/locallang_db.xlf:grid.sheet.largeDevices</sheetTitle>
</TCEforms>
<type>array</type>
<el type="array">
<lgCol1 type="array">
<TCEforms type="array">
<label>LLL:EXT:bootstrap_grids/Resources/Private/Language/locallang_db.xlf:grid.label.col1</label>
<config type="array">
<type>select</type>
<renderType>selectSingle</renderType>
<itemsProcFunc>Laxap\BootstrapGrids\Controller\FlexFormController->getTwoColumnOptions</itemsProcFunc>
</config>
</TCEforms>
</lgCol1>
<lgCol2 type="array">
<TCEforms type="array">
<label>LLL:EXT:bootstrap_grids/Resources/Private/Language/locallang_db.xlf:grid.label.col2</label>
<config type="array">
<type>select</type>
<renderType>selectSingle</renderType>
<itemsProcFunc>Laxap\BootstrapGrids\Controller\FlexFormController->getTwoColumnOptions</itemsProcFunc>
</config>
</TCEforms>
</lgCol2>
</el>
</ROOT>
</largeDevices>
But it seems, EXT:gridelements handles the FlexForm in some other way so it can't be manipulated with TCEFORM, this is not working:
TCEFORM.tt_content.pi_flexform.gridelements_pi1.largeDevices.lgCol1.disabled = 1
The key "gridelements_pi1" is wrong. It can be either "default", effecting all gridelement layout types or a specific type you defined.
So this would work for the excample from the question:
TCEFORM.tt_content.pi_flexform.default.largeDevices.lgCol1.disabled = 1
Related
I've been googling quite a bit about this problem but didn't find a mistake.
I've got a quite simple extension I wrote with Extension Builder that works just as intended. But one small mistake remains.
The extension is used for courses and course-applications. These courses are of different types. If I want to add the plugin-element to a page I have two different types of displaying options for the frontend: one is used for the home page, showing the different types of courses, the other is used for the respective course page to list all the courses of that type and a registration form. This all works perfectly. So when I add a plugin-element to the page I can either choose "Home" or "Course page". When Home is selected no further options should show. When "course page" is selected there should be showing another dropdown element with the different course types.
Only recently I realized that in my flexform I had eliminated the displayCond (don't remember why) and of course it shows the option for the course types with "home" and "course page". BUT if I add the displayCond it doesn't show with either option. Here's the flexform-code with the displayCond:
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<sheets>
<general>
<ROOT>
<TCEforms>
<sheetTitle>Kurse</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<switchableControllerActions>
<TCEforms>
<label>Ansicht</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Home</numIndex>
<numIndex index="1">Kurse->listHome</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Kursseite</numIndex>
<numIndex index="1">Kurse->list;Kunde->sendMail</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</switchableControllerActions>
<settings.kursTypen>
<TCEforms>
<label>Kurstyp</label>
<config>
<type>select</type>
<foreign_table>tx_gicourses_domain_model_kurstyp</foreign_table>
<foreign_table_where>AND (sys_language_uid=CAST('###REC_FIELD_sys_language_uid###' AS UNSIGNED) OR sys_language_uid = '-1') AND tx_gicourses_domain_model_kurstyp.deleted = 0 AND tx_gicourses_domain_model_kurstyp.hidden = 0 order by name</foreign_table_where>
<size>1</size>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
<displayCond>
<OR>
<numIndex index="1">FIELD:switchableControllerActions:=:Kurse->list</numIndex>
</OR>
</displayCond>
</TCEforms>
</settings.kursTypen>
</el>
</ROOT>
</general>
</sheets>
</T3DataStructure>
FUNNY thing is, that in another extension, where I have an according display-condition, this works just as intended:
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<sheets>
<general>
<ROOT>
<TCEforms>
<sheetTitle>Books</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<switchableControllerActions>
<TCEforms>
<label>Ansicht</label>
<onChange>reload</onChange>
<config>
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Alle</numIndex>
<numIndex index="1">Buch->list</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Nach Kategorie</numIndex>
<numIndex index="1">Buch->listByCat</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</switchableControllerActions>
<settings.buchKategorie>
<TCEforms>
<label>Buchkategorie</label>
<config>
<type>select</type>
<foreign_table>tx_gibooks_domain_model_buchkategorie</foreign_table>
<foreign_table_where>AND (sys_language_uid=CAST('###REC_FIELD_sys_language_uid###' AS UNSIGNED) OR sys_language_uid = '-1') AND tx_gibooks_domain_model_buchkategorie.deleted = 0 AND tx_gibooks_domain_model_buchkategorie.hidden = 0 order by name</foreign_table_where>
<size>1</size>
<minitems>1</minitems>
<maxitems>1</maxitems>
</config>
<displayCond>
<OR>
<numIndex index="1">FIELD:switchableControllerActions:=:Buch->listByCat</numIndex>
</OR>
</displayCond>
</TCEforms>
</settings.buchKategorie>
</el>
</ROOT>
</general>
</sheets>
</T3DataStructure>
The only difference that I had in mind was that the action in the first extension (Kurse->list) was a non-cacheable action in comparison to the one in the second extension (Buch->listByCat) which was a cacheable action. But even with changing this nothing changed when selecting the plugin-element.
Where could this problem originate from? Do I have to check something else? Is there another way of achieving the wanted result?
I've read about several similar problems but none of them stated a problem with the code I have (no typo-mistakes, condition is correct..) although I have read about several bugs that had been related to the displayCond which seemed to be resolved though.
As I'm quite new with TYPO3 I would appreciate if you could point me to files which need to be controlled and/or explain your code. Thank you
For the time being I can leave the option showing on both "Home" and "course page" but it might be quite confusing for someone (an editor) who doesn't really like working with computers...
This is half a shot from the hip, but have you tried this without the <OR> segment? Normally you don't need <AND> or <OR> when you have only a single condition to be checked - and I suspect that this is confusing the condition so it gives false positives. Take this with a grain of salt though - I'm not even sure if that displayCond is the right way to check if a string contains another string.
That said, there have been fixes for both FlexForm value resolving/checking and displayCond - so in any case it certainly is worth while to upgrade your TYPO3 version (there have been 7+ bug fix releases since your version).
I found my mistake thanks to Claus Due:
my displayCond before correction:
FIELD:switchableControllerActions:=:Kurse->list
and after:
FIELD:switchableControllerActions:=:Kurse->list;Kunde->sendMail
That's what happens when you copy something that's supposed to work but you don't even understand what it does. Thanks to the hint of Claus Due I realized that this was a comparison of strings and that the compared string didn't match with the wanted one.
So if someone wants do use this for something else: you have to use the whole string of actions after "FIELD:switchableControllerActions:=:"...
Fairly easy isn't it... Happy Coding
I had something similar. My displayCond had no effect. I folwwed the instructions on the TYPO3 Explained tutorial. In the example given the displayCond is placed inside the config tag.
Not working:
<TCEforms>
<label>Label</label>
<config>
<displayCond>FIELD:switchableControllerActions:=:Extension->themes</displayCond>
<type>input</type>
</config>
</TCEforms>
Working:
<TCEforms>
<label>Label</label>
<displayCond>FIELD:switchableControllerActions:=:Extension->themes</displayCond>
<config>
<type>input</type>
</config>
</TCEforms>
How does the "Kurse->list" look in the Flexform XML? It should read there "Kurse->list" else you probably have a tag mismatch
I'm building an extension and I have a field of type flex. I have an array with extracted records from a TS config that I like to use as prefilled values for a field, which I also want to be editable in the TYPO3 admin. So I want them to be shown as textarea, however I don't know how to use the array in the flex items configuration.
'<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Title</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<pageSelector>
<TCEforms>
<label>Something</label>
<config>
<type>text</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">'.$php_variable_array.'</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<minitems>0</minitems>
<maxitems>1</maxitems>
</config>
</TCEforms>
</pageSelector>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>'
I need to create a flexform field where the user is able to select a tt_content element - but I want to limit that to only tt_content elements from a certain page. What I have so far:
<settings.test>
<TCEforms>
<label>test</label>
<config>
<type>group</type>
<internal_type>db</internal_type>
<allowed>tt_content</allowed>
<size>1</size>
<maxitems>1</maxitems>
<minitems>0</minitems>
<show_thumbs>1</show_thumbs>
</config>
</TCEforms>
</settings.test>
is there a way to limit it to a specific page? The typo3 Version is 7.6.10.
Thank you in advance.
The <type>group</type> is used for a browselike behavior and i can not see how you can add a filter there. Since you want to show a limited number of elements, you can use <type>select</type> with foreign_table_where
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>tt_content</foreign_table>
<foreign_table_where>AND tt_content.pid = ###PAGE_TSCONFIG_ID###</foreign_table_where>
<size>1</size>
<items>
<numindex index="0">
<numindex index="0">--</numindex>
<numindex index="1"></numindex>
</numindex>
</items>
<maxitems>1</maxitems>
<minitems>0</minitems>
</config>
Then you need to set the id in your Page Config
TCEFORM.tt_content.pi_flexform.PAGE_TSCONFIG_ID = 123
I using the Typo3 7.6.10 Extbase Builder.
I have a created an extension and a have a model with one controller.
In my controller i have 2 actions. list(); searchbar();
Now i want to choose in the backend when im adding the plugin which action to start! I can't manage to do this option.
I heard about the FlexForm Options and switchableControllerActions.
But i can't manage to do this. The Documentation is bad https://wiki.typo3.org/Extension_Development,_using_Flexforms#Create_Your_Extension
For Example: t3lib_extMgm is deprecated
Is there a valid example how to do this?
Create an .xml file. I know of no convention, but it's a good idea to name the file the same as your plugin, because you need separate files for each plugin type of your extension.
typo3conf/ext/extensionkey/Configuration/FlexForms/Pluginname.xml
The xml file needs to contain at least a TCEform structure with the key switchableControllerActions as a select type option, like so.
<?xml version="1.0" encoding="UTF-8"?>
<T3DataStructure>
<sheets>
<general>
<ROOT>
<TCEforms>
<sheetTitle>Display type</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<switchableControllerActions>
<TCEforms>
<label>Display</label>
<config>
<type>select</type>
<items type="array">
<numIndex index="1" type="array">
<numIndex index="0">List</numIndex>
<numIndex index="1">Controller->list</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Search bar</numIndex>
<numIndex index="1">Controller->searchbar</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</switchableControllerActions>
</el>
</ROOT>
</general>
</sheets>
</T3DataStructure>
Next, make the Flexform known in the Backend by registering the file. Make note of the $pluginSignature variable. It must match the pattern of extension_pluginname. You'll have to define the plugin name accordingly.
// Register FlexForm Configuration
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['extension_plugin'] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
'extension_plugin',
'FILE:EXT:extensionkey/Configuration/FlexForms/Pluginname.xml'
);
In the example above, replace "extension_plugin" and "extensionkey" accordingly.
Lastly, flush the system cache and you should be good to go. The configuration option should turn up in the plugins settings. The switchableControllerActions value defined should then replace your standard action for the plugin instance.
There are, however, a few more things to point out: Note, that the actions you define replaces the allowed cacheableControllerAction combination. So, if your extension has, for extample, another action show() for this plugin instance, that one needs to be appended like so:
<numIndex index="1" type="array">
<numIndex index="0">List</numIndex>
<numIndex index="1">Controller->list;Controller->show</numIndex>
</numIndex>
It would be very convenient in the case of end-user controlled layout options. E.g:
<div class="ImageContainer <<PositionClass>>">
<img src="/someimage.png" />
</div>
The position class (like maybe Left, Right, Background) would be set the user by selecting a layout option from a drop down in content element. The problem is, that if you map such an option to the class attribute of the container div, the base class(named ImageContainer in the above example) will be overwritten.
Is it possible to append a value to an existing attribute rather that overwriting it completely?
I've seen work-around where the end-user controlled layout option is mapped to the name attribute in stead, but i find this inelegant.
Create your composed class names in TypoScript. This way you are able to compile them from fixed and variable parts and you can even take multiple FCE fields into account.
Here is an example:
DS XML
<field_imagepos type="array">
<type>no_map</type>
<tx_templavoila type="array">
<title>Image Positioning</title>
<sample_data type="array">
<numIndex index="0"></numIndex>
</sample_data>
<eType>select</eType>
</tx_templavoila>
<TCEforms type="array">
<config type="array">
<type>select</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Left</numIndex>
<numIndex index="1">Left</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Right</numIndex>
<numIndex index="1">Right</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Background</numIndex>
<numIndex index="1">Background</numIndex>
</numIndex>
</items>
<default>Left</default>
</config>
<label>Image Positioning</label>
</TCEforms>
</field_imagepos>
<field_calc_class type="array">
<type>attr</type>
<tx_templavoila type="array">
<title>(Calculating the class attribute)</title>
<description>Pick ATTR class='ImageContainer ...'</description>
<sample_data type="array">
<numIndex index="0"></numIndex>
</sample_data>
<eType>TypoScriptObject</eType>
<tags>div:attr:class</tags>
<TypoScriptObjPath>lib.calcClass</TypoScriptObjPath>
</tx_templavoila>
</field_calc_class>
TypoScript
lib.calcClass = TEXT
lib.calcClass{
dataWrap = ImageContainer {field:field_imagepos}
}
I know this one's a bit old, but at the moment I'm trying to do something similar and I guess you could add an extra html element to wrap the image element, like this:
HTML:
<div class="ImageContainer">
<div class="<<positionClass>>">
<img src="/someimage.png" />
</div>
</div>
Of course you would have to adjust your CSS to fit your needs.
Or else, you could add the "ImageContainer" class to the select values, like this:
DS XML:
[...]
<items type="array">
<numIndex index="0" type="array"
<numIndex index="0">Left</numIndex>
<numIndex index="1">ImageContainer Left</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Right</numIndex>
<numIndex index="1">ImageContainer Right</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">Background</numIndex>
<numIndex index="1">ImageContainer Background</numIndex>
</numIndex>
</items>
[...]
HTH, best regards,
Michael