Explorar el Código

[TwigBundle] removed usage of HelperTokenParser for the 'render' tag

Fabien Potencier hace 14 años
padre
commit
840bd8aacd

+ 2 - 1
src/Symfony/Bundle/TwigBundle/Extension/TemplatingExtension.php

@@ -7,6 +7,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Bundle\TwigBundle\TokenParser\IncludeTokenParser;
 use Symfony\Bundle\TwigBundle\TokenParser\UrlTokenParser;
 use Symfony\Bundle\TwigBundle\TokenParser\PathTokenParser;
+use Symfony\Bundle\TwigBundle\TokenParser\RenderTokenParser;
 use Symfony\Component\Yaml\Dumper as YamlDumper;
 
 /*
@@ -109,7 +110,7 @@ class TemplatingExtension extends \Twig_Extension
             new HelperTokenParser('stylesheets', '', 'templating.helper.stylesheets', 'render'),
 
             // {% render 'BlogBundle:Post:list' with { 'limit': 2 }, { 'alt': 'BlogBundle:Post:error' } %}
-            new HelperTokenParser('render', '<template> [with <attributes:hash>[, <options:hash>]]', 'templating.helper.actions', 'render'),
+            new RenderTokenParser(),
 
             // {% flash 'notice' %}
             new HelperTokenParser('flash', '<name>', 'templating.helper.session', 'getFlash'),

+ 44 - 0
src/Symfony/Bundle/TwigBundle/Node/RenderNode.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace Symfony\Bundle\TwigBundle\Node;
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Represents a render node.
+ *
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
+ */
+class RenderNode extends \Twig_Node
+{
+    public function __construct(\Twig_Node_Expression $expr, \Twig_Node_Expression $attributes, \Twig_Node_Expression $options, $lineno, $tag = null)
+    {
+        parent::__construct(array('expr' => $expr, 'attributes' => $attributes, 'options' => $options), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param \Twig_Compiler A Twig_Compiler instance
+     */
+    public function compile(\Twig_Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write("echo \$this->env->getExtension('templating')->getContainer()->get('templating.helper.actions')->render(")
+            ->subcompile($this->getNode('expr'))
+            ->raw(', ')
+            ->subcompile($this->getNode('attributes'))
+            ->raw(', ')
+            ->subcompile($this->getNode('options'))
+            ->raw(");\n")
+        ;
+    }
+}

+ 66 - 0
src/Symfony/Bundle/TwigBundle/TokenParser/RenderTokenParser.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace Symfony\Bundle\TwigBundle\TokenParser;
+
+use Symfony\Bundle\TwigBundle\Node\RenderNode;
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * 
+ *
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
+ */
+class RenderTokenParser extends \Twig_TokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param \Twig_Token $token A \Twig_Token instance
+     *
+     * @return \Twig_NodeInterface A \Twig_NodeInterface instance
+     */
+    public function parse(\Twig_Token $token)
+    {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        // attributes
+        if ($this->parser->getStream()->test(\Twig_Token::NAME_TYPE, 'with')) {
+            $this->parser->getStream()->next();
+
+            $attributes = $this->parser->getExpressionParser()->parseExpression();
+        } else {
+            $attributes = new \Twig_Node_Expression_Array(array(), $token->getLine());
+        }
+
+        // options
+        if ($this->parser->getStream()->test(\Twig_Token::PUNCTUATION_TYPE, ',')) {
+            $this->parser->getStream()->next();
+
+            $options = $this->parser->getExpressionParser()->parseExpression();
+        } else {
+            $options = new \Twig_Node_Expression_Array(array(), $token->getLine());
+        }
+
+        $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
+
+        return new RenderNode($expr, $attributes, $options, $token->getLine(), $this->getTag());
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @param string The tag name
+     */
+    public function getTag()
+    {
+        return 'render';
+    }
+}