1

我尝试在视图中呈现表单输入,但不是分隔label,errorswidget,而是呈现整个row输入。

我的类型.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',
            ]
        ]);
}

我的视图.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_labelform_errors是空的并form_widget呈现form_row应该呈现的内容。为什么?

4

2 回答 2

0

正如我在这里看到的:https ://github.com/symfony/symfony/issues/26540#issuecomment-375232354

此行为似乎是特定于 Bootstrap 4 Form 主题使用的错误。

这是特定于 Bootstrap 4 主题的,它似乎与 #26591 中所做的更改有关[TwigBridge] Make sure we always render errors. Eventhough labels are disabled

我将等待 Symfony 的更新来解决这个问题。

于 2018-03-22T12:35:58.983 回答
0

我不太习惯用树枝和形成主题,但我很确定你不能因为复选框类型将行分成这 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 %}

您可以尝试通过在模板中添加类似这样的内容来覆盖此特定用例的块:

{% 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

希望这可以使您朝着正确的方向前进。表格可能会很痛苦。

于 2018-02-16T13:47:39.263 回答