Symfony3: многоступенчатая форма и сброс после пересылки

У меня есть форма для добавления нового врача в мою базу данных. Первый шаг состоит в информировании различной информации о назначающем враче.

Затем я проверяю, есть ли похожие прописывающие, прежде чем добавить его (2-й шаг со 2-й формой), и если есть, я прошу пользователя подтвердить.

Короче говоря, у меня есть форма с одним или двумя шагами, в зависимости от дубликатов.

Я пытался использовать CraueFormFlowBundle, но не знаю, как реализовать мой условный второй шаг. Мои тесты были безрезультатными. Поэтому я решил использовать прямой метод в своем контроллере, и мне это нравится!

Но у меня не получается сбросить прописку в конце 2-го шага (после переадресации), у меня такая ошибка: Unable to guess how to get a Doctrine instance from the request information for parameter "prescriber".

добавить действие (= шаг 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
  ));
}

Я думаю, что проблема связана с тем, что у меня есть 2 формы отправки...


person Eve    schedule 05.12.2017    source источник
comment
Если вы решили это, пожалуйста, напишите это как ответ и отметьте его как отвеченный.   -  person Jake N    schedule 06.12.2017


Ответы (1)


Я нашел решение, используя сеанс. (знаю, что это не идеальный способ, но другого я не нашел)

Для 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
    ));
}
person Eve    schedule 18.01.2018
comment
Как ты разобрался с кнопкой назад? - person utkarsh2k2; 17.02.2018