[BUGFIX] Inline record in Flexform can attach new record 34/47034/2
authorNicole Cordes <typo3@cordes.co>
Fri, 29 Jan 2016 10:36:17 +0000 (11:36 +0100)
committerNicole Cordes <typo3@cordes.co>
Fri, 4 Mar 2016 10:15:49 +0000 (11:15 +0100)
If you click the "create new element" button on an inline record within
a FlexForm field, the passed data information contains the id after
which the new element should be inserted. Currently this id isn't
respected while receiving the configuration from the given data. This
patch adds code to respect a possible given id and allows to fetch
configuration for that element as well.

Resolves: #73004
Releases: master, 7.6
Change-Id: I70263d3ff4a8641b1a8280574521e0671c34a333
Reviewed-on: https://review.typo3.org/47034
Reviewed-by: Nicole Cordes <typo3@cordes.co>
Tested-by: Nicole Cordes <typo3@cordes.co>
typo3/sysext/backend/Classes/Controller/FormInlineAjaxController.php

index 83e239f..0dc3915 100644 (file)
@@ -267,7 +267,7 @@ class FormInlineAjaxController
         $parentConfig = $parentData['processedTca']['columns'][$parentFieldName]['config'];
 
         if ($parentConfig['type'] === 'flex') {
-            $parentConfig = $this->getParentConfigFromFlexForm($parentConfig, $domObjectId, false);
+            $parentConfig = $this->getParentConfigFromFlexForm($parentConfig, $domObjectId);
             $parentData['processedTca']['columns'][$parentFieldName]['config'] = $parentConfig;
         }
 
@@ -868,10 +868,9 @@ class FormInlineAjaxController
      *
      * @param array $parentConfig
      * @param string $domObjectId
-     * @param bool $newRecord
      * @return array
      */
-    protected function getParentConfigFromFlexForm(array $parentConfig, $domObjectId, $newRecord = true)
+    protected function getParentConfigFromFlexForm(array $parentConfig, $domObjectId)
     {
         // Substitute FlexForm addition and make parsing a bit easier
         $domObjectId = str_replace('---', ':', $domObjectId);
@@ -886,7 +885,7 @@ class FormInlineAjaxController
             // For new records the flexform path should be the second to last array element,
             // followed by the foreign table name. For existing records it should be the third
             // array element from the end as the UID of the inline record is provided as well.
-            $parts = array_slice(explode('-', $match['anything']), ($newRecord ? -2 : -3), 2);
+            $parts = array_slice(explode('-', $match['anything'], 4), -2, 2);
 
             if (count($parts) !== 2 || !isset($parts[0]) || strpos($parts[0], ':') === false) {
                 throw new \UnexpectedValueException(
@@ -907,7 +906,8 @@ class FormInlineAjaxController
             }
 
             $flexFormPath = array_slice($fieldParts, 2);
-            $foreignTableName = $parts[1];
+            $foreignTableNameParts = explode('-', $parts[1]);
+            $foreignTableName = $foreignTableNameParts[0];
         }
 
         $childConfig = $parentConfig['ds']['sheets'];