diff --git a/src/Bridges/ApplicationLatte/UIMacros.php b/src/Bridges/ApplicationLatte/UIMacros.php index b5d63c8d7..8b32d43fe 100644 --- a/src/Bridges/ApplicationLatte/UIMacros.php +++ b/src/Bridges/ApplicationLatte/UIMacros.php @@ -24,6 +24,9 @@ */ class UIMacros extends Latte\Macros\MacroSet { + /** @var bool */ + private $extends; + public static function install(Latte\Compiler $compiler) { @@ -47,10 +50,7 @@ public static function install(Latte\Compiler $compiler) */ public function initialize() { - $this->getCompiler()->addMethod('getParentName', ' - return $this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter - ? $this->params["_control"]->findLayoutTemplateFile() : NULL; - '); + $this->extends = FALSE; } @@ -60,7 +60,12 @@ public function initialize() */ public function finalize() { - return ['if (Nette\Bridges\ApplicationLatte\UIRuntime::initialize($this, $this->blockQueue)) return; $template = $this->params["template"];', '']; + return [ + 'if (Nette\Bridges\ApplicationLatte\UIRuntime::initialize($this, $this->blockQueue)) return; $template = $this->params["template"];', + '', + $this->extends ? '' : '$this->parentName = $this->parentName ?: ($this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter + ? $this->params["_control"]->findLayoutTemplateFile() : NULL);', + ]; } @@ -123,10 +128,11 @@ public function macroIfCurrent(MacroNode $node, PhpWriter $writer) */ public function macroExtends(MacroNode $node, PhpWriter $writer) { + $this->extends = TRUE; if ($node->modifiers || $node->parentNode || $node->args !== 'auto') { return FALSE; } - $this->getCompiler()->addMethod('getParentName', 'return $this->params["_presenter"]->findLayoutTemplateFile();'); + return $writer->write('$this->parentName = $this->params["_presenter"]->findLayoutTemplateFile();'); } diff --git a/tests/Bridges.Latte/Template.getParentName().phpt b/tests/Bridges.Latte/Template.getParentName().phpt index 667bdde44..eef3b8120 100644 --- a/tests/Bridges.Latte/Template.getParentName().phpt +++ b/tests/Bridges.Latte/Template.getParentName().phpt @@ -24,46 +24,54 @@ $template = $latte->createTemplate( '', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::null($template->getParentName()); $template = $latte->createTemplate( '{block}...{/block}', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::null($template->getParentName()); $template = $latte->createTemplate( '{block name}...{/block}', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::same('layout.latte', $template->getParentName()); $template = $latte->createTemplate( '{extends "file.latte"} {block name}...{/block}', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::same('file.latte', $template->getParentName()); $template = $latte->createTemplate( '{extends "file.latte"}', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::same('file.latte', $template->getParentName()); $template = $latte->createTemplate( '{extends $file} {block name}...{/block}', ['_control' => new MockPresenter, 'file' => 'file.latte'] ); +$template->prepare(); Assert::same('file.latte', $template->getParentName()); $template = $latte->createTemplate( '{extends none}', ['_control' => new MockPresenter] ); +$template->prepare(); Assert::null($template->getParentName()); $template = $latte->createTemplate( '{extends auto}', ['_presenter' => new MockPresenter] ); +$template->prepare(); Assert::same('layout.latte', $template->getParentName()); diff --git a/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.alt.phtml b/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.alt.phtml index 3c2a7cdd5..76facc47f 100644 --- a/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.alt.phtml +++ b/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.alt.phtml @@ -29,9 +29,12 @@ class Template%a% extends Latte\Template } - function getParentName() + function prepare() { - %A% + extract($this->params); + $this->parentName = $this->parentName ?: ($this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter + ? $this->params["_control"]->findLayoutTemplateFile() : NULL); + return get_defined_vars(); } diff --git a/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.phtml b/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.phtml index 8840d9d62..bc01a38ef 100644 --- a/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.phtml +++ b/tests/Bridges.Latte/expected/UIMacros.dynamicsnippets.phtml @@ -25,9 +25,12 @@ class Template%a% extends Latte\Template } - function getParentName() + function prepare() { - %A% + extract($this->params); + $this->parentName = $this->parentName ?: ($this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter + ? $this->params["_control"]->findLayoutTemplateFile() : NULL); + return get_defined_vars(); } diff --git a/tests/Bridges.Latte/expected/UIMacros.snippet.alt.phtml b/tests/Bridges.Latte/expected/UIMacros.snippet.alt.phtml index 529377743..d5b59c2d4 100644 --- a/tests/Bridges.Latte/expected/UIMacros.snippet.alt.phtml +++ b/tests/Bridges.Latte/expected/UIMacros.snippet.alt.phtml @@ -41,9 +41,12 @@ class Template%a% extends Latte\Template } - function getParentName() + function prepare() { - %A% + extract($this->params); + $this->parentName = $this->parentName ?: ($this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter + ? $this->params["_control"]->findLayoutTemplateFile() : NULL); + return get_defined_vars(); } diff --git a/tests/Bridges.Latte/expected/UIMacros.snippet.phtml b/tests/Bridges.Latte/expected/UIMacros.snippet.phtml index 1dd4be482..9487aa272 100644 --- a/tests/Bridges.Latte/expected/UIMacros.snippet.phtml +++ b/tests/Bridges.Latte/expected/UIMacros.snippet.phtml @@ -47,9 +47,12 @@ class Template%a% extends Latte\Template } - function getParentName() + function prepare() { - %A% + extract($this->params); + $this->parentName = $this->parentName ?: ($this->blocks && !$this->getReferringTemplate() && $this->params["_control"] instanceof Nette\Application\UI\Presenter + ? $this->params["_control"]->findLayoutTemplateFile() : NULL); + return get_defined_vars(); }