-
-
Save maxgalbu/9409182 to your computer and use it in GitHub Desktop.
| <? | |
| include_once("base/Twig/Autoloader.php"); | |
| Twig_Autoloader::register(); | |
| $loader = new Twig_Loader_Filesystem('templates'); | |
| $twig = new Twig_Environment($loader, array()); | |
| //Add the Switch token parser | |
| $twig->addTokenParser(new Twig_TokenParser_Switch()); | |
| ?> |
| {% set test = 1 %} | |
| {% set othervar = 2 %} | |
| {% switch test %} | |
| {% case 1 %} | |
| test is 1 | |
| {% case 2 %} | |
| {% if othervar == 2 %} | |
| test is 2 | |
| {% else %} | |
| test is 2 | |
| {% endif %} | |
| {% case 0 %} | |
| test is 2 | |
| {% endswitch %} |
| <?php | |
| //To be added under Twig/Node/Switch.php | |
| /* | |
| * This file is part of Twig. | |
| * | |
| * (c) 2009 Fabien Potencier | |
| * (c) 2009 Armin Ronacher | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| /** | |
| * Represents an if node. | |
| * | |
| * @package twig | |
| * @author Dsls | |
| * @author maxgalbu | |
| */ | |
| class Twig_Node_Switch extends Twig_Node | |
| { | |
| public function __construct(Twig_NodeInterface $value, Twig_NodeInterface $cases, Twig_NodeInterface $default = null, $lineno, $tag = null) | |
| { | |
| parent::__construct(array('value' => $value, 'cases' => $cases, 'default' => $default), array(), $lineno, $tag); | |
| } | |
| /** | |
| * Compiles the node to PHP. | |
| * | |
| * @param Twig_Compiler A Twig_Compiler instance | |
| */ | |
| public function compile(Twig_Compiler $compiler) | |
| { | |
| $compiler->addDebugInfo($this); | |
| $compiler | |
| ->write("switch (") | |
| ->subcompile($this->getNode('value')) | |
| ->raw(") {\n") | |
| ->indent | |
| ; | |
| for ($i = 0; $i < count($this->getNode('cases')); $i += 2) { | |
| $compiler | |
| ->write('case ') | |
| ->subcompile($this->getNode('cases')->getNode($i)) | |
| ->raw(":\n") | |
| ->indent() | |
| ->subcompile($this->getNode('cases')->getNode($i + 1)) | |
| ->addIndentation() | |
| ->raw("break;\n") | |
| ; | |
| } | |
| if ($this->hasNode('default') && null !== $this->getNode('default')) { | |
| $compiler | |
| ->write("default:\n") | |
| ->indent() | |
| ->subcompile($this->getNode('default')) | |
| ->addIndentation() | |
| ->raw("break;\n") | |
| ; | |
| } | |
| $compiler | |
| ->outdent() | |
| ->write("}\n"); | |
| } | |
| } |
| <?php | |
| //To be added under Twig/TokenParser/ | |
| /* | |
| * This file is part of Twig. | |
| * | |
| * (c) 2009 Fabien Potencier | |
| * (c) 2009 Armin Ronacher | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| class Twig_TokenParser_Switch 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) | |
| { | |
| $parser = $this->parser; | |
| $stream = $parser->getStream(); | |
| $default = null; | |
| $cases = array(); | |
| $end = false; | |
| $name = $parser->getExpressionParser()->parseExpression(); | |
| $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
| $stream->expect(Twig_Token::TEXT_TYPE); | |
| $stream->expect(Twig_Token::BLOCK_START_TYPE); | |
| while (!$end) | |
| { | |
| $v = $stream->next(); | |
| switch ($v->getValue()) { | |
| case 'default': | |
| $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
| $default = $parser->subparse(array($this, 'decideIfEnd')); | |
| break; | |
| case 'case': | |
| $expr = $parser->getExpressionParser()->parseExpression(); | |
| $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
| $body = $parser->subparse(array($this, 'decideIfFork')); | |
| $cases[] = $expr; | |
| $cases[] = $body; | |
| break; | |
| case 'endswitch': | |
| $end = true; | |
| break; | |
| default: | |
| throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "case", "default", or "endswitch" to close the "switch" block started at line %d)', $lineno), -1); | |
| } | |
| } | |
| $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
| return new Twig_Node_Switch($name,new Twig_Node($cases), $default, $token->getLine(), $this->getTag()); | |
| } | |
| public function decideIfFork($token) | |
| { | |
| return $token->test(array('case', 'default', 'endswitch')); | |
| } | |
| public function decideIfEnd($token) | |
| { | |
| return $token->test(array('endswitch')); | |
| } | |
| /** | |
| * Gets the tag name associated with this token parser. | |
| * | |
| * @param string The tag name | |
| */ | |
| public function getTag() | |
| { | |
| return 'switch'; | |
| } | |
| } |
public function compile(Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
$compiler
->write("switch (")
->subcompile($this->getNode('value'))
->raw(") {\n")
->indent
-------------------------------change to----------------------
public function compile(Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
$compiler
->write("switch (")
->subcompile($this->getNode('value'))
->raw(") {\n")
->indent()
Twig_Node_Switch is showing a lot of errors in the latest Twig... any update on this? e.g. the constructor is incompatible with Twig_Node and ->indent is undefined. $token->test() is not defined, $lineno is not defined...
Hi,
I'm currently using your code to implement the switch tag in my template.
Now I try to adapt it to Twig 2.0, but I fail. I can not even make a trace with xDebug.
Could you help me make the code functional? And give me the elements to understand the implementation of tags, which remains to me mysterious.
i obtains an Error code 500 without anymore informations
Gilbert ARMENGAUD
(celtic34fr)
Béziers (Occitanie, France)
Hi
I try to use this node but I got an error:
Fatal error: Uncaught Error: Class 'Twig_TokenParser_Switch' not found.
Hi dude,
did you submitted as a pull request to Sensiolabs ? Could be a nice idea