From 955611d5bbd989bb51376914ea5129c4faa49712 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 25 Sep 2024 22:07:53 +0200 Subject: [PATCH] Fix the possibility to override an aliased block (via use) --- CHANGELOG | 1 + src/Node/ModuleNode.php | 6 +++++- src/Template.php | 3 ++- .../use/use_aliased_block_overridden.test | 21 +++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/Fixtures/tags/use/use_aliased_block_overridden.test diff --git a/CHANGELOG b/CHANGELOG index bb7d956ac..708389656 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ # 3.15.0 (2024-XX-XX) + * Fix the possibility to override an aliased block (via use) * Add template cache hot reload * Allow Twig callable argument names to be free-form (snake-case or camelCase) independently of the PHP callable signature They were automatically converted to snake-cased before diff --git a/src/Node/ModuleNode.php b/src/Node/ModuleNode.php index d2fb216b1..f67c3b0e7 100644 --- a/src/Node/ModuleNode.php +++ b/src/Node/ModuleNode.php @@ -244,7 +244,11 @@ final class ModuleNode extends Node ->string($key) ->raw(\sprintf(']; unset($_trait_%s_blocks[', $i)) ->string($key) - ->raw("]);\n\n") + ->raw("]); \$this->traitAliases[") + ->subcompile($value) + ->raw("] = ") + ->string($key) + ->raw(";\n\n") ; } } diff --git a/src/Template.php b/src/Template.php index 7b3ce8161..cb042b595 100644 --- a/src/Template.php +++ b/src/Template.php @@ -37,6 +37,7 @@ abstract class Template protected $parents = []; protected $blocks = []; protected $traits = []; + protected $traitAliases = []; protected $extensions = []; protected $sandbox; @@ -477,7 +478,7 @@ abstract class Template public function yieldParentBlock($name, array $context, array $blocks = []): iterable { if (isset($this->traits[$name])) { - yield from $this->traits[$name][0]->yieldBlock($name, $context, $blocks, false); + yield from $this->traits[$name][0]->yieldBlock($this->traitAliases[$name] ?? $name, $context, $blocks, false); } elseif ($parent = $this->getParent($context)) { yield from $parent->unwrap()->yieldBlock($name, $context, $blocks, false); } else { diff --git a/tests/Fixtures/tags/use/use_aliased_block_overridden.test b/tests/Fixtures/tags/use/use_aliased_block_overridden.test new file mode 100644 index 000000000..8396c6f58 --- /dev/null +++ b/tests/Fixtures/tags/use/use_aliased_block_overridden.test @@ -0,0 +1,21 @@ +--TEST-- +"use" tag with an overridden block that is aliased +--TEMPLATE-- +{% use "blocks.twig" with bar as baz %} + +{% block foo %}{{ parent() }}+{% endblock %} + +{% block baz %}{{ parent() }}+{% endblock %} + +{{ block('foo') }} +{{ block('baz') }} +--TEMPLATE(blocks.twig)-- +{% block foo %}Foo{% endblock %} +{% block bar %}Bar{% endblock %} +--DATA-- +return [] +--EXPECT-- +Foo+ +Bar+ +Foo+ +Bar+