如何在 symfony2 的表单类中隐藏标签?
Posted
技术标签:
【中文标题】如何在 symfony2 的表单类中隐藏标签?【英文标题】:How do you hide labels in a form class in symfony2? 【发布时间】:2012-05-23 02:15:15 【问题描述】:我知道您可以在 twig 中拆分表单并选择不为特定字段呈现标签,但我不禁认为您必须能够从表单类中执行此操作。 options 数组中的 'label' 键可让您将此值更改为您喜欢的任何值,但传递 false 或空字符串只会返回字段名称(请参见下面将 'roles' 呈现为标签的示例)。
$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+ 版本的正确答案。 【参考方案1】:从 Symfony 2.2 开始,您可以使用 false
属性的 false
值来避免 <label>
渲染:
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('Name', null, array('label' => false))
;
Source
【讨论】:
谢谢。我最初问的是与 2.0.x 项目有关的问题,但由于我没有指定版本,我认为这是正确的答案。此外,由于它是新添加的,显然无法在表单类的早期版本中执行此操作,因此这有望帮助遇到类似问题的人。 @Mark 很有趣,从今天开始它在 2.0.x 中可用:symfony.com/blog/symfony-2-0-23-released(我发誓我与它无关:D) 哈。在那种情况下,这绝对是正确的答案。如果有人没有阅读 cmets 并将他们的整个应用程序升级到 2.2 只是为了获得这个很棒的功能,可能值得在你的答案中添加它:) 相关项——如果你想使用 html 5 占位符文本而不是标签,请在表单构建器数组之后使用 'attr' => array('placeholder'=>'Your Name')标签=>false。 最好将“视图”规范与“模型”分开。在下面添加了答案。【参考方案2】:将“视图”规范与“模型”分开
如果您按照接受的答案说:
$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 docs
【讨论】:
我完全同意这个补充。 但是,这样做有一个小缺点:如果您使用的是布局(例如 bootstrap_3_horizontal_layout),则可能会破坏它并出现渲染问题。我建议 OP 覆盖他的表单的布局(这很容易:cf. Symfony documentation) 您并不经常重复使用表单。不同的页面有不同的要求,通常你最终只会传入一个新的表单类和新的对象类。【参考方案3】:只需将 'label':false 添加到您的 form_row()
form_row(form.name, 'label':false)
【讨论】:
【参考方案4】:我不太明白你的问题,但以显示标签名称的形式,我个人喜欢这样:
$builder
->add('role', 'text')
在我的树枝上:
<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>
【讨论】:
【参考方案5】:要隐藏我的标签,我必须只渲染字段的小部件,而不是标签,例如
form_widget(edit_form.event)
form_rest(edit_form)
带有空格的 ' ' 标签的问题在于,它仍然呈现存在的 html 输入并影响页面。
【讨论】:
这种方式更好,因为它不会将“视图”规范放入模型中。如果您想保留错误,您可能还想添加 form_errors(form.name)
。【参考方案6】:
这应该可以工作(尽管它不是一个非常干净的解决方案)
$builder
->add('roles', 'entity', array(
'class' => 'Acme\UserBundle\Entity\Role',
'label' => ' '
));
(注意刻度之间的空间)
【讨论】:
谢谢你,但你会注意到我在问题中的代码 sn-p 下提到了这个解决方案以上是关于如何在 symfony2 的表单类中隐藏标签?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 messages.en.yml 翻译 symfony2 形式的标签?
如何在自定义 django 表单中隐藏 django 标签?