Index: Classes/Utility/TypoScript.php =================================================================== --- Classes/Utility/TypoScript.php (revision 2406) +++ Classes/Utility/TypoScript.php (working copy) @@ -31,7 +31,42 @@ * @api */ class Tx_Extbase_Utility_TypoScript { + /** + * Internal worker function that works with an reference to an array. + * + * @param array &$settings The settings array + * @return void + */ + protected static function convertTypoScriptArrayToPlainArrayImplementation(array &$settings) { + foreach ($settings as $key => &$value) { + $keyEndsWithDot = substr($key, -1) === '.'; + if($keyEndsWithDot) { + //current key ends with a . => copy to node without . and unset the branch with . + $keyWithoutDot = substr($key, 0, -1); + + //here we store the node value from the current key without dot to reassign it later + $hasNodeWithoutDot = array_key_exists($keyWithoutDot,$settings); + $typoScriptNodeValue = $hasNodeWithoutDot ? $settings[$keyWithoutDot] : null; + + if(is_array($value)) { + $settings[$keyWithoutDot] = self::convertTypoScriptArrayToPlainArrayImplementation($value); + + if(!is_null($typoScriptNodeValue)) { + $settings[$keyWithoutDot]['_typoScriptNodeValue'] = $typoScriptNodeValue; + } + + //unset old branch + unset($settings[$key]); + } else { + $settings[$keyWithoutDot] = null; + } + } + } + + return $settings; + } + /** * Removes all trailing dots recursively from TS settings array * @@ -40,36 +75,12 @@ * * This method performs this removal. * - * @param array $setup The settings array + * @param array $settings The settings array * @return void * @api - */ - public static function convertTypoScriptArrayToPlainArray(array $settings) { - $processedSettings = array(); - foreach ($settings as $key => $value) { - if (substr($key, -1) === '.') { - $keyWithoutDot = substr($key, 0, -1); - if (is_array($value)) { - $processedSettings[$keyWithoutDot] = self::convertTypoScriptArrayToPlainArray($value); - } else { - $processedSettings[$keyWithoutDot] = NULL; - } - if (array_key_exists($keyWithoutDot, $settings)) { - $processedSettings[$keyWithoutDot]['_typoScriptNodeValue'] = $settings[$keyWithoutDot]; - unset($settings[$keyWithoutDot]); - } - } else { - $keyWithDot = $key . '.'; - if (array_key_exists($keyWithDot, $settings)) { - $processedSettings[$key] = self::convertTypoScriptArrayToPlainArray($settings[$keyWithDot]); - $processedSettings[$key]['_typoScriptNodeValue'] = $value; - unset($settings[$keyWithDot]); - } else { - $processedSettings[$key] = $value; - } - } - } - return $processedSettings; + */ + public static function convertTypoScriptArrayToPlainArray(array $settings) { + return self::convertTypoScriptArrayToPlainArrayImplementation($settings); } /** Index: Tests/Utility/TypoScript_testcase.php =================================================================== --- Tests/Utility/TypoScript_testcase.php (revision 2406) +++ Tests/Utility/TypoScript_testcase.php (working copy) @@ -33,79 +33,210 @@ class Tx_Extbase_Utility_TypoScript_testcase extends tx_phpunit_testcase { /** - * @test + * @return array */ - public function convertTypoScriptArrayToPlainArrayRemovesTrailingDots() { - $typoScriptSettings = array( - '10' => 'TEXT', - '10.' => array( - 'value' => 'Hello World!', - 'foo.' => array( - 'bar' => 5, + public function convertTypoScriptArrayToPlainArrayTestdata(){ + $testdata = array(); + //convert TypoScript Array To Plain Array Removes Trailing Dots + $testdata[0] = array( + 'typoScriptSettings' => array( + '10.' => array( + 'value' => 'Hello World!', + 'foo.' => array( + 'bar' => 5, + ), ), + '10' => 'TEXT', // This line was moved down + ), + 'expectedSettings' => array( + '10' => array( + 'value' => 'Hello World!', + 'foo' => array( + 'bar' => 5, + ), + '_typoScriptNodeValue' => 'TEXT', ), - ); - $expectedSettings = array( - '10' => array( - 'value' => 'Hello World!', - 'foo' => array( - 'bar' => 5, + ) + ); + + //convert TypoScript Array To Plain Array Removes Trailing Dots With Changed Order In The TypoScript Array + $testdata[1] = array( + 'typoScriptSettings' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Hello World!', + 'foo.' => array( + 'bar' => 5, ), - '_typoScriptNodeValue' => 'TEXT', ), - ); - $processedSettings = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($typoScriptSettings); - - $this->assertEquals($expectedSettings, $processedSettings); - } - - /** - * @test - */ - public function convertTypoScriptArrayToPlainArrayRemovesTrailingDotsWithChangedOrderInTheTypoScriptArray() { - $typoScriptSettings = array( - '10.' => array( - 'value' => 'Hello World!', - 'foo.' => array( - 'bar' => 5, + ), + 'expectedSettings' => array( + '10' => array( + 'value' => 'Hello World!', + 'foo' => array( + 'bar' => 5, + ), + '_typoScriptNodeValue' => 'TEXT', + ), + ) + ); + + $testdata[2] = array( + 'typoScriptSettings' => array( + '10' => 'COA', + '10.' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Hello World!', + 'foo.' => array( + 'bar' => 5, + ) ), + '20' => 'COA', + '20.' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Test', + 'wrap' => '[|]' + ), + '20' => 'TEXT', + '20.' => array( + 'value' => 'Test', + 'wrap' => '[|]' + ) + ), + '30' => 'custom' ), - '10' => 'TEXT', // This line was moved down - ); - $expectedSettings = array( - '10' => array( - 'value' => 'Hello World!', - 'foo' => array( - 'bar' => 5, + ), + 'expectedSettings' => array( + '10' => array( + '10' => array( + 'value' => 'Hello World!', + 'foo' => array( + 'bar' => 5, + ), + '_typoScriptNodeValue' => 'TEXT' ), - '_typoScriptNodeValue' => 'TEXT', + '20' => array( + '10' => array( + 'value' => 'Test', + 'wrap' => '[|]', + '_typoScriptNodeValue' => 'TEXT', + ), + '20' => array( + 'value' => 'Test', + 'wrap' => '[|]', + '_typoScriptNodeValue' => 'TEXT', + ), + '_typoScriptNodeValue' => 'COA', + ), + '30' => 'custom', + '_typoScriptNodeValue' => 'COA', ), - ); + ) + ); + + return $testdata; + + } + + /** + * @test + * @dataProvider convertTypoScriptArrayToPlainArrayTestdata + */ + public function convertTypoScriptArrayToPlainArrayRemovesTrailingDotsWithChangedOrderInTheTypoScriptArray($typoScriptSettings,$expectedSettings) { $processedSettings = Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($typoScriptSettings); - $this->assertEquals($expectedSettings, $processedSettings); } + /** - * @test + * Dataprovider for testcase "convertPlainArrayToTypoScriptArray" + * + * @return array */ - public function convertPlainArrayToTypoScriptArrayAddsNodeValueAndTrailingDots() { - $extbaseTS = array( - '10' => array( - 'value' => 'Hallo', - '_typoScriptNodeValue' => 'TEXT' + public function convertPlainArrayToTypoScriptArrayTestdata() { + $testdata = array(); + + $testdata[0] = array( + 'extbaseTS' => array( + '10' => array( + 'value' => 'Hallo', + '_typoScriptNodeValue' => 'TEXT' + ) + ), + + 'classic' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Hallo' + ) ) ); - $classic = array( - '10' => 'TEXT', - '10.' => array( - 'value' => 'Hallo' + $testdata[1] = array( + 'extbaseTS' => array( + '10' => array( + '10' => array( + 'value' => 'Hello World!', + 'foo' => array( + 'bar' => 5, + ), + '_typoScriptNodeValue' => 'TEXT' + ), + '20' => array( + '10' => array( + 'value' => 'Test', + 'wrap' => '[|]', + '_typoScriptNodeValue' => 'TEXT', + ), + '20' => array( + 'value' => 'Test', + 'wrap' => '[|]', + '_typoScriptNodeValue' => 'TEXT', + ), + '_typoScriptNodeValue' => 'COA', + ), + '_typoScriptNodeValue' => 'COA', + ), + ), + + 'classic' => array( + '10' => 'COA', + '10.' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Hello World!', + 'foo.' => array( + 'bar' => 5, + ) + ), + '20' => 'COA', + '20.' => array( + '10' => 'TEXT', + '10.' => array( + 'value' => 'Test', + 'wrap' => '[|]' + ), + '20' => 'TEXT', + '20.' => array( + 'value' => 'Test', + 'wrap' => '[|]' + ) + ) + ) ) ); - + + return $testdata; + } + + /** + * @test + * @dataProvider convertPlainArrayToTypoScriptArrayTestdata + */ + public function convertPlainArrayToTypoScriptArray($extbaseTS, $classic) { $converted = Tx_Extbase_Utility_TypoScript::convertPlainArrayToTypoScriptArray($extbaseTS); - $this->assertEquals($converted, $classic); } }