[TwigBundle] split the route tag to 2 tags: path and url

This commit is contained in:
Fabien Potencier 2010-11-03 18:15:54 +01:00
parent c991b250ea
commit 1e13ecb5f3
4 changed files with 151 additions and 3 deletions

View File

@ -5,6 +5,8 @@ namespace Symfony\Bundle\TwigBundle\Extension;
use Symfony\Bundle\TwigBundle\TokenParser\HelperTokenParser;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TokenParser\IncludeTokenParser;
use Symfony\Bundle\TwigBundle\TokenParser\UrlTokenParser;
use Symfony\Bundle\TwigBundle\TokenParser\PathTokenParser;
/*
* This file is part of the Symfony package.
@ -63,15 +65,18 @@ class TemplatingExtension extends \Twig_Extension
// {% asset 'css/blog.css' %}
new HelperTokenParser('asset', '<location>', 'templating.helper.assets', 'getUrl'),
// {% route 'blog_post' with ['id': post.id] %}
new HelperTokenParser('route', '<route> [with <arguments:array>]', 'templating.helper.router', 'generate'),
// {% render 'BlogBundle:Post:list' with ['limit': 2], ['alt': 'BlogBundle:Post:error'] %}
new HelperTokenParser('render', '<template> [with <attributes:array>[, <options:array>]]', 'templating.helper.actions', 'render'),
// {% flash 'notice' %}
new HelperTokenParser('flash', '<name>', 'templating.helper.session', 'getFlash'),
// {% path 'blog_post' with ['id': post.id] %}
new PathTokenParser(),
// {% url 'blog_post' with ['id': post.id] %}
new UrlTokenParser(),
// {% include 'sometemplate.php' with ['something' : 'something2'] %}
new IncludeTokenParser(),
);

View File

@ -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.
*/
/**
*
*
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class RouteNode extends \Twig_Node
{
public function __construct(\Twig_NodeInterface $route, \Twig_Node_Expression $attributes = null, $absolute, $lineno, $tag = null)
{
parent::__construct(array('route' => $route, 'route_attributes' => $attributes), array('absolute' => $absolute), $lineno, $tag);
}
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler A Twig_Compiler instance
*/
public function compile($compiler)
{
$compiler
->addDebugInfo($this)
->write('echo $this->env->getExtension(\'templating\')->getContainer()->get(\'router\')->generate(')
->subcompile($this->getNode('route'))
->raw(', ')
->subcompile($this->getNode('route_attributes'))
->raw(', ')
->raw($this->getAttribute('absolute') ? 'true' : 'false')
->raw(");")
;
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace Symfony\Bundle\TwigBundle\TokenParser;
use Symfony\Bundle\TwigBundle\Node\RouteNode;
/*
* 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 PathTokenParser 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)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
$route = $this->parser->getExpressionParser()->parseExpression();
$attributes = null;
if ($stream->test('with')) {
$stream->next();
$attributes = $this->parser->getExpressionParser()->parseExpression();
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
return new RouteNode($route, $attributes, $this->isAbsolute(), $lineno, $this->getTag());
}
protected function isAbsolute()
{
return false;
}
/**
* Gets the tag name associated with this token parser.
*
* @param string The tag name
*/
public function getTag()
{
return 'path';
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace Symfony\Bundle\TwigBundle\TokenParser;
use Symfony\Bundle\TwigBundle\Node\RouteNode;
/*
* 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 UrlTokenParser extends PathTokenParser
{
protected function isAbsolute()
{
return true;
}
/**
* Gets the tag name associated with this token parser.
*
* @param string The tag name
*/
public function getTag()
{
return 'url';
}
}