2017-12-05 4 views
0

Ich habe ein Formular, um einen neuen Verschreiber in meiner Datenbank hinzuzufügen. Der erste Schritt besteht darin, die verschiedenen Informationen über den Verschreiber zu informieren.Symfony3: multi-steps form und flush nach vorwärts

Dann überprüfe ich, ob es ähnliche Verschreiber gibt, bevor Sie es hinzufügen (2. Schritt mit einem 2. Formular) und wenn es welche gibt, bitte ich den Benutzer zu bestätigen.

Kurz gesagt, ich habe ein 1-Schritt-Formular oder ein 2-Schritte-Formular, abhängig von Duplikaten.

Ich versuchte mit CraueFormFlowBundle, aber ich weiß nicht, wie ich meinen bedingten zweiten Schritt implementiere. Meine Tests waren nicht eindeutig. Also entschied ich mich, die Vorwärts-Methode in meinem Controller zu verwenden, und ich mag es!

Aber ich kann nicht verwalten meinen Arzt am Ende des zweiten Schrittes zum Spülen (nach Weiterleitung), ich habe diesen Fehler: Unable to guess how to get a Doctrine instance from the request information for parameter "prescriber".

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

denke ich, das Problem f kommt aus der Tatsache, dass ich 2 Formulare Einreichungen habe ...

+0

Wenn Sie diese gelöst haben, schreiben Sie es bitte als Antwort und markieren als beantwortet. –

Antwort

0

Ich fand eine Lösung mit der Sitzung. (Ich weiß es nicht eine perfekte Art und Weise, aber ich nicht andere gefunden)

Für 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

Wie sind Sie mit der Zurück-Schaltfläche verfahren? – utkarsh2k2