繁体   English   中英

Symfony2:如何验证和保留一组实体(收集表单)?

[英]Symfony2 : How to validate and persist an array of entities (collection form)?

在我的应用程序中,我有一个嵌入表单集合的主表单。

我的目标是要有一个页面,在该页面上我具有一个网格形式,其中每一行都有一个Category实体的不同实例,并且在各行上分别包含value1value2value3字段。

我成功创建了Category表单类型,即Categories表单类型,它是Category表单的集合,页面中表单的呈现效果很好,并且表单中的值与持久化数据匹配。

这是代码:

Acme \\ APPBundle \\ Form \\ Type \\ Category.php ...

class CategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder -> add ( 'value1' , 'text' )
                 -> add ( 'value2' , 'text' )
                 -> add ( 'value3' , 'text' )
                 -> add ( 'id', 'hidden')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\APPBundle\Entity\Category',
        ));
    }

    public function getName()
    {
        return 'category';
    }
}
...

Acme \\ APPBundle \\ Form \\ Type \\ Category.php

class CategoriesType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('categories', 'collection', array('type' => new CategoryType()))
                ->add('save','submit');
    }


    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => false
        ));
    }

    public function getName()
    {
        return 'categories';
    }
}

Acme \\ APPBundle \\ Controller \\ MainController.php

public function categoriesAction ( ) {
    $em = $this -> getDoctrine ( ) -> getManager ( );

    $categories = $em->getRepository('Acme\APPBundle\Entity\Category')->findAll();

    $form = $this -> createForm ( new CategoriesType ( ) , array('categories'=>$categories) );
    $form -> handleRequest ( $this -> getRequest ( ) );

    if ( $form -> isValid ( ) ) {
        $em -> persist ( $form );
        $em -> flush ( );
    }

    return $this -> render (
        'AcmeAPPBundle:Admin:categories.html.twig' , 
        array ( 
            'form' => $form -> createView(),
        )
    );
 }

我现在的问题是我无法持久保存表单中的修改数据。 我的控制器中的$form -> isValid ( )返回false。 我尝试使用“手动”验证:

$validator = $this      -> get ( 'validator' );
$errorList = $validator -> validate ( $form );

但我没有任何错误,但表格仍被视为无效。 我还尝试绕过验证并直接保留数据,但是什么也没发生。

有什么线索吗? 谢谢

请尝试以下步骤以通过验证。,

  • 将数据类设置为CategoriesType形式。
  • 在类别实体的类别字段中添加“有效”约束,这也将验证子类。
  • 要进行调试,要打印子类中的错误,请尝试$ form-> getErrors(true)。
  • 使用$ em-> persist($ categories)进行级联的持久类别实体实例。 请注意,您不能保留表单对象。

这应该可以解决您的问题。

谢谢@ satdev86的建议。

缺少的可能是cascade_validation ,还有我试图保留$form而不是数据的事实。

这是我对可能感兴趣的人的代码:

Acme \\ APPBundle \\ Form \\ Type \\ Category.php

...
class CategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder -> add ( 'value1' , 'text' )
                 -> add ( 'value2' , 'text' )
                 -> add ( 'value3' , 'text' )
                 -> add ( 'id', 'hidden')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\APPBundle\Entity\Category',
            'csrf_protection' => false,
            'cascade_validation' => true,
        ));
    }

    public function getName()
    {
        return 'category';
    }
}
...

Acme \\ APPBundle \\ Form \\ Type \\ Categories.php

...
class CategoriesType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('categories', 'collection', array('type' => new CategoryType()))
                ->add('save','submit');
    }


    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => false,
            'csrf_protection' => false,
            'cascade_validation' => true,
        ));
    }

    public function getName()
    {
        return 'categories';
    }
}
...

Acme \\ APPBundle \\ Controller \\ MainController.php

...
public function categoriesAction ( ) {
    $em = $this -> getDoctrine ( ) -> getManager ( );

    $categories = $em->getRepository('Acme\APPBundle\Entity\Category')->findAll();

    $form = $this -> createForm ( new CategoriesType ( ) , array('categories'=>$categories) );
    $form -> handleRequest ( $this -> getRequest ( ) );

    if ( $form -> isValid ( ) ) {
        foreach($form -> getData()['categories'] as $c) {
            $em -> persist ( $c );
        }
        $em -> flush ( );
    }

    return $this -> render (
        'AcmeAPPBundle:Admin:categories.html.twig' , 
        array ( 
            'form' => $form -> createView(),
        )
    );
 }
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM