2017-12-05 21 views
0

後に私は私のデータベースに新しい処方を追加するためのフォームを、マルチステップフォームとフラッシュを持っています。最初のステップは、処方者に関する様々な情報を知らせることです。同様の処方は、(第二の形で第二ステップ)、それを追加する前に存在する場合Symfony3:前方

はその後、私がチェックし、存在する場合、私は確認するようユーザーに尋ねます。要するに

、Iは重複に応じて、1段形または2ステップの形態を有します。

私はCraueFormFlowBundleと試みたが、私は条件付き第二のステップを実装する方法がわかりません。私のテストは決定的ではなかった。だから、私は、コントローラにメソッドを前方に使用することを決めた、と私はそれが好き!

しかし、私は(転送後)第二段階の終わりに私の処方を洗い流すために管理することはできません、私はこのエラーがあります:Unable to guess how to get a Doctrine instance from the request information for parameter "prescriber".

addAction(=ステップ1)

/** 
* Add a new prescriber 
* 
* @Route("/prescribers/add", name="prescriber_add") 
*/ 
public function addAction(Request $request) { 
    $em = $this->getDoctrine()->getManager(); 
    $rp = $em->getRepository('AppBundle:Prescriber'); 
    $p = new Prescriber(); 

    // build the form 
    $form = $this->createForm(AddPrescriberType::class, $p); 

    // handle the submit 
    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()) { 
     # search if a prescriber already exists 
     $qb = $rp->createQueryBuilder('p'); 
     $qb->where($qb->expr()->eq('p.rpps', ':rpps')) 
      ->orWhere($qb->expr()->andX(
       $qb->expr()->like('p.lastname', ':name'), 
       $qb->expr()->like('p.firstname', ':firstname') 
      )) 
      ->setParameter('rpps', $p->getRpps()) 
      ->setParameter('name', '%'.$p->getLastname().'%') 
      ->setParameter('firstname', '%'.$p->getFirstname().'%'); 

     $duplicates = $qb->getQuery()->getArrayResult(); 

     # there are duplicates 
     if (!empty($duplicates)) { 
      $em->persist($p); 

      // confirm the addition of the new prescriber 
      $params = array('prescriber' => $p, 'duplicates' => $duplicates); 
      $query = $request->query->all(); 
      return $this->forward('AppBundle:Prescriber:addConfirm', $params, $query); 

     } else { 
      $em->persist($p);  # save the prescriber 
      $em->flush();   # update database 

      $this->addFlash('p_success', 'The prescriber has been created successfully'); 
      return $this->redirectToRoute('prescriber'); 
     } 
    } 

    // show form 
    return $this->render('prescribers/form-step1.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

addConfirmAction(=ステップ2)

/** 
* Confirm addition of a new prescriber 
* 
* @Route("/prescribers/add/confirm", name="prescriber_add_confirm") 
*/ 
public function addConfirmAction(Prescriber $prescriber, $duplicates, Request $request) { 
    $em = $this->getDoctrine()->getManager(); 

    $form = $this->createFormBuilder()->getForm(); 

    if ($form->handleRequest($request)->isValid()) { 
     $em->persist($prescriber); 
     $em->flush(); 

     $this->addFlash('p_success', 'Prescriber has been created successfully'); 
     return $this->redirectToRoute('prescriber'); 
    } 

    // show confirm page 
    return $this->render('prescribers/form-step2.html.twig', array(
     'h1_title' => 'Ajouter un nouveau prescripteur', 
     'form'  => $form->createView(), 
     'p'   => $prescriber, 
     'duplicates'=> $duplicates 
)); 
} 

私はこの問題は、Fが来ると思います私は2つのフォームの提出を持っているという事実をROMに...

+0

については

これは答えとして、それを書いて、答えとしてそれをマークしてください。 –

答えて

0

私はセッションを使って解決策を見つけました。 (私はそれが完璧な方法ではないと知っているが、私は他のものを見つけられませんでした)symfonyの3.3.*

あなたが解決した場合は
use Symfony\Component\HttpFoundation\Session\SessionInterface; 

public function addAction(Request $request, SessionInterface $session) { 
    // [...] 

    # there are duplicates 
    if (!empty($duplicates)) { 
     $data = $form->getData(); 
     $session->set('prescriber', $data); 
     $session->set('duplicates', $duplicates); 

     return $this->forward('AppBundle:Prescriber:addConfirm'); 

    // [...] 
} 

public function addConfirmAction(Request $request, SessionInterface $session) { 
    $em = $this->getDoctrine()->getManager(); 
    $p = $session->get('prescriber'); 
    $duplicates = $session->get('duplicates'); 

    // empty form with only a CSRF field 
    $form = $this->createFormBuilder()->getForm(); 

    if ($form->handleRequest($request)->isValid()) { 
     $em->persist($p); 
     $em->flush(); 

     $this->addFlash('p_success', 'The prescriber has been created successfully'); 
     return $this->redirectToRoute('prescriber'); 
    } 

    // show confirm page 
    return $this->render('prescribers/form-step2.html.twig', array(
     'form'  => $form->createView(), 
     'prescriber'=> $p, 
     'duplicates'=> $duplicates 
    )); 
} 
+0

はどのように戻るボタンを処理したのか? – utkarsh2k2