一个。我想渲染表单并使用表单主题。但我创建的块直接在我的doctype之前输出隐藏的输入字段。但我只想在表单(表单)函数中进行渲染。
B中。另外,我不能在块中使用 {{template}} 变量或在块外创建的其他变量?模板变量由控制器创建。
{# FORM THEME #}
{% form_theme form _self %}
{% block _my_form_example__token_widget %}
{% set type = type|default('hidden') %}
<input data-test="is-this-render" type="{{ type }}" {{ block('widget_attributes') }} value="{{
render_esi(
controller(
'MyController:Form:token',
{ 'form': template } {# template variable can't be accessed here?? #}
)
) }}" />
{% endblock %}
<!doctype html>
<html>
<head>
<title>Basic Form</title>
</head>
<body>
<h1>Basic Form {{ template }}</h1>{# This output works #}
{{ form(form) }}
</body>
</html>
输出如下:
<input data-is-rendered="test" type="hidden" value="...." /> <!-- this should not be here -->
<!doctype html>
<html>
<head>
<title>Basic Form</title>
</head>
<body>
<h1>Basic Form template_variable_content</h1><!-- {{ template }} works here -->
<form ....>
<!-- ... --->
<input data-is-rendered="test" type="hidden" value="...." /> <!-- Render Correct when no template variable is used -->
<!-- ... --->
</form>
</body>
</html>
答案 0 :(得分:1)
我认为你误解了Twig中块的使用。当模板使用extends
扩展另一个模板时,您可以使用block
标记来定义将替换父模板中某些命名区域的区域。
由于您的模板不会扩展另一个模板,因此您对block
标记的使用只是告诉Twig您希望子模板能够通过定义名为的块来替换模板的该部分&#34; _my_form_example__token_widget&#34;
在Symfony documentation for form theming中,您会注意到他们以所有重要的extends
标记开始示例。
{% extends 'base.html.twig' %}
{% form_theme form _self %}
{% block integer_widget %}
<div class="integer_widget">
{% set type = type|default('number') %}
{{ block('form_widget_simple') }}
</div>
{% endblock %}
{% block content %}
{# ... render the form #}
{{ form_row(form.age) }}
{% endblock %}
即使他们的示例文件扩展的基本模板与表单主题无关,但它只是一个子模板切换block
标签来定义要替换的区域并使它们定义可用于替换的区域。简单地使模板扩展为基础可以解决使用此块时所描述的所有问题。