Symfony3 form_widget 渲染 form_row
Symfony3 form_widget render form_row
我尝试在视图中呈现表单输入,但不是将 label
、errors
和 widget
分开,而是呈现整个 row
输入。
MyType.php
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', EmailType::class, [
'label' => 'Email',
'required' => true,
])
->add('emailIsPublic', CheckboxType::class, [
'label' => 'Make e-mail public (can be seen by everyone)',
'required' => false,
'attr' => [
'class' => 'switch',
]
])
->add('submit', SubmitType::class, [
'label' => 'Save changes',
'attr' => [
'class' => 'btn btn-outline-primary float-right',
]
]);
}
我的-view.html.twig
{{ form_start(edit_form) }}
<div>
{{ form_label(edit_form.emailIsPublic) }}
</div>
<div>
{{ form_errors(edit_form.emailIsPublic) }}
</div>
<div>
{{ form_widget(edit_form.emailIsPublic) }}
</div>
{{ form_end(edit_form, {'render_rest': false}) }}
生成HTML
<form name="appbundle_my" method="post">
<div></div>
<div></div>
<div>
<div class="form-check">
<label class="form-check-label">
<input id="appbundle_my_emailIsPublic" name="appbundle_my[emailIsPublic]" class="switch form-check-input" value="1" type="checkbox"> Make e-mail public (can be seen by everyone)
</label>
</div>
</div>
</form>
正如我们在生成的 HTML 中看到的那样,form_label
和 form_errors
是空的,form_widget
渲染了 form_row
应该渲染的内容。为什么?
我不太习惯用树枝和形式形成主题,但我很确定你不能因为复选框类型而将行分成这 3 个部分。使用复选框小部件时,标签会被嵌入到小部件的渲染中。当呈现 form_row 时,它呈现 3 部分标签、错误和小部件,而复选框小部件本身也呈现标签。考虑到标签几乎是有关复选框使用的重要信息,这是有道理的。
{% block checkbox_widget -%}
{%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%}
{% if 'checkbox-inline' in parent_label_class %}
{{- form_label(form, null, { widget: parent() }) -}}
{% elseif 'form-check-inline' in parent_label_class %}
<div class="form-check{{ not valid ? ' form-control is-invalid' }} form-check-inline">
{{- form_label(form, null, { widget: parent() }) -}}
</div>
{% else -%}
<div class="form-check{{ not valid ? ' form-control is-invalid' }}">
{{- form_label(form, null, { widget: parent() }) -}}
</div>
{%- endif -%}
{%- endblock checkbox_widget %}
您可以尝试通过在模板中添加如下内容来覆盖此特定 use-case 的块:
{% form_theme form _self %}
{% block _edit_form_emailIsPublic_row %}
{% spaceless %}
####build your markup for the checkbox here, use default on hot to access the needed informations etc.####
{% endspaceless %}
{% endblock %}
或者完全自己渲染它而不重新定义使用的块,通过自己编写标记并从表单对象(例如edit_form.emailIsPublic.vars.label)中获取一些重要的东西,如名称,标签值等而不调用任何助手并将字段设置为之后呈现 {% edit_form.emailIsPublic.setRendered %}
如果你想删除 render_rest: false
希望这能让您朝着正确的方向前进。表格可能会很痛苦。
正如我在这里看到的:https://github.com/symfony/symfony/issues/26540#issuecomment-375232354
此行为似乎是使用 Bootstrap 4 Form 主题时特有的错误。
That's specific to the Bootstrap 4 theme and it seems to be related to the changes made in #26591 [TwigBridge] Make sure we always render errors. Eventhough labels are disabled
.
我会等待 Symfony 的更新来解决这个问题。
我尝试在视图中呈现表单输入,但不是将 label
、errors
和 widget
分开,而是呈现整个 row
输入。
MyType.php
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', EmailType::class, [
'label' => 'Email',
'required' => true,
])
->add('emailIsPublic', CheckboxType::class, [
'label' => 'Make e-mail public (can be seen by everyone)',
'required' => false,
'attr' => [
'class' => 'switch',
]
])
->add('submit', SubmitType::class, [
'label' => 'Save changes',
'attr' => [
'class' => 'btn btn-outline-primary float-right',
]
]);
}
我的-view.html.twig
{{ form_start(edit_form) }}
<div>
{{ form_label(edit_form.emailIsPublic) }}
</div>
<div>
{{ form_errors(edit_form.emailIsPublic) }}
</div>
<div>
{{ form_widget(edit_form.emailIsPublic) }}
</div>
{{ form_end(edit_form, {'render_rest': false}) }}
生成HTML
<form name="appbundle_my" method="post">
<div></div>
<div></div>
<div>
<div class="form-check">
<label class="form-check-label">
<input id="appbundle_my_emailIsPublic" name="appbundle_my[emailIsPublic]" class="switch form-check-input" value="1" type="checkbox"> Make e-mail public (can be seen by everyone)
</label>
</div>
</div>
</form>
正如我们在生成的 HTML 中看到的那样,form_label
和 form_errors
是空的,form_widget
渲染了 form_row
应该渲染的内容。为什么?
我不太习惯用树枝和形式形成主题,但我很确定你不能因为复选框类型而将行分成这 3 个部分。使用复选框小部件时,标签会被嵌入到小部件的渲染中。当呈现 form_row 时,它呈现 3 部分标签、错误和小部件,而复选框小部件本身也呈现标签。考虑到标签几乎是有关复选框使用的重要信息,这是有道理的。
{% block checkbox_widget -%}
{%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
{%- set attr = attr|merge({class: (attr.class|default('') ~ ' form-check-input')|trim}) -%}
{% if 'checkbox-inline' in parent_label_class %}
{{- form_label(form, null, { widget: parent() }) -}}
{% elseif 'form-check-inline' in parent_label_class %}
<div class="form-check{{ not valid ? ' form-control is-invalid' }} form-check-inline">
{{- form_label(form, null, { widget: parent() }) -}}
</div>
{% else -%}
<div class="form-check{{ not valid ? ' form-control is-invalid' }}">
{{- form_label(form, null, { widget: parent() }) -}}
</div>
{%- endif -%}
{%- endblock checkbox_widget %}
您可以尝试通过在模板中添加如下内容来覆盖此特定 use-case 的块:
{% form_theme form _self %}
{% block _edit_form_emailIsPublic_row %}
{% spaceless %}
####build your markup for the checkbox here, use default on hot to access the needed informations etc.####
{% endspaceless %}
{% endblock %}
或者完全自己渲染它而不重新定义使用的块,通过自己编写标记并从表单对象(例如edit_form.emailIsPublic.vars.label)中获取一些重要的东西,如名称,标签值等而不调用任何助手并将字段设置为之后呈现 {% edit_form.emailIsPublic.setRendered %}
如果你想删除 render_rest: false
希望这能让您朝着正确的方向前进。表格可能会很痛苦。
正如我在这里看到的:https://github.com/symfony/symfony/issues/26540#issuecomment-375232354
此行为似乎是使用 Bootstrap 4 Form 主题时特有的错误。
That's specific to the Bootstrap 4 theme and it seems to be related to the changes made in #26591
[TwigBridge] Make sure we always render errors. Eventhough labels are disabled
.
我会等待 Symfony 的更新来解决这个问题。