Skip to content

Commit a6aa9ec

Browse files
committed
feature #22610 [Form] [TwigBridge] Added option to disable usage of default themes when rendering a form (emodric)
This PR was merged into the 3.4 branch. Discussion ---------- [Form] [TwigBridge] Added option to disable usage of default themes when rendering a form | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | yes | Tests pass? | yes | Fixed tickets | N/A | License | MIT | Doc PR | symfony/symfony-docs#8495 This adds a possibility to use `only` keyword in `form_theme` tag to disable usage of globally defined form themes, e.g. `{% form_theme form with ['common.html.twig', 'form/fields.html.twig'] only %}` Otherwise, in order to completely control the rendering of the forms (for example in custom admin interfaces), one would need to use a form theme which has all the possible twig blocks defined to prevent globally defined themes to interfere with the rendering. `only` keyword is already used when including a Twig template to transfer only the variables which are explicitly defined in the `include` tag, so it seemed natural to use it here too. This, of course, means that the user will need to manually `use` all of the templates that are required to render the form, including `form_div_layout.html.twig` This issue is described in details over at Symfony Demo repo: symfony/demo#515 TODO: - [x] submit changes to the documentation Commits ------- e0681f9 [Form] [TwigBridge] Added option to disable usage of default themes when rendering a form
2 parents 3f0a3f5 + e0681f9 commit a6aa9ec

22 files changed

+107
-43
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
$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())

0 commit comments

Comments
 (0)