[BUGFIX] Empty array not encoded as empty XML tag 99/44599/3
authorAndreas Wolf <dev@a-w.io>
Sat, 7 Nov 2015 13:55:47 +0000 (14:55 +0100)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Sat, 7 Nov 2015 15:33:08 +0000 (16:33 +0100)
When encoding an empty array, an empty line with indentation was
created. If the <el> tag had a proper type="array" attribute, it could
still be decoded to an array again. If not, it was decoded to a string,
leading to errors e.g. when trying to traverse it.

The fix is to include an empty element now, which will be decoded to
an empty array again then.

Change-Id: Ia78adc1e7e81a943cdbc94f3cfa19b36442c430f
Resolves: #71394
Releases: 6.2, master
Reviewed-on: https://review.typo3.org/44599
Reviewed-by: Juan Manuel Vergés Solanas <juanmanuel.vergessolanas@gmail.com>
Tested-by: Juan Manuel Vergés Solanas <juanmanuel.vergessolanas@gmail.com>
Reviewed-by: Hans Höchtl <jhoechtl@gmail.com>
Tested-by: Hans Höchtl <jhoechtl@gmail.com>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php

index d24bc28..baec046 100755 (executable)
@@ -2136,11 +2136,15 @@ class GeneralUtility
                     $subOptions = $options;
                     $clearStackPath = false;
                 }
-                $content = $nl . self::array2xml($v, $NSprefix, ($level + 1), '', $spaceInd, $subOptions, array(
-                    'parentTagName' => $tagName,
-                    'grandParentTagName' => $stackData['parentTagName'],
-                    'path' => ($clearStackPath ? '' : $stackData['path'] . '/' . $tagName)
-                )) . ($spaceInd >= 0 ? str_pad('', ($level + 1) * $indentN, $indentChar) : '');
+                if (count($v) === 0) {
+                    $content = '';
+                } else {
+                    $content = $nl . self::array2xml($v, $NSprefix, ($level + 1), '', $spaceInd, $subOptions, array(
+                            'parentTagName' => $tagName,
+                            'grandParentTagName' => $stackData['parentTagName'],
+                            'path' => ($clearStackPath ? '' : $stackData['path'] . '/' . $tagName)
+                        )) . ($spaceInd >= 0 ? str_pad('', ($level + 1) * $indentN, $indentChar) : '');
+                }
                 // Do not set "type = array". Makes prettier XML but means that empty arrays are not restored with xml2array
                 if ((int)$options['disableTypeAttrib'] != 2) {
                     $attr .= ' type="array"';
index caebc4b..56cfb9c 100644 (file)
@@ -4719,4 +4719,24 @@ text with a ' . $urlMatch . '$|s'),
         GeneralUtility::rmdir($directory);
         $this->assertTrue($check);
     }
+
+
+    /**
+     * If the element is not empty, its contents might be treated as "something" (instead of "nothing") e.g. by Fluid
+     * view helpers, which is why we want to avoid that.
+     *
+     * @test
+     */
+    public function xml2ArrayConvertsEmptyArraysToElementWithoutContent()
+    {
+        $input = [
+            'el' => []
+        ];
+
+        $output = GeneralUtility::array2xml($input);
+
+        $this->assertEquals('<phparray>
+       <el type="array"></el>
+</phparray>', $output);
+    }
 }