From 84863ae40f623868801595a74fdadc45f0745569 Mon Sep 17 00:00:00 2001 From: Victor Welling Date: Wed, 3 Oct 2018 18:26:29 +0200 Subject: [PATCH] Fix for inherited variables Variables of child templates were overridden by their parents. This commit fixes that and adds test coverage. --- src/Twig/PatchingCompiler.php | 2 +- tests/Integration/Embedding/EmbeddingTest.php | 1 + tests/Integration/Embedding/Models/Base.php | 16 +++++++++-- .../Embedding/Presenters/BasePresenter.php | 27 +++++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 tests/Integration/Embedding/Presenters/BasePresenter.php diff --git a/src/Twig/PatchingCompiler.php b/src/Twig/PatchingCompiler.php index 242feac..7650287 100644 --- a/src/Twig/PatchingCompiler.php +++ b/src/Twig/PatchingCompiler.php @@ -49,6 +49,6 @@ private function patch($string) return !is_string($string) ? $string - : preg_replace($patterns, '$1array_merge($originalContext ?? [], $context)$2', $string); + : preg_replace($patterns, '$1array_merge($context, $originalContext ?? [])$2', $string); } } diff --git a/tests/Integration/Embedding/EmbeddingTest.php b/tests/Integration/Embedding/EmbeddingTest.php index 21da955..f585e93 100644 --- a/tests/Integration/Embedding/EmbeddingTest.php +++ b/tests/Integration/Embedding/EmbeddingTest.php @@ -47,6 +47,7 @@ public function testOverriddenBlocksShouldReceiveVariablesFromParent() { $output = $this->renderTemplate('page.twig'); + $this->assertContains('page_title', $output); $this->assertContains('

page_title

', $output); $this->assertContains('

page_content

', $output); } diff --git a/tests/Integration/Embedding/Models/Base.php b/tests/Integration/Embedding/Models/Base.php index c461774..ebfe468 100644 --- a/tests/Integration/Embedding/Models/Base.php +++ b/tests/Integration/Embedding/Models/Base.php @@ -3,10 +3,22 @@ namespace Shoot\Shoot\Tests\Integration\Embedding\Models; +use Shoot\Shoot\HasPresenterInterface; use Shoot\Shoot\PresentationModel; +use Shoot\Shoot\Tests\Integration\Embedding\Presenters\BasePresenter; -final class Base extends PresentationModel +final class Base extends PresentationModel implements HasPresenterInterface { /** @var string */ - protected $title = 'base_title'; + protected $title = ''; + + /** + * Returns the name by which to resolve the presenter through the DI container. + * + * @return string + */ + public function getPresenterName(): string + { + return BasePresenter::class; + } } diff --git a/tests/Integration/Embedding/Presenters/BasePresenter.php b/tests/Integration/Embedding/Presenters/BasePresenter.php new file mode 100644 index 0000000..7f53d73 --- /dev/null +++ b/tests/Integration/Embedding/Presenters/BasePresenter.php @@ -0,0 +1,27 @@ +withVariables([ + 'title' => 'base_title' + ]); + } +}