10000 [Form] [TwigBridge] Added option to disable usage of default themes w… · symfony/symfony@bdd1ffc · GitHub
[go: up one dir, main page]

Skip to content

Commit bdd1ffc

Browse files
committed
[Form] [TwigBridge] Added option to disable usage of default themes when rendering a form
1 parent 8c4a1e7 commit bdd1ffc

File tree

12 files changed

+87
-22
lines changed

12 files changed

+87
-22
lines changed

src/Symfony/Bridge/Twig/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
3.4.0
55
-----
66

7+
* added an `only` keyword to `form_theme` tag to disable usage of default themes when rendering a form
78
* deprecated `Symfony\Bridge\Twig\Form\TwigRenderer`
89
* deprecated `Symfony\Bridge\Twig\Command\DebugCommand::set/getTwigEnvironment` and the ability to pass a command name as first argument
910
* deprecated `Symfony\Bridge\Twig\Command\LintCommand::set/getTwigEnvironment` and the ability to pass a command name as first argument

src/Symfony/Bridge/Twig/Form/TwigRendererEngine.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,11 @@ protected function loadResourceForBlockName($cacheKey, FormView $view, $blockNam
124124

125125
// Check the default themes once we reach the root view without success
126126
if (!$view->parent) {
127-
for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
128-
$this->loadResourcesFromTheme($cacheKey, $this->defaultThemes[$i]);
129-
// CONTINUE LOADING (see doc comment)
127+
if (!isset($this->useDefaultThemes[$cacheKey]) || $this->useDefaultThemes[$cacheKey]) {
128+
for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
129+
$this->loadResourcesFromTheme($cacheKey, $this->defaultThemes[$i]);
130+
// CONTINUE LOADING (see doc comment)
131+
}
130132
}
131133
}
132134

src/Symfony/Bridge/Twig/Node/FormThemeNode.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
*/
2323
class FormThemeNode extends Node
2424
{
25-
public function __construct(Node $form, Node $resources, $lineno, $tag = null)
25+
public function __construct(Node $form, Node $resources, $lineno, $tag = null, $only = false)
2626
{
27-
parent::__construct(array('form' => $form, 'resources' => $resources), array(), $lineno, $tag);
27+
parent::__construct(array('form' => $form, 'resources' => $resources), array('only' => (bool) $only), $lineno, $tag);
2828
}
2929

3030
public function compile(Compiler $compiler)
@@ -44,6 +44,8 @@ public function compile(Compiler $compiler)
4444
->subcompile($this->getNode('form'))
4545
->raw(', ')
4646
->subcompile($this->getNode('resources'))
47+
->raw(', ')
48+
->raw(false === $this->getAttribute('only') ? 'true' : 'false')
4749
->raw(");\n");
4850
}
4951
}

src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public function testConstructor()
3939

4040
$this->assertEquals($form, $node->getNode('form'));
4141
$this->assertEquals($resources, $node->getNode('resources'));
42+
$this->assertFalse($node->getAttribute('only'));
4243
}
4344

4445
public function testCompile() DEC0
@@ -60,7 +61,17 @@ public function testCompile()
6061

6162
$this->assertEquals(
6263
sprintf(
63-
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, array(0 => "tpl1", 1 => "tpl2"));',
64+
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, array(0 => "tpl1", 1 => "tpl2"), true);',
65+
$this->getVariableGetter('form')
66+
),
67+
trim($compiler->compile($node)->getSource())
68+
);
69+
70+
$node = new FormThemeNode($form, $resources, 0, null, true);
71+
72+
$this->assertEquals(
73+
sprintf(
74+
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, array(0 => "tpl1", 1 => "tpl2"), false);',
6475
$this->getVariableGetter('form')
6576
),
6677
trim($compiler->compile($node)->getSource())
@@ -72,7 +83,17 @@ public function testCompile()
7283

7384
$this->assertEquals(
7485
sprintf(
75-
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, "tpl1");',
86+
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, "tpl1", true);',
87+
$this->getVariableGetter('form')
88+
),
89+
trim($compiler->compile($node)->getSource())
90+
);
91+
92+
$node = new FormThemeNode($form, $resources, 0, null, true);
93+
94+
$this->assertEquals(
95+
sprintf(
96+
'$this->env->getRuntime("Symfony\\\\Component\\\\Form\\\\FormRenderer")->setTheme(%s, "tpl1", false);',
7697
$this->getVariableGetter('form')
7798
),
7899
trim($compiler->compile($node)->getSource())

src/Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,21 @@ public function getTestsForFormTheme()
100100
'form_theme'
101101
),
102102
),
103+
array(
104+
'{% form_theme form with ["tpl1", "tpl2"] only %}',
105+
new FormThemeNode(
106+
new NameExpression('form', 1),
107+
new ArrayExpression(array(
108+
new ConstantExpression(0, 1),
109+
new ConstantExpression('tpl1', 1),
110+
new ConstantExpression(1, 1),
111+
new ConstantExpression('tpl2', 1),
112+
), 1),
113+
1,
114+
'form_theme',
115+
true
116+
),
117+
),
103118
);
104119
}
105120
}

src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,15 @@ public function parse(Token $token)
3737
$stream = $this->parser->getStream();
3838

3939
$form = $this->parser->getExpressionParser()->parseExpression();
40+
$only = false;
4041

4142
if ($this->parser->getStream()->test(Token::NAME_TYPE, 'with')) {
4243
$this->parser->getStream()->next();
4344
$resources = $this->parser->getExpressionParser()->parseExpression();
45+
46+
if ($this->parser->getStream()->nextIf(\Twig_Token::NAME_TYPE, 'only')) {
47+
$only = true;
48+
}
4449
} else {
4550
$resources = new ArrayExpression(array(), $stream->getCurrent()->getLine());
4651
do {
@@ -50,7 +55,7 @@ public function parse(Token $token)
5055

5156
$stream->expect(Token::BLOCK_END_TYPE);
5257

53-
return new FormThemeNode($form, $resources, $lineno, $this->getTag());
58+
return new FormThemeNode($form, $resources, $lineno, $this->getTag(), $only);
5459
}
5560

5661
/**

src/Symfony/Component/Form/AbstractRendererEngine.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ abstract class AbstractRendererEngine implements FormRendererEngineInterface
3333
*/
3434
protected $themes = array();
3535

36+
/**
37+
* @var array
38+
*/
39+
protected $useDefaultThemes = array();
40+
3641
/**
3742
* @var array
3843
*/
@@ -57,13 +62,15 @@ public function __construct(array $defaultThemes = array())
5762
/**
5863
* {@inheritdoc}
5964
*/
60-
public function setTheme(FormView $view, $themes)
65+
public function setTheme(FormView $view, $themes, $useDefaultThemes = true)
6166
{
6267
$cacheKey = $view->vars[self::CACHE_KEY_VAR];
6368

6469
// Do not cast, as casting turns objects into arrays of properties
6570
$this->themes[$cacheKey] = is_array($themes) ? $themes : array($themes);
6671

72+
$this->useDefaultThemes[$cacheKey] = (bool) $useDefaultThemes;
73+
6774
// Unset instead of resetting to an empty array, in order to allow
6875
// implementations (like TwigRendererEngine) to check whether $cacheKey
6976
// is set at all.

src/Symfony/Component/Form/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
CHANGELOG
22
=========
33

4+
3.4.0
5+
-----
6+
7+
* added an option to `Symfony\Component\Form\FormRendererEngineInterface::setTheme()` and
8+
`Symfony\Component\Form\FormRendererInterface::setTheme()` to disable usage of default themes when rendering a form
9+
410
3.3.0
511
-----
612

src/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,11 @@ protected function loadResourceForBlockName($cacheKey, FormView $view, $blockNam
7272

7373
// Check the default themes once we reach the root form without success
7474
if (!$view->parent) {
75-
for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
76-
if ($this->loadResourceFromTheme($cacheKey, $blockName, $this->defaultThemes[$i])) {
77-
return true;
75+
if (!isset($this->useDefaultThemes[$cacheKey]) || $this->useDefaultThemes[$cacheKey]) {
76+
for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
77+
if ($this->loadResourceFromTheme($cacheKey, $blockName, $this->defaultThemes[$i])) {
78+
return true;
79+
}
7880
}
7981
}
8082
}

src/Symfony/Component/Form/FormRenderer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ public function getEngine()
7272
/**
7373
* {@inheritdoc}
7474
*/
75-
public function setTheme(FormView $view, $themes)
75+
public function setTheme(FormView $view, $themes, $useDefaultThemes = true)
7676
{
77-
$this->engine->setTheme($view, $themes);
77+
$this->engine->setTheme($view, $themes, $useDefaultThemes);
7878
}
7979

8080
/**

src/Symfony/Component/Form/FormRendererEngineInterface.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ interface FormRendererEngineInterface
2121
/**
2222
* Sets the theme(s) to be used for rendering a view and its children.
2323
*
24-
* @param FormView $view The view to assign the theme(s) to
25-
* @param mixed $themes The theme(s). The type of these themes
26-
* is open to the implementation.
24+
* @param FormView $view The view to assign the theme(s) to
25+
* @param mixed $themes The theme(s). The type of these themes
26+
* is open to the implementation.
27+
* @param bool $useDefaultThemes If set to false, will not use
28+
* default themes to render the view.
2729
*/
28-
public function setTheme(FormView $view, $themes);
30+
public function setTheme(FormView $view, $themes, $useDefaultThemes = true);
2931

3032
/**
3133
* Returns the resource for a block name.

src/Symfony/Component/Form/FormRendererInterface.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ public function getEngine();
2828
/**
2929
* Sets the theme(s) to be used for rendering a view and its children.
3030
*
31-
* @param FormView $view The view to assign the theme(s) to
32-
* @param mixed $themes The theme(s). The type of these themes
33-
* is open to the implementation.
31+
* @param FormView $view The view to assign the theme(s) to
32+
* @param mixed $themes The theme(s). The type of these themes
33+
* is open to the implementation.
34+
* @param bool $useDefaultThemes If set to false, will not use
35+
* default themes to render the view.
3436
*/
35-
public function setTheme(FormView $view, $themes);
37+
public function setTheme(FormView $view, $themes, $useDefaultThemes = true);
3638

3739
/**
3840
* Renders a named block of the form theme.

0 commit comments

Comments
 (0)
0