2012-02-06 4 views
0

я попробовать эту кулинарную книгу о встраивать форму:
http://symfony.com/doc/current/cookbook/form/form_collections.htmlSymfony2 Как обрабатывать динамические встраиваемые формы?

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

Здесь полный код: https://gist.github.com/1755140

Знаете ли вы, почему? Спасибо

Edit:: Моя беда была в форме процесса действия. Подобно тому, как форма тега внедряется динамически, поэтому я не знаю, сколько тегов у меня будет. Если я добавлю в 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() 
    ); 
} 

ответ

0

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

+0

Не совсем (но более читаемый) С другой стороны, если я добавляю $ tag1 = new Tag(); $ Задачи-> addTags ($ tag1); в createAction первая вставка была правильно сохранена, но не остальные! – acubens

0

Я не понимаю Tand. Неправильно ли это решение?

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

Это работает и кажется более простым.

+1

Извините, я не помню решение, я переключаюсь на Propel. Прокладывайте камни! – acubens

Смежные вопросы