Symfony2 Как обработать динамическое встраивание коллекции форм - PullRequest
0 голосов
/ 07 февраля 2012

Я пробую эту кулинарную книгу о форме встраивания:
http://symfony.com/doc/current/cookbook/form/form_collections.html

Но внешний ключ встраивания (поле task_id в таблице тегов) не сохраняется, всегда NULL

Вот полный код: https://gist.github.com/1755140

Знаете почему?Спасибо

Редактировать: : Моя проблема была в процессе действия формы.Как форма тега встроена динамически, поэтому я не знаю, сколько тегов у меня будет.Если я добавлю в createAction

$tag1 = new Tag();
$task->addTags($tag1);

, правильно сохранится только первая форма для встраивания!Как сохранить другие теги?

public function createAction(Request $request) 
{ 
    $task = new Task();
    $tag1 = new Tag();
    $task->addTags($tag1);

    $form    = $this->createForm(new TaskType(), $task);        
    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($task);
        $em->flush();

        return $this->redirect($this->generateUrl('new_task', array('id' => $task->getId())));   
    }

    return array(
        'form'   => $form->createView()
    ); 
}

Edit2:

Мое решение, которое решает проблему, что вы об этом думаете?Лучше?

public function createAction(Request $request)
{ 
        $task = new Task();
        $tasks = $request->request->get('task', array());
        if (isset($tasks['tags'])) {
            $tags = $tasks['tags'];
            foreach($tags as $tag) {
                $tag = new Tag();
                $task->addTags($tag);
            }
        }

        $form = $this->createForm(new TaskType(), $task);        
        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($task);
            $em->flush();

            return $this->redirect($this->generateUrl('new_task', array('id' => $task->getId())));   
        }

        return array(
            'form'   => $form->createView()
        );
}

Edit3:

Гораздо лучшая альтернатива (больше не тестировалась)
http://www.siteduzero.com/tutoriel-3-523899-creer-des-formulaires-avec-symfony2.html#ss_part_2

public function createAction(Request $request)
{ 
    $task = new Task();
    $form = $this->createForm(new TaskType(), $task);        
    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($task);
        foreach($task->getTags() as $tag) {
            $em->persist($tag);
        }
        $em->flush();

        return $this->redirect($this->generateUrl('new_task', array('id' => $task->getId())));   
    }

    return array(
        'form'   => $form->createView()
    );
}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Я не понимаю.Это решение неверно?

if ($form->isValid()) {
    $em = $this->getDoctrine()->getEntityManager();
    foreach($task->getTags() as $tag) {
        $tag->setTask($task);
    }
    $em->persist($task);
    $em->flush();

    return $this->redirect($this->generateUrl('new_task', array('id' => $task->getId())));   
}

Это работает и кажется проще.

0 голосов
/ 07 февраля 2012

В TaskController в строке 29 попробуйте использовать $task->addTags($tag1); вместо $task->getTags()->add($tag1);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...