0

我有两个模型,课程和评估。每节课可以有多个评价。

我正在尝试设置一个嵌入式表单,允许用户同时输入所有这些数据。

它可以很好地添加和编辑数据,但是如果我尝试删除评估,我会遇到问题。

例如,我有一堂课附有三个评估。然后我再次提交表单,但其中一个被删除。

在控制器中,我首先得到正在编辑的课程,然后得到它的评估并循环通过它们,打印 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';
    }
}

任何建议表示赞赏。

谢谢。

4

2 回答 2

1

我认为您的表格未与班级正确绑定。

看看这里http://symfony.com/doc/2.0/cookbook/form/form_collections.html

表格应该是这样的

$builder
    ->add('name lesson')
    ->add('evaluation', 'collection', array('type'=>new EvaluationsType()))

您需要创建一个嵌入其他表单的新表单类。

另一种方法是手动检查发布的数据并在控制器中手动删除评估,然后再次持久化课程

于 2013-01-31T01:03:26.617 回答
0

我通过使用:

$lesson = $form->getData();
于 2013-01-31T17:22:00.043 回答