Skip to content

Commit

Permalink
[TwigBundle] removed usage of HelperTokenParser for the 'render' tag
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Jan 3, 2011
1 parent eb4788e commit 840bd8a
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 1 deletion.
Expand Up @@ -7,6 +7,7 @@
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;

/*
Expand Down Expand Up @@ -109,7 +110,7 @@ public function getTokenParsers()
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'),
Expand Down
44 changes: 44 additions & 0 deletions 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 changes: 66 additions & 0 deletions 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';
}
}

0 comments on commit 840bd8a

Please sign in to comment.