Symfony2形式实体样式每个选项不同(折叠)

时间:2014-10-04 18:27:41

标签: symfony symfony-forms

我在表单中有一个实体字段(访问者)。我想根据其状态强调一个人。

->add('visitors', 'entity', array(
     'class'     => "T2m3Bundle:Person",
     'multiple'  => true,
     'property'  => 'entireName',
     'required'  => false,
)

我有一个方法getStatus,它返回4个状态。在每个州,我都想把不同的风格"在选项标签中。

以下是示例:

<select>
  <option value="1">Mary</option>
  <option value="2" class="alert alert-danger">John</option>
  <option value="3" class="alert alert-success">Peter</option>
  <option value="4" class="alert alert-warning">Robert</option>
</select>

所以我想做这样的事情:

{% for visitor in form.visitors %}
    {% set index = visitor.vars.value %}
    {% set entity = form.visitors.vars.choices[index].data %}

        {% if entity.status == 1 %}
            {{ form_widget(visitor) }}
            <span class="alert alert-warning">{{ entity.entireName }}</span>
        {% endif %}
        {% if entity.status == 2 %}
            {{ form_widget(visitor) }}
            <span class="alert alert-danger">{{ entity.entireName }}</span>
        {% endif %}
        ....
{% endfor %}

此示例适用于'expanded' => true,但不适用于折叠类型。我真的很感谢你的答案。

提前致谢!

修改

扩展使用此模板form_widget(...)

{% block choice_widget_expanded -%}
<div {{ block('widget_container_attributes') }}>
{%- for child in form %}
    {{- form_widget(child) -}}
    {{- form_label(child) -}}
{% endfor -%}
</div>
{% endblock choice_widget_expanded %}

但我不知道如何渲染手动折叠类型,其中没有{{- form_widget(...) -}}

1 个答案:

答案 0 :(得分:0)

尝试覆盖树枝选择窗口小部件:请参阅this link以查找相应的块。它是这样的

{% block choice_widget_collapsed -%}
    {% if required and placeholder is none and not placeholder_in_choices and not multiple -%}
        {% set required = false %}
    {%- endif -%}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if placeholder is not none -%}
            <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ placeholder|trans({}, translation_domain) }}</option>
        {%- endif %}
        {%- if preferred_choices|length > 0 -%}
            {% set options = preferred_choices %}
            {{- block('choice_widget_options') -}}
            {% if choices|length > 0 and separator is not none -%}
                <option disabled="disabled">{{ separator }}</option>
            {%- endif %}
        {%- endif -%}
        {% set options = choices -%}
        {{- block('choice_widget_options') -}}
    </select>
{%- endblock choice_widget_collapsed %}

{% 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 -%}
            {# HERE we define the class based on the status #}
            {% if status is defined %}
                {% if status == 1 %}
                    {% set status_class = 'alert alert-warning' %}
                {% elseif status == 2 %}
                    {% set status_class = 'alert alert-danger' %}
                {% elseif ... %}
                    ....
                {% endif %}
            {% endif %}
            <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %} {% if status_class is defined %} class="{{ status_class }}" {% endif %} >{{ choice.label|trans({}, translation_domain) }}</option>
        {%- endif -%}
    {% endfor %}
{%- endblock choice_widget_options %}

最后在你的模板中,像这样调用小部件:

{% for visitor in form.visitors %}
    {% set index = visitor.vars.value %}
    {% set entity = form.visitors.vars.choices[index].data %}

        {{ form_widget(visitor, {'status': entity.status}) }}
        ....
{% endfor %}

这未经过测试,但应该可行。让我知道。