From 98c10b089c0c3a9315f075dc44ab46bbe361369a Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 29 Aug 2017 16:15:46 +1200 Subject: [PATCH] ENHANCEMENT Allow <% include %> to fallback outside of the Includes folder Fixes #7108 --- src/View/SSTemplateParser.peg | 2 +- src/View/SSTemplateParser.php | 2 +- tests/php/View/SSViewerTest.php | 31 +++++++++++++++++++ .../templates/Namespace/IncludedOnceBase.ss | 1 + .../templates/Namespace/IncludedTwice.ss | 1 + .../Namespace/Includes/IncludedOnceSub.ss | 1 + .../Namespace/Includes/IncludedTwice.ss | 1 + 7 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/php/View/SSViewerTest/templates/Namespace/IncludedOnceBase.ss create mode 100644 tests/php/View/SSViewerTest/templates/Namespace/IncludedTwice.ss create mode 100644 tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedOnceSub.ss create mode 100644 tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedTwice.ss diff --git a/src/View/SSTemplateParser.peg b/src/View/SSTemplateParser.peg index 22294b7cd..a0723aa39 100644 --- a/src/View/SSTemplateParser.peg +++ b/src/View/SSTemplateParser.peg @@ -891,7 +891,7 @@ class SSTemplateParser extends Parser implements TemplateParser $template = $res['template']; $arguments = $res['arguments']; - $res['php'] = '$val .= \\SilverStripe\\View\\SSViewer::execute_template(["type" => "Includes", '.$template.'], $scope->getItem(), array(' . + $res['php'] = '$val .= \\SilverStripe\\View\\SSViewer::execute_template([["type" => "Includes", '.$template.'], '.$template.'], $scope->getItem(), array(' . implode(',', $arguments)."), \$scope);\n"; if ($this->includeDebuggingComments) { // Add include filename comments on dev sites diff --git a/src/View/SSTemplateParser.php b/src/View/SSTemplateParser.php index 9859aedbe..9b37500fc 100644 --- a/src/View/SSTemplateParser.php +++ b/src/View/SSTemplateParser.php @@ -3499,7 +3499,7 @@ class SSTemplateParser extends Parser implements TemplateParser $template = $res['template']; $arguments = $res['arguments']; - $res['php'] = '$val .= \\SilverStripe\\View\\SSViewer::execute_template(["type" => "Includes", '.$template.'], $scope->getItem(), array(' . + $res['php'] = '$val .= \\SilverStripe\\View\\SSViewer::execute_template([["type" => "Includes", '.$template.'], '.$template.'], $scope->getItem(), array(' . implode(',', $arguments)."), \$scope);\n"; if ($this->includeDebuggingComments) { // Add include filename comments on dev sites diff --git a/tests/php/View/SSViewerTest.php b/tests/php/View/SSViewerTest.php index 196a5584d..de6a2fa3e 100644 --- a/tests/php/View/SSViewerTest.php +++ b/tests/php/View/SSViewerTest.php @@ -1055,6 +1055,12 @@ after' 'Backslashes work for namespace references in includes' ); + $this->assertEquals( + "tests:( NamespaceInclude\n )", + $this->render('tests:( <% include Namespace\\NamespaceInclude %> )', $data), + 'Escaped backslashes work for namespace references in includes' + ); + $this->assertEquals( "tests:( NamespaceInclude\n )", $this->render('tests:( <% include Namespace/NamespaceInclude %> )', $data), @@ -1062,6 +1068,31 @@ after' ); } + /** + * Test search for includes fallback to non-includes folder + */ + public function testIncludeFallbacks() + { + $data = new ArrayData([]); + + $this->assertEquals( + "tests:( Namespace/Includes/IncludedTwice.ss\n )", + $this->render('tests:( <% include Namespace\\IncludedTwice %> )', $data), + 'Prefer Includes in the Includes folder' + ); + + $this->assertEquals( + "tests:( Namespace/Includes/IncludedOnceSub.ss\n )", + $this->render('tests:( <% include Namespace\\IncludedOnceSub %> )', $data), + 'Includes in only Includes folder can be found' + ); + + $this->assertEquals( + "tests:( Namespace/IncludedOnceBase.ss\n )", + $this->render('tests:( <% include Namespace\\IncludedOnceBase %> )', $data), + 'Includes outside of Includes folder can be found' + ); + } public function testRecursiveInclude() { diff --git a/tests/php/View/SSViewerTest/templates/Namespace/IncludedOnceBase.ss b/tests/php/View/SSViewerTest/templates/Namespace/IncludedOnceBase.ss new file mode 100644 index 000000000..75700a0d6 --- /dev/null +++ b/tests/php/View/SSViewerTest/templates/Namespace/IncludedOnceBase.ss @@ -0,0 +1 @@ +Namespace/IncludedOnceBase.ss diff --git a/tests/php/View/SSViewerTest/templates/Namespace/IncludedTwice.ss b/tests/php/View/SSViewerTest/templates/Namespace/IncludedTwice.ss new file mode 100644 index 000000000..ef0b569e0 --- /dev/null +++ b/tests/php/View/SSViewerTest/templates/Namespace/IncludedTwice.ss @@ -0,0 +1 @@ +Namespace/IncludedTwice.ss diff --git a/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedOnceSub.ss b/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedOnceSub.ss new file mode 100644 index 000000000..b3f7fb5b8 --- /dev/null +++ b/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedOnceSub.ss @@ -0,0 +1 @@ +Namespace/Includes/IncludedOnceSub.ss diff --git a/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedTwice.ss b/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedTwice.ss new file mode 100644 index 000000000..aa0e4c2ba --- /dev/null +++ b/tests/php/View/SSViewerTest/templates/Namespace/Includes/IncludedTwice.ss @@ -0,0 +1 @@ +Namespace/Includes/IncludedTwice.ss