Как в симфони2 разбить заполнение формы на несколько шагов?

Столкнулся с задачей непосильной для себя, только учу симфони
процесс заказа разбит на несколько шагов
нужно как то сохранить данные с первых шагов и передать их в последующие
как это можно было бы сделать?
без использования дополнительных бандлов(там не нужна сложная логика)

<?php

namespace AppBundle\Controller;

use Symfony\Component\DomCrawler\Field\ChoiceFormField;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; //под вопросом
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

//use Timestampable\Fixture\Document\Book;

//функционал формы
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;

use AppBundle\Entity\Book;
use AppBundle\Form\BookType;
use Symfony\Component\HttpFoundation\Response;


class BookController extends Controller
{
    /**
     * @Route("/")
     */
    public function findAction(Request $request)
    {

        $book = new Book();

        //шаг первый - запоняем начальные поля
        $form = $this->createFormBuilder($book)
            ->add('date', DateTimeType::class, array('widget' => 'single_text'))
            ->add('fromBook', ChoiceType::class)
            ->add('toBook', ChoiceType::class)
            ->add('returnDate', DateTimeType::class, array('widget' => 'single_text'))
            ->add('returnFrom', ChoiceType::class)
            ->add('returnTo', ChoiceType::class)
            ->add('people')
            ->add('isReturn', CheckboxType::class)
            ->getForm();

        $form->handleRequest($request);

        if ($form->isSubmitted()) {

            // после отправки формы
            // здесь как то нужно записать наверное данные из формы
            // чтобы можно было использовать эти данные в следующем getcarsAction

            return $this->redirectToRoute('/step2');
        }

        return $this->render('AppBundle:Book:find.html.twig', array(
            'book' => $book,
            'form' => $form->createView(),
        ));

    }

    /**
     * @Route("/step2")
     */
    public function getcarsAction()
    {

        // здесь нужно получить данные с первого шага findAction
        // например записать данные в переменную $getTrips

        $getTrips = $step1; // как в $step1 получить данные - в этом суть вопроса

        if ($form->isSubmitted() && $form->isValid()) {

            return $this->redirectToRoute('/step3');
        }

        return $this->render('AppBundle:Book:cars.html.twig', array(
            'triplist' => $getTrips,
        ));
    }

    /**
     * @Route("/step3")
     */
    public function bookAction()
    {

    }

}
  • Вопрос задан
  • 491 просмотр
Решения вопроса 1
@dizzy7
Я бы сделал сущность, которая покрывает все поля из всех шагов и набор форм на каждый шаг. Между шагами вы сохраняете промежуточный результат в базу, на следующем извлекаете и передаёте форме с набором полей, соответствующим этому шагу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
aM-aM
@aM-aM
Люблю js
1) Советую логику Роутов перенести в routing.yml.
2) На каждом шагу обращаться к вашему методу "findAction" и в зависимости от приходящего $request вызывать метод обрабатывающий определенный шаг или лучше сделать StepController(еще один класс) и выполнять логику шагов в нём.
Ответ написан
@ivanovnickolay
А почему бы не использовать много страничную форму ??
Фактически все в одной форме для симфони, а для пользователя разбивка на этапы ..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы