From 6c6315263e9f7041f78ce0c169ed33b0859d6b04 Mon Sep 17 00:00:00 2001 From: Gildas de Cadoudal Date: Thu, 18 Apr 2024 11:47:39 +0200 Subject: [PATCH] fix: #4033 add missing unwrap call when a TemplateWrapper instance can be present --- src/Node/ModuleNode.php | 4 ++-- src/Template.php | 2 +- .../regression/4033-missing-unwrap.test | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 tests/Fixtures/regression/4033-missing-unwrap.test diff --git a/src/Node/ModuleNode.php b/src/Node/ModuleNode.php index df407caf0..df5d78d03 100644 --- a/src/Node/ModuleNode.php +++ b/src/Node/ModuleNode.php @@ -198,7 +198,7 @@ final class ModuleNode extends Node ->raw(', ') ->repr($node->getTemplateLine()) ->raw(");\n") - ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i)) + ->write(sprintf("if (!\$_trait_%s->unwrap()->isTraitable()) {\n", $i)) ->indent() ->write("throw new RuntimeError('Template \"'.") ->subcompile($trait->getNode('template')) @@ -207,7 +207,7 @@ final class ModuleNode extends Node ->raw(", \$this->source);\n") ->outdent() ->write("}\n") - ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i)) + ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->unwrap()->getBlocks();\n\n", $i, $i)) ; foreach ($trait->getNode('targets') as $key => $value) { diff --git a/src/Template.php b/src/Template.php index f200a610f..e08837737 100644 --- a/src/Template.php +++ b/src/Template.php @@ -464,7 +464,7 @@ abstract class Template } } } elseif ($parent = $this->getParent($context)) { - yield from $parent->yieldBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this); + yield from $parent->unwrap()->yieldBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this); } elseif (isset($blocks[$name])) { throw new RuntimeError(sprintf('Block "%s" should not call parent() in "%s" as the block does not exist in the parent template "%s".', $name, $blocks[$name][0]->getTemplateName(), $this->getTemplateName()), -1, $blocks[$name][0]->getSourceContext()); } else { diff --git a/tests/Fixtures/regression/4033-missing-unwrap.test b/tests/Fixtures/regression/4033-missing-unwrap.test new file mode 100644 index 000000000..37778731c --- /dev/null +++ b/tests/Fixtures/regression/4033-missing-unwrap.test @@ -0,0 +1,19 @@ +--TEST-- +Call to undefined method Twig\\TemplateWrapper::yieldBlock() +--TEMPLATE-- +{% extends 'parent' %} +{%- block content -%} + {{ parent() }} + child +{%- endblock -%} +--TEMPLATE(parent)-- +{% extends ['unknowngrandparent', 'grandparent'] %} +--TEMPLATE(grandparent)-- +{%- block content -%} + grandparent +{%- endblock -%} +--DATA-- +return [] +--EXPECT-- + grandparent + child \ No newline at end of file