如何将类属性设置为 Symfony2 表单输入
Posted
技术标签:
【中文标题】如何将类属性设置为 Symfony2 表单输入【英文标题】:How to set a class attribute to a Symfony2 form input 【发布时间】:2011-10-07 18:26:35 【问题描述】:如何使用Symfony2
中的FormBuilder
将html
class
属性设置为表单<input>
?
类似这样的:
->add('birthdate', 'date',array(
'input' => 'datetime',
'widget' => 'single_text',
'attr' => array(
'class' => 'calendar'
)
))
form_widget(form.birthdate)
我想要这个 input
field 属性 class
设置为 日历
【问题讨论】:
【参考方案1】:您可以从 twig 模板中执行此操作:
form_widget(form.birthdate, 'attr': 'class': 'calendar' )
来自http://symfony.com/doc/current/book/forms.html#rendering-each-field-by-hand
【讨论】:
这真的不是问题的答案——FormBuilder 的重点是避免手动编码 Twig 模板。 @Acyra 这取决于...将大量与视图相关的内容放入表单构建器也不是最好的方法。 我同意,表单自定义应该存在于视图中,而不是控制器中。控制器应该尽可能轻巧,虽然 Symfony2 为您创建表单非常棒,而且可以节省大量时间,但当您使用“花哨”的 UI 时,有时表单构建器会妨碍您。 @numerah:旧评论,但对于可能看到您评论的其他人:是的,我们这样做!您可以使用'attr'
设置所有类型的属性。
@Acyra 表单主题模板怎么样?如果你想为你的所有表单保持一种风格,你必须这样做一次..【参考方案2】:
您可以使用 FormBuilder 来完成。将此添加到 FormBuilder 中的数组中:
'attr'=> array('class'=>'span2')
【讨论】:
这将类添加到包装 div 而不是输入【参考方案3】:如果您想在控制器内部设置属性,Acyra 的答案是正确的,但有很多不准确之处。
是的,您可以通过将attr
属性(在 2.1 版本中引入 here 和 here for the 2.0)直接使用 FormBuilder 来执行此操作,如下所示:
->add('birthdate', 'date',array(
'input' => 'datetime',
'widget' => 'single_text',
'attr' => array('class'=>'calendar')
))
“功能被破坏”的说法是不正确的。效果很好!
Symfony2 将 HTML class
属性应用于标签和输入是不正确的(至少从 2.1 版本开始)。
此外,由于attr
属性本身就是一个数组,因此您可以传递要为该字段呈现的任何HTML 属性。如果您想传递 HTML5 data-
属性,这将非常有帮助。
【讨论】:
【参考方案4】:您可以在表单类的选项中添加它:
public function configureOptions(OptionsResolver $resolver)
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\MyEntity',
'attr' => array(
'class' => 'form-horizontal'
)
));
【讨论】:
这应该是正确的答案,最好在表单类中而不是在树枝中这样做。【参考方案5】: form_widget(form.content, 'attr': 'class': 'tinyMCE', 'data-theme': 'advanced' )
【讨论】:
【参考方案6】:像这样:
form_widget(form.description, 'attr': 'class': 'form-control', 'rows': '5', 'style': 'resize:none;' )
【讨论】:
【参考方案7】:您可以在 Twig 或 FormClass 中执行此操作,如上面的示例所示。但是您可能想在控制器中决定您的表单应该获得哪个类。请记住,一般控制器中没有太多逻辑!
$form = $this->createForm(ContactForm::class, null, [
'attr' => [
'class' => 'my_contact_form'
]
]);
【讨论】:
【参考方案8】:呈现给定字段的 HTML 小部件。如果将此应用于整个表单或字段集合,则会呈现每个基础表单行。
# render a field row, but display a label with text "foo" #
form_row(form.name, 'label': 'foo')
form_row() 的第二个参数是一个变量数组。 Symfony 中提供的模板只允许覆盖上面示例中所示的标签。
请参阅“有关表单变量的更多信息”以了解 variables 参数。
【讨论】:
以上是关于如何将类属性设置为 Symfony2 表单输入的主要内容,如果未能解决你的问题,请参考以下文章