diff --git a/core/SSViewer.php b/core/SSViewer.php index 371f1fc65..6ceb00688 100755 --- a/core/SSViewer.php +++ b/core/SSViewer.php @@ -507,17 +507,17 @@ class SSViewer { $content = ereg_replace('<!-- +pc_end +-->', '<' . '% end_control %' . '>', $content); // < % control Foo % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", null, false)) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1")) foreach($loop as $key => $item) { ?>', $content); // < % control Foo.Bar % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+) +%' . '>', '<? array_push($itemStack, $item); if(($loop = $item->obj("\\1", null, false)) && ($loop = $loop->obj("\\2"))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+) +%' . '>', '<? array_push($itemStack, $item); if(($loop = $item->obj("\\1")) && ($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_]+)\\(([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if(($loop = $item->obj("\\1", null, false)) && ($loop = $loop->obj("\\2", array("\\3")))) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\.([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if(($loop = $item->obj("\\1")) && ($loop = $loop->obj("\\2", array("\\3")))) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2"), false)) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2"))) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar, Baz) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2","\\3"), false)) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2","\\3"))) foreach($loop as $key => $item) { ?>', $content); // < % control Foo(Bar, Baz, Buz) % > - $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+), *([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2", "\\3", "\\4"), false)) foreach($loop as $key => $item) { ?>', $content); + $content = ereg_replace('<' . '% +control +([A-Za-z0-9_]+)\\(([^),]+), *([^),]+), *([^),]+)\\) +%' . '>', '<? array_push($itemStack, $item); if($loop = $item->obj("\\1", array("\\2", "\\3", "\\4"))) foreach($loop as $key => $item) { ?>', $content); $content = ereg_replace('<' . '% +end_control +%' . '>', '<? } $item = array_pop($itemStack); ?>', $content); $content = ereg_replace('<' . '% +debug +%' . '>', '<? Debug::show($item) ?>', $content); $content = ereg_replace('<' . '% +debug +([A-Za-z0-9_]+) +%' . '>', '<? Debug::show($item->cachedCall("\\1")) ?>', $content); diff --git a/dev/CSSContentParser.php b/dev/CSSContentParser.php index 78ff67f0a..6bfe05a68 100644 --- a/dev/CSSContentParser.php +++ b/dev/CSSContentParser.php @@ -46,7 +46,10 @@ class CSSContentParser extends Object { $tidy = $content; } - $this->simpleXML = simplexml_load_string($tidy, 'SimpleXMLElement', LIBXML_NOWARNING); + $this->simpleXML = @simplexml_load_string($tidy, 'SimpleXMLElement', LIBXML_NOWARNING); + if(!$this->simpleXML) { + throw new Exception('CSSContentParser::__construct(): Could not parse content. Please check the PHP extension tidy is installed.'); + } parent::__construct(); } diff --git a/tests/SSViewerTest.php b/tests/SSViewerTest.php index 3f1e1db7b..ba3c33851 100644 --- a/tests/SSViewerTest.php +++ b/tests/SSViewerTest.php @@ -2,67 +2,6 @@ class SSViewerTest extends SapphireTest { - function testControlBlockDataObjectSet() { - $viewer = SSViewer::fromString(<<<SS - <% control TestSet %> - 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(<<<SS - <% control NullValue %> - 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(<<<SS - <% control FalseValue %> - 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(<<<SS - <% control methodNull %> - 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 @@ -455,8 +394,4 @@ class SSViewerTest_ViewableData extends ViewableData implements TestOnly { function methodWithTwoArguments($arg1, $arg2) { return "arg1:{$arg1},arg2:{$arg2}"; } - - function methodNull() { - return null; - } }