0

レッスンと評価の 2 つのモデルがあります。各レッスンは複数の評価を持つことができます。

ユーザーがこのすべてのデータを同時に入力できるようにする埋め込みフォームを設定しようとしています。

データの追加と編集には問題なく機能しますが、評価を削除しようとすると問題が発生します。

たとえば、3 つの評価が添付されたレッスンがあります。次に、フォームをもう一度送信しますが、そのうちの 1 つを削除します。

コントローラーでは、最初に編集中のレッスンを取得し、次にその評価を取得してループし、ID を出力します。期待どおりに 3 つの ID が出力されます。

次に、リクエストをフォームにバインドし、有効かどうかを確認します。次に、評価を再度取得し、それらをもう一度ループして、それらが削除されたことを確認しますが、3 つの ID はすべてまだそこにありました!

生の POST データを印刷すると、2 つしかありません。

誰かが私が間違ったことを見ることができますか?

これが私のコントローラーコードです:

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()))

他のフォームが埋め込まれた新しいフォームクラスを作成する必要があります。

もう1つの方法は、投稿されたデータを手動で確認し、コントローラーで手動で評価を削除してから、レッスンを再度続行することです。

于 2013-01-31T01:03:26.617 に答える
0

私は以下を使用して回避しました:

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