我有两个模型,课程和评估。每节课可以进行多次评估。
我正在尝试设置一个嵌入式表单,允许用户同时输入所有这些数据。
它适用于添加和编辑数据,但如果我尝试删除评估,则会出现问题。
例如,我上了三节评估的课程。然后我再次提交表格,但其中一个已删除。
在控制器中,我首先得到正在编辑的课程,然后进行评估并循环浏览它们,打印ID。按预期打印三个ID。
接下来,我将请求绑定到表单并检查它是否有效。然后我再次进行评估并再次循环检查它们是否已被删除,但是所有三个ID仍然存在!
如果我打印原始POST数据,则只有两个。
有谁能看到我做错了什么?
这是我的控制器代码:
public function editAction($id = NULL)
{
$lesson = new Lesson;
if ( ! empty($id))
{
$lesson = $this->getDoctrine()
->getRepository('LessonBundle:Lesson')
->find($id);
}
foreach ($lesson->getEvaluations() as $evaluation)
{
print_r($evaluation->getId());
print_r('<br />');
}
$form = $this->createForm(new LessonType(), $lesson);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
foreach ($lesson->getEvaluations() as $evaluation)
{
print_r($evaluation->getId());
print_r('<br />');
}
die();
$em = $this->getDoctrine()->getEntityManager();
$em->persist($lesson);
$em->flush();
}
}
}
这是我的课程形式:
class LessonType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('evaluations', 'collection', array(
'type' => new EvaluationType(),
'allow_add' => true,
'by_reference' => false,
'allow_delete' => true,
));
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'LessonBundle\Entity\Lesson',
);
}
public function getName()
{
return 'Lesson';
}
}
最后,我的评估表:
class EvaluationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('report');
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'LessonBundle\Entity\Evaluation',
);
}
public function getName()
{
return 'Evaluation';
}
}
任何建议表示赞赏。
感谢。
答案 0 :(得分:1)
我认为您的表单没有与Class正确绑定。
在这里查看http://symfony.com/doc/2.0/cookbook/form/form_collections.html
表单应如下所示
$builder
->add('name lesson')
->add('evaluation', 'collection', array('type'=>new EvaluationsType()))
你需要创建一个嵌入了其他表单的新表单类。
另一种方法是手动检查发布的数据并在控制器中手动删除evalauation,然后再次保留课程
答案 1 :(得分:0)
我使用以下方式进入:
$lesson = $form->getData();