From 0c83c5d5943fc9c94f0f202b39ce5384eceab63e Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 12 Mar 2012 15:36:24 +0100 Subject: [PATCH] [Form] Alternate syntax for form_theme --- .../Bridge/Twig/Extension/FormExtension.php | 8 ++-- .../Bridge/Twig/Node/FormThemeNode.php | 13 ++---- .../Twig/TokenParser/FormThemeTokenParser.php | 16 +++++-- .../Tests/Bridge/Twig/Node/FormThemeTest.php | 20 ++++++-- .../TokenParser/FormThemeTokenParserTest.php | 46 +++++++++++++++++-- 5 files changed, 77 insertions(+), 26 deletions(-) diff --git a/src/Symfony/Bridge/Twig/Extension/FormExtension.php b/src/Symfony/Bridge/Twig/Extension/FormExtension.php index 1662ef8022ece..bee2eb8cc8685 100644 --- a/src/Symfony/Bridge/Twig/Extension/FormExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/FormExtension.php @@ -54,12 +54,12 @@ public function initRuntime(\Twig_Environment $environment) /** * Sets a theme for a given view. * - * @param FormView $view A FormView instance - * @param array $resources An array of resources + * @param FormView $view A FormView instance + * @param array|string $resources An array of resource names|a resource name */ - public function setTheme(FormView $view, array $resources) + public function setTheme(FormView $view, $resources) { - $this->themes->attach($view, $resources); + $this->themes->attach($view, (array) $resources); $this->blocks = new \SplObjectStorage(); } diff --git a/src/Symfony/Bridge/Twig/Node/FormThemeNode.php b/src/Symfony/Bridge/Twig/Node/FormThemeNode.php index 58d8793adb18b..c6fe132113c11 100644 --- a/src/Symfony/Bridge/Twig/Node/FormThemeNode.php +++ b/src/Symfony/Bridge/Twig/Node/FormThemeNode.php @@ -32,16 +32,9 @@ public function compile(\Twig_Compiler $compiler) ->addDebugInfo($this) ->write('echo $this->env->getExtension(\'form\')->setTheme(') ->subcompile($this->getNode('form')) - ->raw(', array(') + ->raw(', ') + ->subcompile($this->getNode('resources')) + ->raw(");\n"); ; - - foreach ($this->getNode('resources') as $resource) { - $compiler - ->subcompile($resource) - ->raw(', ') - ; - } - - $compiler->raw("));\n"); } } diff --git a/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php index 85aedd439f24b..d72c0e3a1b65f 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php @@ -33,14 +33,20 @@ public function parse(\Twig_Token $token) $stream = $this->parser->getStream(); $form = $this->parser->getExpressionParser()->parseExpression(); - $resources = array(); - do { - $resources[] = $this->parser->getExpressionParser()->parseExpression(); - } while (!$stream->test(\Twig_Token::BLOCK_END_TYPE)); + + if ($this->parser->getStream()->test(\Twig_Token::NAME_TYPE, 'with')) { + $this->parser->getStream()->next(); + $resources = $this->parser->getExpressionParser()->parseExpression(); + } else { + $resources = new \Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine()); + do { + $resources->addElement($this->parser->getExpressionParser()->parseExpression()); + } while (!$stream->test(\Twig_Token::BLOCK_END_TYPE)); + } $stream->expect(\Twig_Token::BLOCK_END_TYPE); - return new FormThemeNode($form, new \Twig_Node($resources), $lineno, $this->getTag()); + return new FormThemeNode($form, $resources, $lineno, $this->getTag()); } /** diff --git a/tests/Symfony/Tests/Bridge/Twig/Node/FormThemeTest.php b/tests/Symfony/Tests/Bridge/Twig/Node/FormThemeTest.php index 86d619bbff32b..9d4e627092a64 100644 --- a/tests/Symfony/Tests/Bridge/Twig/Node/FormThemeTest.php +++ b/tests/Symfony/Tests/Bridge/Twig/Node/FormThemeTest.php @@ -42,10 +42,12 @@ public function testConstructor() public function testCompile() { $form = new \Twig_Node_Expression_Name('form', 0); - $resources = new \Twig_Node(array( + $resources = new \Twig_Node_Expression_Array(array( + new \Twig_Node_Expression_Constant(0, 0), new \Twig_Node_Expression_Constant('tpl1', 0), + new \Twig_Node_Expression_Constant(1, 0), new \Twig_Node_Expression_Constant('tpl2', 0) - )); + ), 0); $node = new FormThemeNode($form, $resources, 0); @@ -53,7 +55,19 @@ public function testCompile() $this->assertEquals( sprintf( - 'echo $this->env->getExtension(\'form\')->setTheme(%s, array("tpl1", "tpl2", ));', + 'echo $this->env->getExtension(\'form\')->setTheme(%s, array(0 => "tpl1", 1 => "tpl2"));', + $this->getVariableGetter('form') + ), + trim($compiler->compile($node)->getSource()) + ); + + $resources = new \Twig_Node_Expression_Constant('tpl1', 0); + + $node = new FormThemeNode($form, $resources, 0); + + $this->assertEquals( + sprintf( + 'echo $this->env->getExtension(\'form\')->setTheme(%s, "tpl1");', $this->getVariableGetter('form') ), trim($compiler->compile($node)->getSource()) diff --git a/tests/Symfony/Tests/Bridge/Twig/TokenParser/FormThemeTokenParserTest.php b/tests/Symfony/Tests/Bridge/Twig/TokenParser/FormThemeTokenParserTest.php index 3df38437d1980..3d58181791227 100644 --- a/tests/Symfony/Tests/Bridge/Twig/TokenParser/FormThemeTokenParserTest.php +++ b/tests/Symfony/Tests/Bridge/Twig/TokenParser/FormThemeTokenParserTest.php @@ -46,9 +46,10 @@ public function getTestsForFormTheme() '{% form_theme form "tpl1" %}', new FormThemeNode( new \Twig_Node_Expression_Name('form', 1), - new \Twig_Node(array( + new \Twig_Node_Expression_Array(array( + new \Twig_Node_Expression_Constant(0, 1), new \Twig_Node_Expression_Constant('tpl1', 1), - )), + ), 1), 1, 'form_theme' ) @@ -57,10 +58,47 @@ public function getTestsForFormTheme() '{% form_theme form "tpl1" "tpl2" %}', new FormThemeNode( new \Twig_Node_Expression_Name('form', 1), - new \Twig_Node(array( + new \Twig_Node_Expression_Array(array( + new \Twig_Node_Expression_Constant(0, 1), new \Twig_Node_Expression_Constant('tpl1', 1), + new \Twig_Node_Expression_Constant(1, 1), new \Twig_Node_Expression_Constant('tpl2', 1) - )), + ), 1), + 1, + 'form_theme' + ) + ), + array( + '{% form_theme form with "tpl1" %}', + new FormThemeNode( + new \Twig_Node_Expression_Name('form', 1), + new \Twig_Node_Expression_Constant('tpl1', 1), + 1, + 'form_theme' + ) + ), + array( + '{% form_theme form with ["tpl1"] %}', + new FormThemeNode( + new \Twig_Node_Expression_Name('form', 1), + new \Twig_Node_Expression_Array(array( + new \Twig_Node_Expression_Constant(0, 1), + new \Twig_Node_Expression_Constant('tpl1', 1), + ), 1), + 1, + 'form_theme' + ) + ), + array( + '{% form_theme form with ["tpl1", "tpl2"] %}', + new FormThemeNode( + new \Twig_Node_Expression_Name('form', 1), + new \Twig_Node_Expression_Array(array( + new \Twig_Node_Expression_Constant(0, 1), + new \Twig_Node_Expression_Constant('tpl1', 1), + new \Twig_Node_Expression_Constant(1, 1), + new \Twig_Node_Expression_Constant('tpl2', 1) + ), 1), 1, 'form_theme' )