[英]Symfony2 : How to validate and persist an array of entities (collection form)?
在我的應用程序中,我有一個嵌入表單集合的主表單。
我的目標是要有一個頁面,在該頁面上我具有一個網格形式,其中每一行都有一個Category
實體的不同實例,並且在各行上分別包含value1
, value2
, value3
字段。
我成功創建了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 );
但我沒有任何錯誤,但表格仍被視為無效。 我還嘗試繞過驗證並直接保留數據,但是什么也沒發生。
有什么線索嗎? 謝謝
請嘗試以下步驟以通過驗證。,
這應該可以解決您的問題。
謝謝@ 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.