Как получить тип входной формы
Я хочу получить тип поля формы и задать тип поля типа 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}} не работает.
Ответы
Ответ 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.