[BUGFIX] TCA: handle select renderMode=tree with minitems=1 AND maxitems=1 71/31171/3
authorAlexander Bigga <alexander.bigga@slub-dresden.de>
Fri, 27 Jun 2014 12:57:39 +0000 (14:57 +0200)
committerMarkus Klein <klein.t3@mfc-linz.at>
Mon, 7 Jul 2014 21:50:28 +0000 (23:50 +0200)
Using the TCA select renderMode=tree with the option
minitems=1 AND maxitems=1
leads to two bugs since TYPO3 4.5:

First #48943
* A new table entry won't mark the field selection as required. The yellow
  question mark is missing and you can save the entry.
* Once you select a checkbox in the tree and unselect it again, the
  required-check is working.

Second: #31637
* You load an existing table entry with a selection of e.g. a category
  which has been hidden or deleted. The selected checkbox won't be shown,
  but the required-check fails.
* Even worse: You can't select another category as the form thinks you
  have already selected one item (maxitem=1). You can fix this only by
  manipulating the database directly.

The reason for these bugs can be found in
DataPreprocessor::renderRecord_selectProc(). For maxitems = 1 the
foreign_table element ids for the tree will be fetched by getDataIdList().
These elements won't be checked whether they are valid (hidden/deleted).
This check is done in selectAddForeign() which is used for maxitems > 1.

The patch uses the same procedure as for maxitems > 1 in case
of renderMode = tree.

Resolves: #48943
Resolves: #31637
Releases: 6.3, 6.2, 6.1
Change-Id: I078ff524ea73951f2121d2c233a46bc2ae562952
Reviewed-on: https://review.typo3.org/31171
Reviewed-by: Wouter Wolters
Reviewed-by: Marcin Sągol
Tested-by: Frans Saris
Reviewed-by: Fabien Udriot
Reviewed-by: Nicole Cordes
Tested-by: Marcin Sągol
Reviewed-by: Markus Klein
Tested-by: Markus Klein

index b6207c1..0f07fd8 100644 (file)
@@ -382,7 +382,7 @@ class DataPreprocessor {
                // New data set, ready for interface (list of values, rawurlencoded)
                $dataAcc = array();
                // For list selectors (multi-value):
-               if ((int)$fieldConfig['config']['maxitems'] > 1) {
+               if ((int)$fieldConfig['config']['maxitems'] > 1 || $fieldConfig['config']['renderMode'] === 'tree') {
                        // Add regular elements:
                        if (!is_array($fieldConfig['config']['items'])) {
                                $fieldConfig['config']['items'] = array();