18

我想获取表单字段类型并设置类字段类型

我尝试:

{# Form field row #}
{% block form_row %}
{% spaceless %}
  <div class="field-group{% if errors|length > 0%} error{%endif%}" id="fc-{{ id }}">
    {{ form_label(form, label|default(null)) }}
    <div class="field-item {{ type }}">
      {{ form_widget(form) }}
      {% if errors|length > 0 %}
        <div class="errors">{{ form_errors(form) }}</div>
      {% endif %}
    </div>
  </div>
{% endspaceless %}
{% endblock %}

但是 {{ type }} 不起作用。

4

5 回答 5

23

MatsRietdijk 的答案是正确的,但是从 Symfony 2.3 开始,类型的索引似乎已经从 2 变为 1。因此,{{ form.vars.block_prefixes.1 }}将返回checkbox, date,choice等。

在进行应用程序范围的自定义时,您可以使用它向表单行添加一个类

{% block form_row %}
    <div class="form_row {{ form.vars.block_prefixes.1 }}">
        {{ form_label(form) }}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
    </div>
{% endblock form_row %}

然后你可以应用 CSS 规则:

div.form_row.text {color:Red;}

推特引导

如果您使用 Twitter 引导程序,您可能会遇到问题,因为.checkbox该类存在于 bootstrap 中。我建议为 Symfony 表单行使用前缀:

{% block form_row %}
    <div class="form_row symfony_{{ form.vars.block_prefixes.1 }}">
        {{ form_label(form) }}
        {{ form_widget(form) }}
        {{ form_errors(form) }}
    </div>
{% endblock form_row %}

CSS 文件中的规则会有所不同:

div.form_row.symfony_text {color:Red;}

更新

Twitter 引导表单主题现在包含在 Symfony 2.6中。

于 2013-09-13T12:41:25.383 回答
19

您可以使用以下方法获取字段类型:

{{ form.FIELD_NAME.vars.block_prefixes.2 }}

因此,如果您的表单中有一个名为 message 的字段,请使用:

{{ form.message.vars.block_prefixes.2 }}

对于嵌套表单字段类型,请使用:

{{ form.NESTED_FORM_NAME.FIELD_NAME.vars.block_prefixes.2 }}

编辑 :

要覆盖基本表单块,请在模板文件中执行以下操作:

....
{% form_theme form _self %}
{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% if not attr.class is defined %}
        class="{{ type|default('text') }}"
    {% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% elseif attrname == 'class' %}{{ attrname }}="{{ type|default('text') }} {{ attrvalue }}"{% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
{% block content %}
    ....
{% endblock %}

或获得更好的类型:

....
{% form_theme form _self %}
{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} readonly="readonly"{% endif %}{% if disabled %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% if not attr.class is defined %}
        class="{{ form.vars.block_prefixes.2 }}"
    {% endif %}
    {% for attrname, attrvalue in attr %}{% if attrname in ['placeholder', 'title'] %}{{ attrname }}="{{ attrvalue|trans({}, translation_domain) }}" {% elseif attrname == 'class' %}{{ attrname }}="{{ form.vars.block_prefixes.2 }} {{ attrvalue }}"{% else %}{{ attrname }}="{{ attrvalue }}" {% endif %}{% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
{% block content %}
    ....
{% endblock %}
于 2012-11-03T12:50:30.750 回答
2

block_prefixes用于生成块名称以显示字段(cfFormRenderer::searchAndRenderBlock方法)。将显示模板中最具体的现有块(通常是form_div_layout.html.twig文件)。

因此,最后一项block_prefixes是您输入的 id,以允许您覆盖特定字段的块。

上一个项目将是您需要的项目。

你可以使用这个 :$form->vars.block_prefixes[$form->vars.block_prefixes|count -2]在 smarty 语法中。

于 2015-05-05T13:44:39.077 回答
1

为了避免硬编码数组索引(1 或 2 取决于 Symfony 版本),我使用了以下内容:

{{ form.vars.block_prefixes | slice(-2,1) | first }}
于 2015-02-24T11:29:59.387 回答
-1

采用

{{ form.name.vars.original_type }}

例如,来自我的一个模板

{% if myform.fieldname.vars.original_type == 'choice' %}
    <hr>
    {{ form_label(myform.fieldname) }}
    <p>Select a ...</p>
    {{ form_widget(myform.fieldname) }}
{% elseif myform.fieldname.vars.original_type == 'hidden' %}
    {{ form_row(myform.fieldname) }}
{% endif %}
于 2014-05-06T02:51:13.413 回答