Как получить тип входной формы - программирование

Как получить тип входной формы

Я хочу получить тип поля формы и задать тип поля типа fot

Я пытаюсь:

{# 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}} не работает.

4b9b3361

Ответ 1

Вы можете получить тип поля, используя следующее:

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

Итак, если вы получили поле с именем message в своей форме, используйте это:

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

Для типов полей вложенной формы используйте это:

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

EDIT:

Чтобы перезаписать базовые блоки формы, сделайте это в файле шаблона:

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

Ответ 2

Ответ от 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 Bootstrap

Если вы используете загрузку Twitter, у вас могут возникнуть проблемы, поскольку в bootstrap существует .checkbox класс . Я предлагаю использовать префикс для строк форм 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;}

Update

Твиттер темы бутстрапа Twitter теперь включен в Symfony 2.6.

Ответ 3

Используйте

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

Ответ 4

Чтобы избежать жесткого кодирования индекса массива (1 или 2 в зависимости от версии Symfony), я использовал следующее:

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

Ответ 5

block_prefixes используется для генерации имен блоков для отображения поля (метод cf FormRenderer::searchAndRenderBlock). Будет показан наиболее специфический существующий блок в шаблоне (обычно form_div_layout.html.twig файл).

Итак, последний элемент block_prefixes - это идентификатор вашего ввода, чтобы вы могли переопределить блок для определенного поля.

Предыдущий элемент будет тем, который вам нужен.

Вы можете использовать этот: $form->vars.block_prefixes[$form->vars.block_prefixes|count -2] в синтаксисе smarty.