[BUGFIX] FormEngine: Instantiate ExtJS tree in new flexform sections 31/44431/2
authorMorton Jonuschat <m.jonuschat@mojocode.de>
Sat, 31 Oct 2015 09:38:05 +0000 (10:38 +0100)
committerWouter Wolters <typo3@wouterwolters.nl>
Sat, 31 Oct 2015 11:17:47 +0000 (12:17 +0100)
Fix support for rendering trees in new flexform sections. The javascript
needs to be added to the code executed on click and it needs to be
modified at runtime to ensure unique tree ids get generated before
instantiation.

Resolves: #70473
Releases: master
Change-Id: Id37f842fa7ade2fc3858eaf832413f932b8486a6
Reviewed-on: https://review.typo3.org/44431
Reviewed-by: Gernot Schulmeister <gernotschulmeister@gmx.at>
Tested-by: Gernot Schulmeister <gernotschulmeister@gmx.at>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
typo3/sysext/backend/Classes/Form/Container/FlexFormSectionContainer.php

index 0e43f30..bbb2a83 100644 (file)
@@ -111,15 +111,28 @@ class FlexFormSectionContainer extends AbstractContainer
             $options['renderType'] = 'flexFormContainerContainer';
             $flexFormContainerContainerTemplateResult = $this->nodeFactory->create($options)->render();
 
             $options['renderType'] = 'flexFormContainerContainer';
             $flexFormContainerContainerTemplateResult = $this->nodeFactory->create($options)->render();
 
+            // Extract the random identifier used by the ExtJS tree. This is used later on in the onClick handler
+            // to dynamically modify the javascript code and instanciate a unique ExtJS tree instance per section.
+            if (!empty($flexFormContainerContainerTemplateResult['extJSCODE'])) {
+                $treeElementIdentifier = '';
+                if (preg_match('/StandardTreeItemData\["([a-f0-9]{32})"\]/', $flexFormContainerContainerTemplateResult['extJSCODE'], $matches)) {
+                    $treeElementIdentifier = $matches[1];
+                }
+            }
+
             $uniqueId = StringUtility::getUniqueId('idvar');
             $identifierPrefixJs = 'replace(/' . $flexFormFieldIdentifierPrefix . '-/g,"' . $flexFormFieldIdentifierPrefix . '-"+' . $uniqueId . '+"-")';
             $identifierPrefixJs .= '.replace(/(tceforms-(datetime|date)field-)/g,"$1" + (new Date()).getTime())';
             $uniqueId = StringUtility::getUniqueId('idvar');
             $identifierPrefixJs = 'replace(/' . $flexFormFieldIdentifierPrefix . '-/g,"' . $flexFormFieldIdentifierPrefix . '-"+' . $uniqueId . '+"-")';
             $identifierPrefixJs .= '.replace(/(tceforms-(datetime|date)field-)/g,"$1" + (new Date()).getTime())';
+            $identifierPrefixJs .= '.replace(/(tree_?)?' . $treeElementIdentifier . '/g,"$1" + (' . $uniqueId . '))';
 
             $onClickInsert = array();
             $onClickInsert[] = 'var ' . $uniqueId . ' = "' . 'idx"+(new Date()).getTime();';
             $onClickInsert[] = 'TYPO3.jQuery("#' . $flexFormFieldIdentifierPrefix . '").append(TYPO3.jQuery(' . json_encode($flexFormContainerContainerTemplateResult['html']) . '.' . $identifierPrefixJs . '));';
             $onClickInsert[] = 'TYPO3.jQuery("#' . $flexFormFieldIdentifierPrefix . '").t3FormEngineFlexFormElement();';
             $onClickInsert[] = 'eval(unescape("' . rawurlencode(implode(';', $flexFormContainerContainerTemplateResult['additionalJavaScriptPost'])) . '").' . $identifierPrefixJs . ');';
 
             $onClickInsert = array();
             $onClickInsert[] = 'var ' . $uniqueId . ' = "' . 'idx"+(new Date()).getTime();';
             $onClickInsert[] = 'TYPO3.jQuery("#' . $flexFormFieldIdentifierPrefix . '").append(TYPO3.jQuery(' . json_encode($flexFormContainerContainerTemplateResult['html']) . '.' . $identifierPrefixJs . '));';
             $onClickInsert[] = 'TYPO3.jQuery("#' . $flexFormFieldIdentifierPrefix . '").t3FormEngineFlexFormElement();';
             $onClickInsert[] = 'eval(unescape("' . rawurlencode(implode(';', $flexFormContainerContainerTemplateResult['additionalJavaScriptPost'])) . '").' . $identifierPrefixJs . ');';
+            if (!empty($treeElementIdentifier)) {
+                $onClickInsert[] = 'eval(unescape("' . rawurlencode($flexFormContainerContainerTemplateResult['extJSCODE']) . '").' . $identifierPrefixJs . ');';
+            }
             $onClickInsert[] = 'TBE_EDITOR.addActionChecks("submit", unescape("' . rawurlencode(implode(';', $flexFormContainerContainerTemplateResult['additionalJavaScriptSubmit'])) . '").' . $identifierPrefixJs . ');';
             $onClickInsert[] = 'TYPO3.FormEngine.reinitialize();';
             $onClickInsert[] = 'return false;';
             $onClickInsert[] = 'TBE_EDITOR.addActionChecks("submit", unescape("' . rawurlencode(implode(';', $flexFormContainerContainerTemplateResult['additionalJavaScriptSubmit'])) . '").' . $identifierPrefixJs . ');';
             $onClickInsert[] = 'TYPO3.FormEngine.reinitialize();';
             $onClickInsert[] = 'return false;';