我正在使用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>
编辑:解决了! 以下所有解决方案都有所帮助,但我给出了主要有用评论的答案。我感谢所有的帮助。对于遇到此问题的其他人来说,这是我最后的工作代码:
<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>
答案 0 :(得分:60)
我知道它已经得到了解答,但如果你不想改变你的树枝模板中的任何内容,可能会帮助那些正在为占位符寻找不同解决方案的人:
$builder->add(
'name',
'text',
array(
'attr' => array(
'placeholder' => 'Your name',
),
'label' => false,
)
);
答案 1 :(得分:19)
如果您使用form_rest输出字段,则必须在表单构建器中将字段的标签设置为false,如
$builder->add('first_name', 'text', array(
'label' => false,
));
如果单独输出字段,则可以在树枝模板中省略该字段的form_label,或将其设置为空字符串。
{{ form_label(form.first_name, '') }}
答案 2 :(得分:5)
将标签转换为占位符
{% 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 %}
答案 3 :(得分:3)
我最近这样做了! :)您将要为form_row创建一个新的字段模板,为form_widget创建一个。然后删除form_label部分,并添加占位符。
http://symfony.com/doc/current/cookbook/form/form_customization.html
您可以为每个字段执行此操作,也可以为所有字段设置它。
或者您也可以跳过从form_row模板中删除form_label,然后执行form_widget(),其中您当前正在调用form_row()
答案 4 :(得分:3)
遇到此标签问题的其他人: 您可以使用表单主题覆盖所需的每个表单的form_row标记。但是我建议只为页面阅读器优化设置它不可见。我的bootstrap示例:
{% 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和模板中包含您的formtheme。
答案 5 :(得分:3)
对于那些不使用form_row
的用户,在将输入添加到构建器时,您始终可以直接将占位符添加为属性。像这样:
$task = new Task();
$form = $this->createFormBuilder($task)
->add('first_name', 'text', array(
'required' => true,
'trim' => true,
'attr' => array('placeholder' => 'Lorem Ipsum')
)->getForm();
答案 6 :(得分:3)
删除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 %}
答案 7 :(得分:2)
扩展Léo的回答:
{% use 'form_div_layout.html.twig' %}
{% block widget_attributes %}
{% spaceless %}
{% set attr = attr|merge({'placeholder': label}) %}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
trans
过滤器已被删除,因为它是included in the parent。
答案 8 :(得分:1)
您必须手动呈现表单。
以下是一个例子:
<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 :(得分:1)
就我而言,最好的是@Cethy和@Quolonel问题的混合提问者
{% form_theme form _self %}
{% use 'bootstrap_4_layout.html.twig' %}
{% block widget_attributes %} {# set placeholder #}
{% spaceless %}
{% set attr = attr|merge({'placeholder': label}) %}
{{ parent() }}
{% endspaceless %}
{% endblock widget_attributes %}
{% block form_row %} {# remove label #}
<div class="form-group">
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endblock form_row %}
看起来如下
它适用于翻译
答案 10 :(得分:0)
总结一下:
如果您使用label_format
中的*Type::configureOptions
选项,则其解决方案无效。您需要添加form_label
块的内容以处理所有标签可能性。
完整的&amp;最有效的答案(代码使用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 -%}
答案 11 :(得分:0)
您还可以在呈现表单之前将标签复制到占位符属性:
$formView = $form->createView();
foreach($formView->getIterator() as $item) {
/** @var $item FormView */
if ($item->vars['label']) {
$item->vars['attr']['placeholder'] =$item->vars['label'];
}
}