当我在表单控制器中设置CSS类并将其作为$ options数组元素传递时,它可以工作。
private function createEditForm(OrderCard $entity)
{
$form = $this->createForm(new OrderCardType($this->get('security.context')
->isGranted('ROLE_SUPER_ADMIN')), $entity, array(
'action' => $this->generateUrl('ordercard_update', array('id' => $entity->getId())),
'attr'=>array(
'class'=>'form-horizontal'
)
));
return $form;
}
但是当我想使用formType获得相同的效果时,它不会添加到表单中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// not works
->setAttribute('attr', array('class' => 'form-horizontal'))
// not works either
->setAttribute('class', 'form-horizontal')
//...
我做错了什么?如何使它工作?
答案 0 :(得分:9)
这可以在以下几个地方完成:
$this->createForm
函数的参数。您只需知道哪个选项优先于另一个选项,以及它们的工作方式。
选项1:以下是设置默认选项的位置。如果没有其他地方设置值,则将使用此默认值。
示例实施(提供 Pivot ):
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr' => array(
'class' => 'form-horizontal-from-default'
),
));
}
选项2:您已经知道这一点,您可以在从控制器调用$this->createForm
时提供attr值(这实际上是$this->container->get('form.factory')->create
函数的快捷方式)。提供此值时,将覆盖从上一个选项设置的值。
示例实施(提供 您 ):
$this->createForm($formTypeObject, $entity, array(
'action' => 'URL,
'attr'=>array('class'=>'form-horizontal')
));
选项3:您可以在此处设置或覆盖前两个选项设置的值。在 buildView 方法中设置值。在表单类型类中声明以下方法:
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$options['attr']['class'] = 'form-horizontal-from-build-view';
//If you like to keep value set from previous methods you can define like
//$options['attr']['class'] = isset($options['attr']['class'])? $options['attr']['class'] :'';
//$options['attr']['class'] .= ' form-horizontal-from-build-view';
$view->vars = array_replace($view->vars, array(
'attr' => $options['attr'],
));
}
选项4::现在是设置属性的最终和最终方式。这比其他选项具有高度优先级,因为它在渲染表单的最后阶段完成。
您可以在模板中定义如下:
{{ form_start(form, {'method': 'POST', 'attr': {'class': 'form-horizontal-ultimate' }}) }}
答案 1 :(得分:1)
将以下内容添加到OrderCardType类:
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr' => array(
'class' => 'form-horizontal'
),
));
}
答案 2 :(得分:0)
在Symfony 3之后,你可以使用:
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => $this->conf['entityClass'],
'attr' => array('class' => 'form-horizontal')
));
}