2011-07-07 14 views
20

これは機能しています。以下のアップデートを参照してください:Symfony2フォームエンティティアップデート

誰でも私にSymfony2フォームエンティティアップデートの具体的な例を教えてもらえますか?本書では、新しいエンティティの作成方法のみを示しています。私は最初にクエリ文字列上のエンティティのIDを渡す既存のエンティティを更新する方法の例が必要です。ここに私が現在持っているものはありますが、フォームが投稿されたときにエンティティを上書きするため、動作しません。私が理解していないことは、フォームを再作成せずに投稿をチェックするコードでフォームに再度アクセスする方法だと思います。フォームを再作成すると、エンティティを再度照会する必要があります。これは意味をなさないと思われます。

public function updateAction($id) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

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

     echo $testimonial->getName(); 

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      //$testimonial = $form->getData(); 
      echo 'testimonial: '; 
      echo var_dump($testimonial); 
      $em->persist($testimonial); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

UPDATE:現在作業中です。いくつか調整する必要がありました:

public function updateAction($id) 
{ 
    $request = $this->get('request'); 

    if (is_null($id)) { 
     $postData = $request->get('testimonial'); 
     $id = $postData['id']; 
    } 

    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

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

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 
+1

best practiceとして言及されています。あなたの問題についてもう少し明確にすることができますか?私はあなたが「エンティティを上書きするために...働かない」という意味についてはっきりしていません。 – Problematic

+0

証言を取得する関数の2行目は、渡された$ idに基づいてルックアップを試みます。 POSTが発生したときに見つからないので、$ testimonialにnullを返します。私はポストが発生したときに私のフォームで 'id'という名前のフィールドを探すために自分のコードを変更しようとしました。それは私をもう少し詳しく見ていたようですが、私のエンティティのIDがプライベートであることに不満を持ち、私のエンティティでsetId()メソッドを作成することを提案しました。どうやらコンソールはなんらかの理由で私のために作成していなかったようだ。 –

+0

これは機能しています。上記の更新を参照してください。 –

答えて

15

現在作業中です。

public function updateAction($id) 
{ 
    $request = $this->get('request'); 

    if (is_null($id)) { 
     $postData = $request->get('testimonial'); 
     $id = $postData['id']; 
    } 

    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

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

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 
10

これは実際のSymfony 2のネイティブ関数である:

あなたは自動的にコマンドラインからCRUDコントローラを生成することができます(教義経由:生成:CRUD)と再利用いくつかのことを微調整しなければなりませんでした生成されたコードここ

ドキュメント: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

+1

これは本当ですが、2つのコントローラアクションに分けています。 –

+1

私はこれが古い投稿だと知っていますが、私はちょうどそのことに感謝しなければなりませんでした!私はまだ愚か者のように私のCRUDコードを書いてここに座っていた!あなたの親切な先生に感謝! – iLikeBreakfast

1

symfonyのコマンドgenerate:doctrine:crudによって自動生成されたCRUDコードで簡単に見はDoctrineのエンティティであることをeditアクション

/** 
    * Displays a form to edit an existing product entity. 
    * 
    * @Route("/{id}/edit", name="product_edit") 
    * @Method({"GET", "POST"}) 
    */ 
    public function editAction(Request $request, Product $product) 
    { 
     $editForm = $this->createForm('AppBundle\Form\ProductType', $product); 
     $editForm->handleRequest($request); 
     if ($editForm->isSubmitted() && $editForm->isValid()) { 
      $this->getDoctrine()->getManager()->flush(); 
      return $this->redirectToRoute('product_edit', array('id' => $product->getId())); 
     } 
     return $this->render('product/edit.html.twig', array(
      'product' => $product, 
      'edit_form' => $editForm->createView(), 
     )); 
    } 

注以下のソースコードを示しますid(文字列または整数)の代わりにアクションに渡されます。これにより、暗黙のパラメータ変換が行われ、指定されたIDを持つ対応するエンティティを手動でフェッチしなくなります。

これは私が既存のエンティティを編集するために使用したコードに似ていますsymfonyのドキュメント