2012-04-09 4 views
0

私のコードで何が間違っていますか? URLに応じてMoteurオブジェクトを更新または挿入したいとします。
ありがとうございます。 PHP5がネイティブに参照によってオブジェクトを渡すようsymfony2コントローラでフォームを更新または挿入しようとしています

/** 
* @Route("/moteur/{moteurid}", name="moteur", requirements={"moteurid" = "\d+"}, defaults={"moteurid" = null}) 
* @Template() 
* 
* Cette page permet d'enregistrer de nouveaux moteurs (et de les éditer). 
*/ 
public function moteurAction($moteurid) 
{ 
    $args=array(); 
    $avertissement = null; 
    if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) 
    { 
     $avertissement = "Vous n'avez pas le droit d'accéder à cet espace."; 
     return $this->redirect($this->generateUrl('index', array('avertissement' => $avertissement))); 
    } 

    $args['menu']['admin'] = 'selected'; 
    $obj = null; 
    if ($moteurid == null) 
    { 
     $obj = new Moteur(); 
    } 
    else 
    { 
     $obj = $this->getDoctrine()->getRepository('CreasixtineAFBundle:Moteur')->find($moteurid); 
    } 
    $form = $this->createForm(new FormMoteur(), $obj); 
    $args['form'] = $form->createView(); 

    if ($this->getRequest()->getMethod() == 'POST') 
    { 
     $form->bindRequest($this->getRequest()); 

     if ($form->isValid()) 
     { 
      $obj = $form->getData(); // Type Moteur() 
      $pn = $obj->getPnid(); 

      $em = $this->getDoctrine()->getEntityManager(); 
      if ($moteurid == null) 
      { 
       $em->persist($obj); 
       $avertissement = "Moteur créé !"; 
      } 
      else 
      { 
       // Rien, le moteur sera mis à jour avec flush() 
       $avertissement = "Moteur mis à jour !"; 
      } 
      foreach ($pn as $my_pn){$em->persist($my_pn);} 
      $em->flush(); 

      return $this->redirect($this->generateUrl('admin', array('avertissement' => $avertissement))); 
     } 
     else 
     { 
      throw new Exception("Le formulaire n'est pas valide."); 
     } 
    } 

    $contenu = $this->rendu($args, "formulaire_moteur.html.twig"); 
    return $contenu; 
} 

答えて

1

まず、あなたは、この行は必要ありません。

$obj = $form->getData(); // Type Moteur() 

はその後、MoteurとPnの間のあなたの関係は少し混乱しています。 getPnid()でPnを取得しますが、永続化したいオブジェクトがありますか?とにかく、これらのPnのオブジェクトはので、ここで、Moteur前に永続化する必要がある

は私が書くだろうかです:あなたは非常に多くの

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

    $pn = $obj->getPnid(); 

    //Persist these related objects BEFORE Moteur 
    foreach ($pn as $my_pn) 
    { 
     $em->persist($my_pn); 
    } 

    if ($moteurid == null) 
    { 
     $em->persist($obj); 
     $avertissement = "Moteur créé !"; 
    } 
    else 
    { 
     // Rien, le moteur sera mis à jour avec flush() 
     $avertissement = "Moteur mis à jour !"; 
    } 
    $em->flush(); 

    return $this->redirect($this->generateUrl('admin', array('avertissement' => $avertissement))); 
} 
else 
{ 
    throw new Exception("Le formulaire n'est pas valide."); 
} 
+0

ありがとう! – Creasixtine

+0

しかし、関連するすべてのエンティティに「カスケード:[すべて]」を許可する場合はどうすればよいですか?私はそれをこのように動作させることはできません、私は "SQLSTATE [23000]:整合性制約違反:1062重複エントリ"を取得します。 – linuxatico

関連する問題