Symfony自定义字段模板标签呈现两次

时间:2016-12-01 10:27:28

标签: symfony templates twig label

我创建了一个名为' AgenceSelectType'的自定义表单字段。它基本上是一个带有默认值和自定义主题的EntityType。

每次使用此类型渲染表单时,标签都会呈现两次。这让我很生气。我错过了什么?

Sybufony 3.1 on Ubuntu 16.04 php 7.1

我的fields.html.twig文件:

    {% block agence_select_widget %}
    {% spaceless %}
            <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3">
                <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
                  {{label }} 
                </label> 
            </div>
            <div class="col-md-9 col-sm-9 col-xs-12 form-group">
                <select {{ block('widget_attributes') }} class="form-control" >
                {%- if preferred_choices|length > 0 -%}
                    {% set options = preferred_choices %}
                    {{- block('choice_widget_options') -}}
                    {%- if choices|length > 0 and separator is not none -%}
                        <li disabled="disabled">{{ separator }}</li>
                    {%- endif -%}
                {%- endif -%}
                {%- set options = choices -%}
                {{- block('choice_widget_options') -}}
            </select>
            </div>
    {% endspaceless %}
{% endblock %}

{%- block choice_widget_options -%}
    {% for group_label, choice in options %}
        {%- if choice is iterable -%}
            <optgroup label="{{ group_label|trans({}, translation_domain) }}">
                {% set options = choice %}
                {{- block('choice_widget_options') -}}
            </optgroup>
        {%- else -%}
            <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label }}</option>
        {%- endif -%}
    {% endfor %}
{%- endblock choice_widget_options -%}

我的自定义类型

class AgenceSelectType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'class' => 'AppBundle:Agence',
            'label' => 'Agence',
            'choice_label' => function ($agence) {
                    return $agence->getNom();
                },
            'required' => true,
        ));
    }

    public function getParent()
    {
        return EntityType::class;
    }
}

提前感谢你让我摆脱这种疯狂: - )

1 个答案:

答案 0 :(得分:2)

您如何在视图中显示表单行?

如果您使用form_row(form.agence),这是正常行为,因为您的block agence_select_widget包含标签,而{{ form_row() }}form_label + form_widget的短边。 我认为你的agence_select_widget块应该只包含输入视图,而不是标签视图。

如果您确定希望agence_select_widget包含标签,请使用{{form_widget(form.agence) }}同时显示标签和输入,不要使用{{form_row() }}(但如果您这样做,则不是这样做是正确的。)

为了好好利用小部件和标签块,我会推动

<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3">
    <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>
      {{label }} 
    </label> 
</div>

从您的{% block agence_select_widget %}到新{% block agence_select_label %}区块