0

私のコードで何が問題になっていますか? MoteurURLに応じてオブジェクトを更新または挿入したい。
事前に感謝します。

/**
* @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;
}
4

1 に答える 1

1

まず、PHP5 は参照渡しでオブジェクトをネイティブに渡すため、次の行は必要ありません。

$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.");
}
于 2012-04-18T09:22:13.950 に答える