From 56e45145ec37e95d083e176e389bf2fcce0fcc15 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Wed, 27 Apr 2016 12:51:40 +0200 Subject: [PATCH] Latte: support for single block rendering [Closes #101] --- src/Latte/Engine.php | 8 ++++---- src/Latte/Macros/BlockMacros.php | 2 +- src/Latte/Macros/BlockMacrosRuntime.php | 9 +++++++-- tests/Latte/Engine.renderBlock.phpt | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 tests/Latte/Engine.renderBlock.phpt diff --git a/src/Latte/Engine.php b/src/Latte/Engine.php index cc907b5375..374a025793 100644 --- a/src/Latte/Engine.php +++ b/src/Latte/Engine.php @@ -64,10 +64,10 @@ public function __construct() * Renders template to output. * @return void */ - public function render($name, array $params = []) + public function render($name, array $params = [], $block = NULL) { $this->createTemplate($name) - ->setParameters($params) + ->setParameters($params + ['_block' => $block]) ->render(); } @@ -76,11 +76,11 @@ public function render($name, array $params = []) * Renders template to string. * @return string */ - public function renderToString($name, array $params = []) + public function renderToString($name, array $params = [], $block = NULL) { ob_start(function () {}); try { - $this->render($name, $params); + $this->render($name, $params, $block); } catch (\Throwable $e) { ob_end_clean(); throw $e; diff --git a/src/Latte/Macros/BlockMacros.php b/src/Latte/Macros/BlockMacros.php index 5297009731..31b20e61d5 100644 --- a/src/Latte/Macros/BlockMacros.php +++ b/src/Latte/Macros/BlockMacros.php @@ -88,7 +88,7 @@ public function finalize() } $compiler->addProperty('blocks', array_merge_recursive($functions, $this->blockTypes)); - $prolog = 'Latte\Macros\BlockMacrosRuntime::initialize($this, $_b)'; + $prolog = 'if (Latte\Macros\BlockMacrosRuntime::initialize($this, $_b)) return;'; if (!$this->namedBlocks) { $epilog = 'if (Latte\Macros\BlockMacrosRuntime::progress($this, get_defined_vars())) return;'; } diff --git a/src/Latte/Macros/BlockMacrosRuntime.php b/src/Latte/Macros/BlockMacrosRuntime.php index c2ea3694a9..d79be98d2a 100644 --- a/src/Latte/Macros/BlockMacrosRuntime.php +++ b/src/Latte/Macros/BlockMacrosRuntime.php @@ -20,7 +20,7 @@ class BlockMacrosRuntime /** - * @return void + * @return bool */ public static function initialize(Latte\Template $template, \stdClass $blocks) { @@ -29,8 +29,13 @@ public static function initialize(Latte\Template $template, \stdClass $blocks) self::checkType($info[1], $blocks->types, $name); } - if ($template->params['_l']->extends = $template->getExtends()) { + $params = $template->params; + if ($params['_l']->extends = $template->getExtends()) { ob_start(function () {}); + + } elseif (!empty($params['_block']) && empty($params['_g']->includingBlock)) { + self::callBlock($blocks, $params['_block'], $params); + return TRUE; } } diff --git a/tests/Latte/Engine.renderBlock.phpt b/tests/Latte/Engine.renderBlock.phpt new file mode 100644 index 0000000000..35f3281a31 --- /dev/null +++ b/tests/Latte/Engine.renderBlock.phpt @@ -0,0 +1,19 @@ +renderToString(__DIR__ . '/templates/defineblock.latte', ['var' => 5], 'test')) +); + +Assert::match( + 'Homepage | My websiteMy website', + $latte->renderToString(__DIR__ . '/templates/inheritance.child1.latte', [], 'title') +);