如何获取输入表单类型

时间:2012-11-02 13:57:55

标签: symfony twig

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

我试试:

{# 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}}无效。

5 个答案:

答案 0 :(得分:23)

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

add a class to the form row时,您可以将其用于making application-wide customizations

choice

然后你可以应用CSS规则:

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

Twitter Bootstrap

如果您使用Twitter引导程序,则自div.form_row.text {color:Red;} exists in bootstrap以来可能会遇到问题。我建议使用Symfony表格行的前缀:

.checkbox

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

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

更新

Twitter bootstrap form theme is now included in Symfony 2.6

答案 1 :(得分: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 %}

要获得beter类型:

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

答案 2 :(得分:2)

public class ValidationResult { public bool IsValid { get; set; } public IList<string> Errors { get; set; } public ValidationResult() { Errors = new List<string>(); } } public class IsValidInput { public ValidationResult IsValid(object value) { ValidationResult result = new ValidationResult(); try { ExternalValidator.Validate(value); result.IsValid = true; } catch (CustomException ex) { foreach(var errorText in ex.GetDescriptions()) { result.Errors.Add(this.ErrorMessage + errorText); } } } return result; } 用于生成块名称以显示字段(cf block_prefixes方法)。将显示模板中最具体的现有块(通常为FormRenderer::searchAndRenderBlock文件)。

因此,form_div_layout.html.twig的最后一项是您输入的ID,以允许您覆盖特定字段的阻止。

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

你可以在聪明的语法中使用这个:block_prefixes

答案 3 :(得分:1)

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

{{ form.vars.block_prefixes | slice(-2,1) | first }}

答案 4 :(得分:0)

使用

{{ form.name.vars.original_type }}

E.g。来自我的一个模板

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