[BUGFIX] Fix adding fields to an existing table in a specific position 35/47935/10
authorThomas Schlumberger <thomas@b13.de>
Wed, 27 Apr 2016 12:05:13 +0000 (14:05 +0200)
committerMarkus Klein <markus.klein@typo3.org>
Thu, 28 Apr 2016 12:18:47 +0000 (14:18 +0200)
When trying to add new fields at a specific position to an existing
table (e.g. "after:title") and the field referenced in the position is
part of a palette the regular expression to insert the new fields did
not work.

This happened because a regular expression part was inserted in the
pallete string to replace and being quoted afterwards. That caused the
preg_replace function to treat the regular expression as a string as it
has been escaped.

Resolves: #75946
Releases: master,7.6
Change-Id: Ib0dbcb56e530e1671470210218bd1c1205b50946
Reviewed-on: https://review.typo3.org/47935
Reviewed-by: Nicole Cordes <typo3@cordes.co>
Tested-by: Nicole Cordes <typo3@cordes.co>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
typo3/sysext/core/Tests/Unit/Utility/ExtensionManagementUtilityTest.php

index 47977da..5ba75aa 100644 (file)
@@ -666,11 +666,12 @@ class ExtensionManagementUtility
         // The $insertPosition may be a palette: after:--palette--;;title
         // In the $list the palette may contain a LLL string in between the ;;
         // Adjust the regex to match that
+        $positionName = preg_quote($positionName, '/');
         if (strpos($positionName, ';;') !== false) {
             $positionName = str_replace(';;', ';[^;]*;', $positionName);
         }
 
-        $pattern = ('/(^|,\\s*)(' . preg_quote($positionName, '/') . ')(;[^,$]+)?(,|$)/');
+        $pattern = ('/(^|,\\s*)(' . $positionName . ')(;[^,$]+)?(,|$)/');
         switch ($location) {
             case 'after':
                 $newList = preg_replace($pattern, '$1$2$3, ' . $insertionList . '$4', $list);
index 6d2a380..7d1e21f 100644 (file)
@@ -354,6 +354,21 @@ class ExtensionManagementUtilityTest extends UnitTestCase
     }
 
     /**
+     * Tests whether fields can be add to all TCA types and fields in pallets are respected.
+     *
+     * @test
+     * @see ExtensionManagementUtility::addToAllTCAtypes()
+     */
+    public function canAddFieldsToAllTCATypesRespectsPositionFieldInPalette()
+    {
+        $table = $this->getUniqueId('tx_coretest_table');
+        $GLOBALS['TCA'] = $this->generateTCAForTable($table);
+        ExtensionManagementUtility::addToAllTCAtypes($table, 'newA, newA, newB, fieldA', '', 'after:fieldX1');
+        // Checking typeA:
+        $this->assertEquals('fieldA, fieldB, fieldC;labelC, --palette--;;paletteC, newA, newB, fieldC1, fieldD, fieldD1', $GLOBALS['TCA'][$table]['types']['typeA']['showitem']);
+    }
+
+    /**
      * Tests whether fields can be add to a TCA type before existing ones
      *
      * @test