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

Skip to content

Commit 42cd7f1

Browse files
committed
[Form] [TwigBridge] Added option to disable usage of default themes when rendering a form
1 parent 8486a50 commit 42cd7f1

21 files changed

+108
-36
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 `DebugCommand::set/getTwigEnvironment`. Pass an instance of
910
`Twig\Environment` as first argument of the constructor instead

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/Extension/FormExtensionBootstrap3HorizontalLayoutTest.php

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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'));
F438 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

Lines 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

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+
10000 $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

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(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

Lines 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

Lines 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

Lines 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

Lines 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

Lines 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

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: 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

Lines 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

Lines 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