diff --git a/core/SSViewer.php b/core/SSViewer.php index ffd49dc3f..bfa01f49d 100755 --- a/core/SSViewer.php +++ b/core/SSViewer.php @@ -507,17 +507,17 @@ class SSViewer { $content = ereg_replace('', '<' . '% end_control %' . '>', $content); // < % control Foo % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+) +%' . '>', 'obj("\\1")) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+) +%' . '>', 'obj("\\1", null, false)) foreach($loop as $key => $item) { ?>', $content); // < % control Foo.Bar % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+) +%' . '>', 'obj("\\1")) && ($loop = $loop->obj("\\2"))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+) +%' . '>', 'obj("\\1", null, false)) && ($loop = $loop->obj("\\2"))) foreach($loop as $key => $item) { ?>', $content); // < % control Foo.Bar(Baz) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', 'obj("\\1")) && ($loop = $loop->obj("\\2", array("\\3")))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', 'obj("\\1", null, false)) && ($loop = $loop->obj("\\2", array("\\3")))) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2"))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2"), false)) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar, Baz) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2","\\3"))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2","\\3"), false)) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar, Baz, Buz) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+), *([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2", "\\3", "\\4"))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+), *([^),]+)\\) +%' . '>', 'obj("\\1", array("\\2", "\\3", "\\4"), false)) foreach($loop as $key => $item) { ?>', $content); $content = ereg_replace('<' . '% +end_control +%' . '>', '', $content); $content = ereg_replace('<' . '% +debug +%' . '>', '', $content); $content = ereg_replace('<' . '% +debug +([A-Za-z0-9_]+) +%' . '>', 'cachedCall("\\1")) ?>', $content); diff --git a/tests/SSViewerTest.php b/tests/SSViewerTest.php index e4c4a1dd2..d651dbe89 100644 --- a/tests/SSViewerTest.php +++ b/tests/SSViewerTest.php @@ -2,6 +2,67 @@ class SSViewerTest extends SapphireTest { + function testControlBlockDataObjectSet() { + $viewer = SSViewer::fromString(<< + Test: \$TestValue + <% end_control %> +SS +); + $data = new ArrayData(array( + 'TestSet' => new DataObjectSet(array( + new ArrayData(array( + 'TestValue' => '1' + )), + new ArrayData(array( + 'TestValue' => '2' + )), + )) + )); + $out = $viewer->process($data); + $this->assertEquals('Test:1Test:2', str_replace(array(' ', "\t", PHP_EOL), '', $out)); + } + + function testControlBlockNullValueDoesntLoop() { + $viewer = SSViewer::fromString(<< + notdisplayed + <% end_control %> +SS +); + $data = new ArrayData(array( + 'NullValue' => null + )); + $out = $viewer->process($data); + $this->assertNotContains('notdisplayed', str_replace(array(' ', "\t", PHP_EOL), '', $out)); + } + + function testControlBlockFalseValueDoesntLoop() { + $viewer = SSViewer::fromString(<< + notdisplayed + <% end_control %> +SS +); + $data = new ArrayData(array( + 'FalseValue' => null + )); + $out = $viewer->process($data); + $this->assertNotContains('notdisplayed', str_replace(array(' ', "\t", PHP_EOL), '', $out)); + } + + function testControlBlockMethodReturningNullDoesntLoop() { + $viewer = SSViewer::fromString(<< + notdisplayed + <% end_control %> +SS +); + $data = new SSViewerTest_ViewableData(); + $out = $viewer->process($data); + $this->assertNotContains('notdisplayed', str_replace(array(' ', "\t", PHP_EOL), '', $out)); + } + /** * Tests for {@link SSViewer::current_theme()} for different behaviour * of user defined themes via {@link SiteConfig} and default theme @@ -385,7 +446,7 @@ class SSViewerTestFixture extends ViewableData { return (bool)$this->XML_val($fieldName, $arguments); } } -/* + class SSViewerTest_ViewableData extends ViewableData implements TestOnly { function methodWithOneArgument($arg1) { return "arg1:{$arg1}"; @@ -394,5 +455,8 @@ class SSViewerTest_ViewableData extends ViewableData implements TestOnly { function methodWithTwoArguments($arg1, $arg2) { return "arg1:{$arg1},arg2:{$arg2}"; } + + function methodNull() { + return null; + } } -*/ \ No newline at end of file