diff options
Diffstat (limited to 'core/View/RenderTokenParser.php')
-rw-r--r-- | core/View/RenderTokenParser.php | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/core/View/RenderTokenParser.php b/core/View/RenderTokenParser.php new file mode 100644 index 0000000000..14f1eb6806 --- /dev/null +++ b/core/View/RenderTokenParser.php @@ -0,0 +1,82 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\View; + +use Twig_Token; +use Twig_TokenParser; +use Twig_Node_Expression_MethodCall; +use Twig_Node_Expression_Array; +use Twig_Node_Include; +use Exception; + +/** + * Defines a new Twig tag that will render a Piwik View. + * + * Use the tag like this: + * + * {% render theView %} + * + * where `theView` is a variable referencing a View instance. + */ +class RenderTokenParser extends Twig_TokenParser +{ + /** + * Parses the Twig stream and creates a Twig_Node_Include instance that includes + * the View's template. + * + * @return Twig_Node_Include + */ + public function parse(Twig_Token $token) + { + $parser = $this->parser; + $stream = $parser->getStream(); + + $view = $parser->getExpressionParser()->parseExpression(); + + $variablesOverride = null; + if ($stream->nextIf(Twig_Token::NAME_TYPE, 'with')) { + $variablesOverride = $this->parser->getExpressionParser()->parseExpression(); + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $viewTemplateExpr = new Twig_Node_Expression_MethodCall( + $view, + 'getTemplateFile', + new Twig_Node_Expression_Array(array(), $token->getLine()), + $token->getLine() + ); + + $variablesOverrideExpr = $variablesOverride === null ? array() : array($variablesOverride); + $variablesExpr = new Twig_Node_Expression_MethodCall( + $view, + 'getTemplateVars', + new Twig_Node_Expression_Array($variablesOverrideExpr, $token->getLine()), + $token->getLine() + ); + + return new Twig_Node_Include( + $viewTemplateExpr, + $variablesExpr, + $only = false, + $ignoreMissing = false, + $token->getLine() + ); + } + + /** + * Returns the tag identifier. + * + * @return string + */ + public function getTag() + { + return 'render'; + } +}
\ No newline at end of file |