Symfony2表单生成器 - 删除标签,使其占位符

时间:2013-06-07 22:07:39

标签: php symfony

我正在使用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>

12 个答案:

答案 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)

Symfony 2.8&amp;上述

  1. 删除form_label

    {% block form_row %}
    <div>
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
    {% endblock form_row %}
    
  2. 添加占位符属性

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

Related documentation

答案 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 %}

看起来如下

enter image description here

它适用于翻译

答案 10 :(得分:0)

总结一下:

  • Titi的回答是最简单的;

  • MickLéo&amp; Quolonel的答案是最有效但不完整的(对于symfony&gt; 2.6):

如果您使用label_format中的*Type::configureOptions选项,则其解决方案无效。您需要添加form_label块的内容以处理所有标签可能性。 完整的&amp;最有效的答案(代码使用w / symfony 3.3):

  1. 删除form_label

    {% block form_row %}
    <div>
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
    {% endblock form_row %}
    
  2. 修改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 %}
    
  3. 备注

    • 请勿将标签翻译成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'];
    }
}