如何在Symfony2中隐藏表单类中的标签?

53
我知道你可以在Twig中分离表单并选择不呈现特定字段的标签,但我认为您一定可以从表单类中完成此操作。选项数组中的“label”键允许您将此值更改为任何您喜欢的内容,但传递false或空字符串只返回字段名称(请参见以下示例,“角色”呈现为标签)。
$builder
            ->add('roles', 'entity', array(
                'class' => 'Acme\UserBundle\Entity\Role',
                'label' => '' 
            ));

$builder
            ->add('roles', 'entity', array(
                'class' => 'Acme\UserBundle\Entity\Role',
                'label' => false 
            ));

奇怪的是,传递一个空格(感觉非常不干净)似乎会呈现完全空的标签,即使在查看源代码时也没有空格。有人能够提供最佳方法的解释吗?甚至为什么空格似乎有效?


更正一下,Symfony 2.0.x 没有这种方法,但是 cheesemacfly 提供了正确的答案,适用于版本 2.2+。 - Mark
6个回答

121
自从Symfony 2.2版本起,您可以通过在

1
谢谢您。我最初是针对一个2.0.x项目提出了问题,但由于我没有指定版本,我认为这是正确的答案。此外,由于这是一个新的添加功能,在以前的版本中显然无法从表单类中完成,因此这将有助于遇到类似问题的人们。 - Mark
4
有趣的是,从今天开始,在2.0.x版本中也可以使用了:http://symfony.com/blog/symfony-2-0-23-released (我发誓我与此无关 :D) - cheesemacfly
哈。在这种情况下,这绝对是正确的答案。如果有人没有阅读评论并升级整个应用程序以获取这个神奇的功能,可能值得将其添加到您的答案中 :) - Mark
我错了,它被更改以解决另一个bug。抱歉… - cheesemacfly
2
相关项目--如果您想使用HTML 5占位符文本而不是标签,请在表单构建器数组中的label=>false之后使用'attr'=>array('placeholder'=>'Your Name')。 - Acyra
1
最好将“视图”规范与“模型”分开。下面附上答案。 - Chris

20

将您的“视图”规格与您的“模型”分离

如果您遵循所接受的答案,该答案表示:

$builder
        ->add('Name', null, array('label' => false))
    ;

您的表单不够可重用,特别是如果您的表单会出现在多个位置(或将来可能出现)。

如果您不想呈现表单标签,最好在 Twig 中这样做(假设您正在使用 Twig)。

而不是呈现 {{ form_row(form.name) }},分别渲染每个元素并排除 form_label

例如:

{{ form_errors(form.name) }}
 {# {{ form_label(form.name) }} <-- just dont include this #} 
{{ form_widget(form.name) }}
如果你希望在表单的某个实例中显示标签而在另一个实例中不显示,则只需添加{{ form_label(form.name) }},而改变array('label' => true)则会在所有地方都显示标签。
如果你使用一行代码{{ form(form) }}来渲染表单,则应该查看Symfony文档

1
我完全同意这个补充。 - moudug
1
然而,这样做有一个小缺点:如果您正在使用布局(例如bootstrap_3_horizontal_layout),则可能会破坏它并出现渲染问题。我建议OP覆盖他的表单布局(这很容易:参见Symfony文档)。 - moudug
不过,很少会重复使用表单。不同的页面有不同的要求,通常你只能得到一个新的表单类和新的对象类来传递。 - James

13

只需在您的 form_row() 中添加 {'label':false}。

{{ form_row(form.name, {'label':false}) }}

3
为了隐藏我的标签,我必须只渲染该字段的小部件,而不是标签,例如:
{{ form_widget(edit_form.event) }}
{{ form_rest(edit_form) }}

带有空格的 ' ' 标签存在的问题是,它仍会呈现出该处的HTML输入,并影响页面。


这种方式更好,因为它没有将“View”规范放在模型中。如果您想保留错误,也可以添加{{ form_errors(form.name) }} - Chris

3
我不太理解你的问题,但是为了显示标签名称,个人喜欢这样做:
  $builder
        ->add('role', 'text')

在我的twig中:
    <tr>
        <td>{{ form_widget(form.role) }} </td>
        <td>{{ form_label(form.role, "Name of Label") }}</td>
    </tr>
    <tr>
        <td>{{ form_errors(form.role) }}</td>
    </tr>

2

这个应该可以工作(虽然不是很干净的解决方案)

$builder
        ->add('roles', 'entity', array(
            'class' => 'Acme\UserBundle\Entity\Role',
            'label' => ' ' 
        ));

(注意反引号之间的空格)


谢谢您的回复,但是您会注意到我在问题中已经提到了这个解决方案。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接