[英]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.