填充了未发布数据的模型

时间:2013-01-30 18:26:49

标签: forms symfony doctrine-orm

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

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

它适用于添加和编辑数据,但如果我尝试删除评估,则会出现问题。

例如,我上了三节评估的课程。然后我再次提交表格,但其中一个已删除。

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

任何建议表示赞赏。

感谢。

2 个答案:

答案 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();