当我在表单控制器中设置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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我想使用formType获得相同的效果时,它不会添加到表单中:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// not works
->setAttribute('attr', array('class' => 'form-horizontal'))
// not works either
->setAttribute('class', 'form-horizontal')
//...
Run Code Online (Sandbox Code Playgroud)
我做错了什么?如何使它工作?
这可以从几个地方完成:
$this->createForm从控制器调用的函数的参数.您只需知道哪个选项优先于另一个选项,以及它们如何工作.
选项1:这是设置默认选项的地方.如果没有其他设置值,则将使用此默认值.
示例实现(如Pivot提供):
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'attr' => array(
'class' => 'form-horizontal-from-default'
),
));
}
Run Code Online (Sandbox Code Playgroud)
选项2:您已经知道这一点,您可以在$this->createForm从控制器调用时提供attr值(这实际上是$this->container->get('form.factory')->create函数的快捷方式).提供此值时,将覆盖从上一个选项设置的值.
示例实现(如您所提供):
$this->createForm($formTypeObject, $entity, array(
'action' => 'URL,
'attr'=>array('class'=>'form-horizontal')
));
Run Code Online (Sandbox Code Playgroud)
选项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'],
));
}
Run Code Online (Sandbox Code Playgroud)
选项4 ::现在是设置属性的最终和最终方式.这比其他选项具有高度优先级,因为它在渲染表单的最后阶段完成.
您可以在模板中定义如下:
{{ form_start(form, {'method': 'POST', 'attr': {'class': 'form-horizontal-ultimate' }}) }}
Run Code Online (Sandbox Code Playgroud)