TCA (flexform) multi select - typo3

I work on an extension and for a plugin I want to select specific records. For that I created a flexform with a TCA select configuration:
<T3DataStructure>
<meta>
<langDisable>1</langDisable>
</meta>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>TEST</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.selection>
<TCEforms>
<exclude>1</exclude>
<label>Selection</label>
<config>
<type>select</type>
<foreign_table>tx_mycollection_domain_model_mycollection</foreign_table>
<renderType>selectCheckBox</renderType>
<size>5</size>
<minItems>3</minItems>
<maxItems>999</maxItems>
<foreign_table_where>AND tx_mycollection_domain_model_mycollection.sys_language_uid=###REC_FIELD_sys_language_uid###</foreign_table_where>
</config>
</TCEforms>
</settings.selection>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
It looks fine, in the backend I have checkboxes to select the records. But when I save the plugin only the first checkbox is checked/saved.
Is there something wrong in the configuration or what could be the reason that I can not save multible values?

<minItems>3</minItems>
<maxItems>999</maxItems>
From the documentation here:
https://docs.typo3.org/typo3cms/TCAReference/Reference/Columns/Select/Index.html#properties
These needs to be specified as all lower case, so changing them to:
<minitems>3</minitems>
<maxitems>999</maxitems>
Should resolve your issue. It is saving only 1 right now, since maxitems by default is set to 1.

Related

Get sys_categories from tt_content flexform settings

Let's say I have a FE Plugin with the option to set some sys_category references via the following flexform field:
<settings.categories>
<TCEforms>
<label>Some Label</label>
<config>
<type>select</type>
<foreign_table>sys_category</foreign_table>
<foreign_table_where> AND sys_category.sys_language_uid IN (-1, 0) ORDER BY sys_category.sorting ASC</foreign_table_where>
<MM>sys_category_record_mm</MM>
<MM_opposite_field>items</MM_opposite_field>
<MM_match_fields>
<tablenames>tt_content</tablenames>
<fieldname>categories</fieldname>
</MM_match_fields>
<maxitems>9999</maxitems>
<renderMode>tree</renderMode>
<size>10</size>
<treeConfig>
<appearance>
<expandAll>1</expandAll>
<showHeader>1</showHeader>
</appearance>
<parentField>parent</parentField>
</treeConfig>
</config>
</TCEforms>
</settings.categories>
Now I want to get all category Objects referenced in the flexform in the controller of the plugin. What's the best approach to do so? Should’nt there already be a suitable repository function somewhere? Thank you for your help!
There is no dedicated API for that, however normally you wouldn't need the mm-relation. Removing that and having it like
<settings.categories>
<TCEforms>
<label>LLL:EXT:news/Resources/Private/Language/locallang_be.xlf:flexforms_general.categories</label>
<config>
<type>select</type>
<renderMode>tree</renderMode>
<renderType>selectTree</renderType>
<treeConfig>
<dataProvider>GeorgRinger\News\TreeProvider\DatabaseTreeDataProvider</dataProvider>
<parentField>parent</parentField>
<appearance>
<maxLevels>99</maxLevels>
<expandAll>TRUE</expandAll>
<showHeader>TRUE</showHeader>
<width>600</width>
</appearance>
</treeConfig>
<foreign_table>sys_category</foreign_table>
<foreign_table_where>AND (sys_category.sys_language_uid = 0 OR sys_category.l10n_parent = 0) ORDER BY sys_category.sorting</foreign_table_where>
<size>15</size>
<minitems>0</minitems>
<maxitems>99</maxitems>
</config>
</TCEforms>
</settings.categories>
it is much easier to retrieve the categories. You can also take a look at the CategoryRepository I am using for the news extension https://github.com/georgringer/news/blob/master/Classes/Domain/Repository/CategoryRepository.php

TYPO3 Ext. gridelements: Remove field from FlexForm

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

TYPO3 (7.6.15) Extbase displayCond in flexform.xml not working in one of two extensions

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

Use php array to loop in TYPO3 flex type

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

typo3 flexform html content element add in extension

how could i can add html content element in flexform in typo3.
I have tried
<settings.sDEF1.sociallinks>
<TCEforms>
<exclude>1</exclude>
<label>Social Links</label>
<config>
<type>text</type>
<renderType>t3editor</renderType>
<format>html</format>
<cols>30</cols>
<rows>5</rows>
</config>
</TCEforms>
</settings.sDEF1.sociallinks>
which not working.
ref : https://docs.typo3.org/typo3cms/TCAReference/Reference/Columns/Text/Index.html#rendertype
<options.richTextArea>
<TCEforms>
<exclude>1</exclude>
<label>
Rich Text Area
</label>
<config>
<type>text</type>
<rows>5</rows>
<cols>300</cols>
<enableRichtext>true</enableRichtext>
</config>
<defaultExtras>richtext[]</defaultExtras>
</TCEforms>
</options.richTextArea>