如何在 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' =&gt; true) 会在任何地方打开标签

如果您使用一个衬垫 form(form) 呈现您的表单,那么您应该看看symfony docs

【讨论】:

我完全同意这个补充。 但是,这样做有一个小缺点:如果您使用的是布局(例如 bootstrap_3_horizo​​ntal_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 形式的标签?

如何访问父类中的标签表单用户控件?

如何在xamarin表单ios中隐藏标签栏导航标题

如何在自定义 django 表单中隐藏 django 标签?

Javascript:单击提交按钮时如何将隐藏的输入标签附加到表单中?

如何覆盖 FOS 用户捆绑表单标签