Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9bc309e

Browse filesBrowse files
committed
[Form] [TwigBridge] Added option to disable usage of default themes when rendering a form
1 parent 8486a50 commit 9bc309e
Copy full SHA for 9bc309e

21 files changed

+108
-36
lines changed

‎src/Symfony/Bridge/Twig/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/CHANGELOG.md
+1Lines 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 `DebugCommand::set/getTwigEnvironment`. Pass an instance of
910
`Twig\Environment` as first argument of the constructor instead

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Form/TwigRendererEngine.php
+5-3Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Node/FormThemeNode.php
+4-2Lines 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/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ protected function renderEnd(FormView $view, array $vars = array())
9999
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
100100
}
101101

102-
protected function setTheme(FormView $view, array $themes)
102+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
103103
{
104-
$this->renderer->setTheme($view, $themes);
104+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
105105
}
106106
}

‎src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap3LayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ protected function renderEnd(FormView $view, array $vars = array())
119119
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
120120
}
121121

122-
protected function setTheme(FormView $view, array $themes)
122+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
123123
{
124-
$this->renderer->setTheme($view, $themes);
124+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
125125
}
126126
}

‎src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4HorizontalLayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ protected function renderEnd(FormView $view, array $vars = array())
100100
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
101101
}
102102

103-
protected function setTheme(FormView $view, array $themes)
103+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
104104
{
105-
$this->renderer->setTheme($view, $themes);
105+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
106106
}
107107
}

‎src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionBootstrap4LayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ protected function renderEnd(FormView $view, array $vars = array())
122122
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
123123
}
124124

125-
protected function setTheme(FormView $view, array $themes)
125+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
126126
{
127-
$this->renderer->setTheme($view, $themes);
127+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
128128
}
129129
}

‎src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php
+5-5Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function testThemeBlockInheritanceUsingUse()
6262
->createView()
6363
;
6464

65-
$this->setTheme($view, array('theme_use.html.twig'));
65+
$this->setTheme($view, array('theme_use.html.twig'), true);
6666

6767
$this->assertMatchesXpath(
6868
$this->renderWidget($view),
@@ -77,7 +77,7 @@ public function testThemeBlockInheritanceUsingExtend()
7777
->createView()
7878
;
7979

80-
$this->setTheme($view, array('theme_extends.html.twig'));
80+
$this->setTheme($view, array('theme_extends.html.twig'), true);
8181

8282
$this->assertMatchesXpath(
8383
$this->renderWidget($view),
@@ -92,7 +92,7 @@ public function testThemeBlockInheritanceUsingDynamicExtend()
9292
->createView()
9393
;
9494

95-
$this->renderer->setTheme($view, array('page_dynamic_extends.html.twig'));
95+
$this->renderer->setTheme($view, array('page_dynamic_extends.html.twig'), true);
9696
$this->assertMatchesXpath(
9797
$this->renderer->searchAndRenderBlock($view, 'row'),
9898
'/div/label[text()="child"]'
@@ -193,9 +193,9 @@ protected function renderEnd(FormView $view, array $vars = array())
193193
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
194194
}
195195

196-
protected function setTheme(FormView $view, array $themes)
196+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
197197
{
198-
$this->renderer->setTheme($view, $themes);
198+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
199199
}
200200

201201
public static function themeBlockInheritanceProvider()

‎src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ protected function renderEnd(FormView $view, array $vars = array())
120120
return (string) $this->renderer->renderBlock($view, 'form_end', $vars);
121121
}
122122

123-
protected function setTheme(FormView $view, array $themes)
123+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
124124
{
125-
$this->renderer->setTheme($view, $themes);
125+
$this->renderer->setTheme($view, $themes, $useDefaultThemes);
126126
}
127127
}

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php
+23-2Lines 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()
@@ -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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php
+15Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php
+6-1Lines 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(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/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php
+6-1Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@ public function getName()
5454
*/
5555
public function setTheme(FormView $view, $themes)
5656
{
57-
$this->renderer->setTheme($view, $themes);
57+
$args = func_get_args();
58+
if (!isset($args[2])) {
59+
@trigger_error(sprintf('Calling setTheme method of %s without the third boolean argument $useDefaultThemes is deprecated since 3.4 and will be removed in 4.0. Call the method with the third argument included and use boolean true to keep current behaviour.', self::class), E_USER_DEPRECATED);
60+
}
61+
62+
$this->renderer->setTheme($view, $themes, isset($args[2]) ? (bool) $args[2] : true);
5863
}
5964

6065
/**

‎src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperDivLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperDivLayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ protected function renderEnd(FormView $view, array $vars = array())
121121
return (string) $this->engine->get('form')->end($view, $vars);
122122
}
123123

124-
protected function setTheme(FormView $view, array $themes)
124+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
125125
{
126-
$this->engine->get('form')->setTheme($view, $themes);
126+
$this->engine->get('form')->setTheme($view, $themes, $useDefaultThemes);
127127
}
128128

129129
public static function themeBlockInheritanceProvider()

‎src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperTableLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperTableLayoutTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ protected function renderEnd(FormView $view, array $vars = array())
122122
return (string) $this->engine->get('form')->end($view, $vars);
123123
}
124124

125-
protected function setTheme(FormView $view, array $themes)
125+
protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true)
126126
{
127-
$this->engine->get('form')->setTheme($view, $themes);
127+
$this->engine->get('form')->setTheme($view, $themes, $useDefaultThemes);
128128
}
129129
}

‎src/Symfony/Component/Form/AbstractRendererEngine.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/AbstractRendererEngine.php
+12Lines changed: 12 additions & 0 deletions
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
*/
@@ -59,11 +64,18 @@ public function __construct(array $defaultThemes = array())
5964
*/
6065
public function setTheme(FormView $view, $themes)
6166
{
67+
$args = func_get_args();
68+
if (!isset($args[2])) {
69+
@trigger_error(sprintf('Calling setTheme method of %s without the third boolean argument $useDefaultThemes is deprecated since 3.4 and will be removed in 4.0. Call the method with the third argument included and use boolean true to keep current behaviour.', self::class), E_USER_DEPRECATED);
70+
}
71+
6272
$cacheKey = $view->vars[self::CACHE_KEY_VAR];
6373

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

77+
$this->useDefaultThemes[$cacheKey] = isset($args[2]) ? (bool) $args[2] : true;
78+
6779
// Unset instead of resetting to an empty array, in order to allow
6880
// implementations (like TwigRendererEngine) to check whether $cacheKey
6981
// is set at all.

‎src/Symfony/Component/Form/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/CHANGELOG.md
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ CHANGELOG
77
* added `DebugCommand`
88
* deprecated `ChoiceLoaderInterface` implementation in `TimezoneType`
99
* added options "input" and "regions" to `TimezoneType`
10+
* added an option to ``Symfony\Component\Form\FormRendererEngineInterface::setTheme()`` and
11+
``Symfony\Component\Form\FormRendererInterface::setTheme()`` to disable usage of default themes when rendering a form
1012

1113
3.3.0
1214
-----

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php
+5-3Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/FormRenderer.php
+6-1Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,12 @@ public function getEngine()
7474
*/
7575
public function setTheme(FormView $view, $themes)
7676
{
77-
$this->engine->setTheme($view, $themes);
77+
$args = func_get_args();
78+
if (!isset($args[2])) {
79+
@trigger_error(sprintf('Calling setTheme method of %s without the third boolean argument $useDefaultThemes is deprecated since 3.4 and will be removed in 4.0. Call the method with the third argument included and use boolean true to keep current behaviour.', self::class), E_USER_DEPRECATED);
80+
}
81+
82+
$this->engine->setTheme($view, $themes, isset($args[2]) ? (bool) $args[2] : true);
7883
}
7984

8085
/**

‎src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ public function testThemeBlockInheritance($theme)
611611
->createView()
612612
;
613613

614-
$this->setTheme($view, $theme);
614+
$this->setTheme($view, $theme, true);
615615

616616
$this->assertMatchesXpath(
617617
$this->renderWidget($view),
@@ -634,8 +634,8 @@ public function testThemeInheritance($parentTheme, $childTheme)
634634
->createView()
635635
;
636636

637-
$this->setTheme($view, $parentTheme);
638-
$this->setTheme($view['child'], $childTheme);
637+
$this->setTheme($view, $parentTheme, true);
638+
$this->setTheme($view['child'], $childTheme, true);
639639

640640
$this->assertWidgetMatchesXpath($view, array(),
641641
'/div

‎src/Symfony/Component/Form/Tests/AbstractLayoutTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/AbstractLayoutTest.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ abstract protected function renderStart(FormView $view, array $vars = array());
125125

126126
abstract protected function renderEnd(FormView $view, array $vars = array());
127127

128-
abstract protected function setTheme(FormView $view, array $themes);
128+
abstract protected function setTheme(FormView $view, array $themes, $useDefaultThemes = true);
129129

130130
public function testLabel()
131131
{

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.