簡體   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