Symfony2表单类型 - 如何将表单CSS类设置为属性?

时间:2014-04-06 12:01:28

标签: css forms symfony

当我在表单控制器中设置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')
//...

我做错了什么?如何使它工作?

3 个答案:

答案 0 :(得分:9)

这可以在以下几个地方完成:

  1. 在表单类型类
  2. setDefaultOptions 方法中定义
  3. 作为从控制器调用的$this->createForm函数的参数。
  4. 在Form Type类的 buildView 方法中定义
  5. 在渲染表单时的模板中
  6. 您只需知道哪个选项优先于另一个选项,以及它们的工作方式。

    选项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')
    ));
}