Symfony отправьте несколько связанных форм - PullRequest
0 голосов
/ 02 мая 2019

Я хочу создать CRUD с несколькими Entites и, таким образом, несколькими формами.Если вы хотите создать сайт, у каждого создаваемого сайта должен быть 1 адрес, для каждого адреса нужен 1 город, для каждого города требуется 1 страна Relation

Итак, у меня есть контроллер, где яназывается my Type

/**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $adresse = new Adresse();
       $ville = new Ville();
       $pays = new Pays();
       $form = $this->createForm(SiteType::class, $site);
       $form2 = $this->createForm(AdresseType::class, $adresse);
       $form3 = $this->createForm(VilleType::class, $ville);
       $form4 = $this->createForm(PaysType::class, $pays);
       $form->handleRequest($request);
       $form2->handleRequest($request);
       $form3->handleRequest($request);
       $form4->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           && $form2->isSubmitted() && $form2->isValid()
           && $form3->isSubmitted() && $form3->isValid()
           && $form4->isSubmitted() && $form4->isValid()){
           $this->em->persist($site);
           $this->em->persist($adresse);
           $this->em->persist($ville);
           $this->em->persist($pays);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');
           return $this->redirectToRoute('admin.sites.index');
       }
       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
           'form2' => $form2->createView(),
           'form3' => $form3->createView(),
           'form4' => $form4->createView(),
       ]);
   }

и Twig для генерации представления.

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">

                    {{ form_start(form) }}
                        {{ form_widget(form) }}


                    {{ form_start(form2) }}
                    {{ form_widget(form2) }}

                    {{ form_start(form3) }}
                    {{ form_widget(form3) }}

                    {{ form_start(form4) }}
                    {{ form_widget(form4) }}

                    <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}{{ form_end(form2) }}{{ form_end(form3) }}{{ form_end(form4) }}
                </div>
            </div>
        </div>
    </div>

Мой вопрос следующий: как, когда я создам свой сайт, я мог бы связать site_idи address_id и так adress_id и city_id, city_di и страна _id?без отдельных моих форм?Я имею в виду, когда я нажимаю кнопку, связь будет создана правильно.

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Вот как вы должны и могли бы достичь этого: Вы должны использовать встроенную форму Как встроить формы

Вы просто создаете типы форм для своих сущностей: SiteType, AdresseType, VilleType, PaysType и встраиваете их, как показано ниже

// in SiteType
    //....
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('adresse', AdresseType::class)
         ;
    }
// in AdresseType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('ville', VilleType::class)
         ;
    }
// in VilleType
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
             //...
             ->add('pays', PaysType::class)
         ;
    }

Наконец, в вашем контроллере все, что вам нужно сделать, это создать

   /**
    * @Route("admin/sites/new", name="admin.sites.new")
    * @param Request $request
    * @return RedirectResponse|Response
    */
   public function new (Request $request)
   {
       $site = new Site();
       $form = $this->createForm(SiteType::class, $site);
       $form->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()
           $this->em->persist($site);
           $this->em->flush();
           $this->addFlash('success', 'Site crée avec succès');

           return $this->redirectToRoute('admin.sites.index');
       }

       return $this->render('admin/sites/create.html.twig', [
           'site' => $site,
           'adresse' => $adresse,
           'ville' => $ville,
           'pays' => $pays,
           'form' => $form->createView(),
       ]);
   }

И соответствующая веточка:

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">
                    {{ form_start(form) }}
                        {{ form_widget(form) }}

                        <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>

Обратите внимание, что для того, чтобы он работал, вам необходимо использовать каскад внутри метаданных вашей сущности, например:

/**
 * @ORM\OneToOne(targetEntity="AppBundle:Adresse", cascade={"all"})
 */
private $adresse;
0 голосов
/ 02 мая 2019

Вы должны использовать формы для вставки: https://symfony.com/doc/current/form/embedded.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...