Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature #2236 Expose a way to access template data and methods in a p…
…ortable way (fabpot) This PR was merged into the 1.x branch. Discussion ---------- Expose a way to access template data and methods in a portable way `Twig_Template` is an internal class, and most of its methods are marked as being `@internal` as they are not "safe" to use by end users. But some of its features are interesting like `renderBlock()` which is very useful when rendering emails for instance (see #1873). This PR tries to address both issues by marking the whole `Twig_Template` class as being internal and by exposing a new way to safely interact with a template besides the obvious `render()`/`display()` methods via `$twig->load("...")`. If also add some convenient methods like `hasBlock()` or `getBlocks()` (see ~#1831~ and #1882): ```php $template = $twig->load('index'); echo $template->render($context); $template->display($context); if ($template->hasBlock('name') { $template->displayBlock('name', $context); } foreach ($template->getBlocks() as $block) { echo $template->render($block, $context); } ``` Commits ------- d7062f3 exposed a way to access template data and methods in a portable way
- Loading branch information
Showing
10 changed files
with
273 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of Twig. | ||
* | ||
* (c) 2016 Fabien Potencier | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
/** | ||
* Exposes a template to userland. | ||
* | ||
* @author Fabien Potencier <fabien@symfony.com> | ||
*/ | ||
final class Twig_TemplateWrapper | ||
{ | ||
private $env; | ||
private $template; | ||
|
||
/** | ||
* This method is for internal use only and should never be called | ||
* directly (use Twig_Environment::load() instead). | ||
* | ||
* @internal | ||
*/ | ||
public function __construct(Twig_Environment $env, Twig_Template $template) | ||
{ | ||
$this->env = $env; | ||
$this->template = $template; | ||
} | ||
|
||
/** | ||
* Renders the template. | ||
* | ||
* @param array $context An array of parameters to pass to the template | ||
* | ||
* @return string The rendered template | ||
*/ | ||
public function render($context = array()) | ||
{ | ||
return $this->template->render($context); | ||
} | ||
|
||
/** | ||
* Displays the template. | ||
* | ||
* @param array $context An array of parameters to pass to the template | ||
*/ | ||
public function display($context = array()) | ||
{ | ||
return $this->template->display($context); | ||
} | ||
|
||
/** | ||
* Checks if a block is defined. | ||
* | ||
* @param string $name The block name | ||
* @param array $context An array of parameters to pass to the template | ||
* | ||
* @return bool | ||
*/ | ||
public function hasBlock($name, $context = array()) | ||
{ | ||
return $this->template->hasBlock($name, $context); | ||
} | ||
|
||
/** | ||
* Returns defined block names in the template. | ||
* | ||
* @param array $context An array of parameters to pass to the template | ||
* | ||
* @return string[] An array of defined template block names | ||
*/ | ||
public function getBlockNames($context = array()) | ||
{ | ||
return $this->template->getBlockNames($context); | ||
} | ||
|
||
/** | ||
* Renders a template block. | ||
* | ||
* @param string $name The block name to render | ||
* @param array $context An array of parameters to pass to the template | ||
* | ||
* @return string The rendered block | ||
*/ | ||
public function renderBlock($name, $context = array()) | ||
{ | ||
ob_start(); | ||
$this->displayBlock($name, $context); | ||
|
||
return ob_get_clean(); | ||
} | ||
|
||
/** | ||
* Displays a template block. | ||
* | ||
* @param string $name The block name to render | ||
* @param array $context An array of parameters to pass to the template | ||
*/ | ||
public function displayBlock($name, $context = array()) | ||
{ | ||
$context = $this->env->mergeGlobals($context); | ||
$level = ob_get_level(); | ||
ob_start(); | ||
try { | ||
$this->template->displayBlock($name, $context); | ||
} catch (Exception $e) { | ||
while (ob_get_level() > $level) { | ||
ob_end_clean(); | ||
} | ||
|
||
throw $e; | ||
} catch (Throwable $e) { | ||
while (ob_get_level() > $level) { | ||
ob_end_clean(); | ||
} | ||
|
||
throw $e; | ||
} | ||
|
||
return ob_get_clean(); | ||
} | ||
|
||
/** | ||
* @return Twig_Source | ||
*/ | ||
public function getSourceContext() | ||
{ | ||
return $this->template->getSourceContext(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.