Symfony2 Form Builder - удалить ярлык, сделать его заполнитель
Я играю с создателем форм Symfony, и я не могу найти способ не отображать ярлык. Кроме того, меня интересует фактическое установление заполнителя для каждого окна ввода. Это возможно? Я немного исследовал и ничего не нашел.
Моя форма:
<form action="{{ path('searchPeople') }}" method="post" class="form-inline">
{{ form_errors(form) }}
{{ form_row(form.first_name) }}
{{ form_row(form.last_name) }}
{{ form_rest(form) }}
<br />
<button type="submit" class="btn btn-primary" /><i class="icon-search"></i>Search</button>
</form>
EDIT: решено!
Все нижеприведенные решения помогли, но я дал ответ на основной полезный комментарий. Я ценю всю помощь. Для всех, кто сталкивается с этим, это мой последний рабочий код:
<form action="{{ path('searchPeople') }}" method="post" class="form-inline">
{{ form_errors(form) }}
{{ form_errors(form.first_name) }}
{{ form_widget(form.first_name, {'attr': {'placeholder': 'First Name'} }) }}
{{ form_errors(form.last_name) }}
{{ form_widget(form.last_name, {'attr': {'placeholder': 'Last Name'} }) }}
{{ form_rest(form) }}
<br />
<button type="submit" class="btn btn-primary" /><i class="icon-search icon-white"></i>Search</button>
</form>
Ответы
Ответ 1
Если вы выведете поле с помощью form_rest, вам нужно установить метку для поля в false в построителе форм с чем-то вроде
$builder->add('first_name', 'text', array(
'label' => false,
));
Если вы выставляете поля отдельно, вы можете опустить форму_файла для этого поля в шаблоне ветки или установить ее в пустую строку.
{{ form_label(form.first_name, '') }}
Ответ 2
Я знаю, что он уже ответил, но может помочь кому-то, кто ищет другое решение для заполнителей, если вы не хотите ничего менять в своем шаблоне ветки:
$builder->add(
'name',
'text',
array(
'attr' => array(
'placeholder' => 'Your name',
),
'label' => false,
)
);
Ответ 3
Преобразование метки в местозаполнитель
{% use 'form_div_layout.html.twig' with widget_attributes as base_widget_attributes %}
{% block widget_attributes %}
{% set attr = {'placeholder': label|trans({}, translation_domain)} %}
{{- block('base_widget_attributes') -}}
{% endblock widget_attributes %}
Ответ 4
Я сделал это недавно!:) Вы хотите создать новый шаблон полей, для form_row и один для form_widget. Затем удалите часть form_label и добавьте ваш placeholder.
http://symfony.com/doc/current/cookbook/form/form_customization.html
Вы можете сделать это для каждого поля или установить его для всех.
Или вы также можете пропустить удаление form_label из шаблона form_row и просто сделать form_widget(), в котором вы сейчас вызываете form_row()
Ответ 5
для других, которые сталкиваются с этим вопросом-лейблом:
вы можете использовать тему формы, чтобы переопределить тег form_row для каждой формы. Однако я рекомендую просто установить его невидимым для оптимизации чтения страниц. мой пример с загрузкой:
{% block form_row %}
{% spaceless %}
{{ form_label(form, null, {'label_attr': {'class': 'sr-only'}}) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
{% endspaceless %}
{% endblock form_row %}
не забудьте включить вашу форму в config.yml и шаблон.
Ответ 6
Расширение ответа Léo:
{% use 'form_div_layout.html.twig' %}
{% block widget_attributes %}
{% spaceless %}
{% set attr = attr|merge({'placeholder': label}) %}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
trans
фильтр удален, потому что он включен в родительский.
Ответ 7
Symfony 2.8 и выше
-
Удалить form_label
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
-
Добавить атрибут заполнителя
{% block form_widget_simple %}
{% set type = type|default('text') %}
<input placeholder="{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}" type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
{% endblock form_widget_simple %}
Ответ 8
Вы должны отобразить форму вручную.
Вот пример:
<form id="form-message" action="{{ path('home') }}" method="post" {{ form_enctype(form) }}>
{{ form_label(form.name) }}
{% if form_errors(form.name) %}
<div class="alert alert-error">
{{ form_errors(form.name) }}
</div>
{% endif %}
{{ form_widget(form.name) }}
{{ form_row(form._token) }}
<input type="submit" class="btn" value="Submit">
</form>
Связанная документация
Ответ 9
Для тех, кто НЕ использует form_row
, вы всегда можете добавить placeholder как атрибут непосредственно при добавлении ввода в конструктор. Например:
$task = new Task();
$form = $this->createFormBuilder($task)
->add('first_name', 'text', array(
'required' => true,
'trim' => true,
'attr' => array('placeholder' => 'Lorem Ipsum')
)->getForm();
Ответ 10
Подводя итог:
Если вы используете параметр label_format
в своем *Type::configureOptions
, их решение не работает. Вам нужно добавить содержимое блока form_label
для обработки всех возможностей ярлыков.
Полный и наиболее эффективный ответ (используемый код w/symfony 3.3):
-
Удалить form_label
{% block form_row %}
<div>
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
-
Отредактируйте блок widget_attribute
{% block widget_attributes %}
{% spaceless %}
{% if label is not same as(false) -%}
{% if label is empty -%}
{%- if label_format is not empty -%}
{% set label = label_format|replace({
'%name%': name,
'%id%': id,
}) %}
{%- else -%}
{% set label = name|humanize %}
{%- endif -%}
{%- endif -%}
{% set attr = attr|merge({'placeholder': label}) %}
{%- endif -%}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
Примечания:
-
Не переводите метки в блок widget_attributes
, иначе они будут отображаться как отсутствующие переводы.
-
Решение не работает для флажков или переключателей, вам нужно добавить что-то вроде:
{%- block checkbox_widget -%}
{{ parent() }}
{{- form_label(form) -}}
{%- endblock checkbox_widget -%}