From f0c58854a8472f764bff3802ac2647355783c5b7 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 22 Apr 2019 10:13:23 +0200 Subject: [PATCH] fixed import macros from a template string --- CHANGELOG | 1 + src/Node/ImportNode.php | 2 +- src/Template.php | 13 +++++++++++++ src/TemplateWrapper.php | 10 ++++++++++ .../tags/macro/import_from_string_template.test | 10 ++++++++++ test/Twig/Tests/Node/ImportTest.php | 2 +- test/Twig/Tests/Node/ModuleTest.php | 2 +- 7 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test diff --git a/CHANGELOG b/CHANGELOG index dc177a7a0..2ef8dd68d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ * 1.39.2 (2019-XX-XX) * fixed Lexer when using custom options containing the # char + * fixed "import" when macros are stored in a template string * 1.39.1 (2019-04-16) diff --git a/src/Node/ImportNode.php b/src/Node/ImportNode.php index 309bd1ac7..236db8900 100644 --- a/src/Node/ImportNode.php +++ b/src/Node/ImportNode.php @@ -46,7 +46,7 @@ class ImportNode extends Node ->repr($this->getTemplateName()) ->raw(', ') ->repr($this->getTemplateLine()) - ->raw(')') + ->raw(')->unwrap()') ; } diff --git a/src/Template.php b/src/Template.php index e2146c280..060730f2c 100644 --- a/src/Template.php +++ b/src/Template.php @@ -343,6 +343,9 @@ abstract class Template implements \Twig_TemplateInterface return array_unique($names); } + /** + * @return Template|TemplateWrapper + */ protected function loadTemplate($template, $templateName = null, $line = null, $index = null) { try { @@ -383,6 +386,16 @@ abstract class Template implements \Twig_TemplateInterface } } + /** + * @internal + * + * @return Template + */ + protected function unwrap() + { + return $this; + } + /** * Returns all blocks. * diff --git a/src/TemplateWrapper.php b/src/TemplateWrapper.php index 5ddee9229..a1dd0f2d0 100644 --- a/src/TemplateWrapper.php +++ b/src/TemplateWrapper.php @@ -142,6 +142,16 @@ final class TemplateWrapper { return $this->template->getTemplateName(); } + + /** + * @internal + * + * @return Template + */ + public function unwrap() + { + return $this->template; + } } class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper'); diff --git a/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test b/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test new file mode 100644 index 000000000..6c1817be7 --- /dev/null +++ b/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test @@ -0,0 +1,10 @@ +--TEST-- +"import" tag with a template as string +--TEMPLATE-- +{% import template_from_string("{% macro test() %}ok{% endmacro %}") as m %} +{{ m.test() }} +--TEMPLATE(forms.twig)-- +--DATA-- +return [] +--EXPECT-- +ok diff --git a/test/Twig/Tests/Node/ImportTest.php b/test/Twig/Tests/Node/ImportTest.php index 56e56e688..2118bff59 100644 --- a/test/Twig/Tests/Node/ImportTest.php +++ b/test/Twig/Tests/Node/ImportTest.php @@ -36,7 +36,7 @@ class Twig_Tests_Node_ImportTest extends NodeTestCase $tests[] = [$node, <<loadTemplate("foo.twig", null, 1); +\$context["macro"] = \$this->loadTemplate("foo.twig", null, 1)->unwrap(); EOF ]; diff --git a/test/Twig/Tests/Node/ModuleTest.php b/test/Twig/Tests/Node/ModuleTest.php index 213350a2c..1eb337fd0 100644 --- a/test/Twig/Tests/Node/ModuleTest.php +++ b/test/Twig/Tests/Node/ModuleTest.php @@ -153,7 +153,7 @@ class __TwigTemplate_%x extends \Twig\Template protected function doDisplay(array \$context, array \$blocks = []) { // line 2 - \$context["macro"] = \$this->loadTemplate("foo.twig", "foo.twig", 2); + \$context["macro"] = \$this->loadTemplate("foo.twig", "foo.twig", 2)->unwrap(); // line 1 \$this->parent = \$this->loadTemplate("layout.twig", "foo.twig", 1); \$this->parent->display(\$context, array_merge(\$this->blocks, \$blocks));