Bagaimana cara mengirimkan & mempertahankan formulir Symfony dan formulir bersarang opsional?

Saya menggunakan dua tipe formulir untuk satu halaman di proyek Symfony saya. Saya melakukan ini untuk membiarkan pengguna memutuskan antara dua opsi untuk membuat dokumen baru tipe formulir

Bagaimana halaman dibuat: ada beberapa kolom teks yang harus diisi. Semuanya milik DocumentCreateType saya dan juga menyertakan bagian pilihan yang tepat (pilih IATA secara manual) yang dapat Anda lihat di gambar. Jenis formulir kedua saya (UploadProfileType) berisi tiga tarik-turun yang sama ditambah satu tarik-turun tambahan (pasar, saluran1, dan produk) tetapi berada di situs pilihan sebelah kiri (gunakan profil unggahan).

Jadi bergantung pada apa yang dipilih pengguna, hanya DocumentCreateType yang harus dikirimkan, atau kedua tipe formulir harus dikirimkan dan dipertahankan.

Bagaimana saya bisa membuat ini berfungsi di Kontroler saya? Sejauh ini Pengontrol saya terlihat seperti itu tetapi datanya tidak disimpan dengan benar

  $upForm = $this->createForm(UploadProfileType::class, $document, array('user' => $currentuser));
    $form = $this->createForm(DocumentCreateType::class, $document);

      $form->handleRequest($request);
     $upForm->handleRequest($request); 

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

ChoiceType untuk pilihan antara profil unggahan dan IATA terlihat seperti itu dan ditangani oleh javascript:

  $builder

        ->add('use_upload_profile', ChoiceType::class, array(
                  'choices' => array(
                      true => 'label.use_upload_profile',
                      false => 'label.select_iatas_manually'
                  ),
                  'mapped' => false,
                  'expanded' => true,
                  'label' => false,
                  'data' => true,
                  'translation_domain' => 'Documents'))

            ;
          }

person sonja    schedule 19.12.2017    source sumber
comment
Buat tombol radio sederhana di tampilan Anda dan di Kontroler Anda, periksa mana yang dipilih dan lakukan hal-hal dengan jawabannya...   -  person Smaïne    schedule 19.12.2017
comment
@Smaïne jawaban yang mana? atau hal apa yang kamu maksud?   -  person sonja    schedule 19.12.2017


Jawaban (2)


Berbagai bentuk

Di HTTP Anda hanya dapat mengirimkan satu formulir berdasarkan permintaan.

Buat titik akhir untuk setiap pengiriman formulir di mana Anda hanya mengirimkan satu formulir.

Buat Dokumen A -> createADocumentAction()

Buat Dokumen B -> buatBDocumentAction()

Satu formulir dengan segalanya

Jika Anda memanggil formulir ke sekumpulan data tetapi semuanya dikirimkan dengan satu permintaan, Anda harus membuat Symfony From (Tipe) yang memiliki semua data dari dua formulir symfony yang ingin Anda kirimkan.

person albert    schedule 19.12.2017
comment
Saya tidak dapat menggunakan satu formulir, karena saya menggunakan EntityTypes dari entitas yang sama di dua formulir saya. Dengan hanya satu formulir saya tidak akan dapat memiliki dua dropdown untuk entitas yang sama.. cara beberapa formulir tampaknya sangat mubazir karena ini hanya satu bagian kecil dari tindakan.. - person sonja; 19.12.2017
comment
Anda dapat memiliki dropdown sebanyak yang Anda inginkan dalam sebuah formulir. Tidak peduli jenis entitas apa mereka. - person albert; 20.12.2017
comment
tidak, saya tidak dapat memiliki dua dropdown dari Entitas yang sama. Saya tidak perlu memasarkan dropdown - person sonja; 20.12.2017
comment
Silakan unggah formulir pertanyaan Anda dan saya akan memperbarui kode untuk memiliki banyak dropdown. - person albert; 20.12.2017

Anda tidak dapat mengirimkan dua formulir sekaligus, bisa salah satunya. Jadi saya sarankan Anda membuat dua formulir berbeda:

  • Yang pertama akan dikirimkan ketika "Gunakan profil unggahan" dipilih

  • Yang kedua akan dikirimkan ketika "Pilih IATA secara manual" dipilih

Di setiap formulir Anda memerlukan semua data untuk diserahkan. Jika Anda ingin menghindari kode duplikat di FormType, Anda bisa membuat Tipe Formulir Kustom (tidak terkait dengan entitas):

<?php
// src/AppBundle/Form/Custom/CustomFormType.php

namespace AppBundle\Form\Custom;

use Symfony\Component\Form\Extension\Core\Type\FormType;

class CustomFormType
{
    /**
     * Create the 'upload profile' custom form (not associated to a class)
     * 
     * @param type $formFactory
     * @param type $defaultData
     * @return type
     */
    public function createUploadProfileCustomForm($formFactory, $defaultData)
    {
        /* Create the 'upload profile' form (not associated to a class) */
        $form = $formFactory->createBuilder(FormType::class, $defaultData, array());

        $this->addMarkets($form);
        $this->addChannel1($form);
        $this->addProducts($form);

        /* Add whatever other field necessary */
        $form->add(...);

        /* Return the form */
        return $form->getForm();
    }

    /**
     * Create the 'select IATA manually' custom form (not associated to a class)
     * 
     * @param type $formFactory
     * @param type $defaultData
     * @return type
     */
    public function createSelectIATAManuallyCustomForm($formFactory, $defaultData)
    {
        /* Create the 'select IATA manually' form (not associated to a class) */
        $form = $formFactory->createBuilder(FormType::class, $defaultData, array());

        $this->addMarkets($form);
        $this->addChannel1($form);
        $this->addProducts($form);

        /* Add whatever other field necessary */
        $form->add(...);

        /* Return the form */
        return $form->getForm();
    }

    protected function addMarkets($form)
    {
        $form->add('markets', ...
            /* To complete */
        );
    }

    protected function addChannel1($form)
    {
        $form->add('channel1', ...
            /* To complete */
        );
    }

    protected function addProducts($form)
    {
        $form->add('products', ...
            /* To complete */
        );
    }
}

Untuk menangani kedua formulir di pengontrol:

/* Create the 'upload profile' form (not associated to a class) */
$defaultDataUP = array(...);
$customFormTypeUP = new CustomFormType();
$formUploadProfile = $customFormTypeUP->createUploadProfileCustomForm($this->get('form.factory'), $defaultDataUP);
$formUploadProfile ->handleRequest($request);

/* Create the 'select IATA manually' form (not associated to a class) */
$defaultDataSM = array(...);
$customFormTypeSM = new CustomFormType();
$formSelectManually = $customFormTypeSM->createSelectIATAManuallyCustomForm($this->get('form.factory'), $defaultDataSM);
$formSelectManually ->handleRequest($request);

/* If the user selected 'upload profile' and submitted the associated form */
if ($formUploadProfile->isSubmitted() && $formUploadProfile->isValid()) {

    /* Do some action, persist to database, etc. */

    /* Then redirect the user */
    return new RedirectResponse(...);
}
/* Else, if the user selected 'select manually' and submitted the associated form */
elseif ($formSelectManually->isSubmitted() && $formSelectManually->isValid()) {

    /* Do some action, persist to database, etc. */

    /* Then redirect the user */
    return new RedirectResponse(...);
}

/* Render the page, don't forget to pass the two forms in parameters */
return $this->render('yourPage.html.twig', array(
    'form_upload_profile' => $formUploadProfile->createView(),
    'form_select_iata_manually' => $formSelectManually->createView(),
    /* Add other parameters you might need */
));

Kemudian, dengan JavaScript, bergantung pada tombol radio mana yang dipilih, Anda menampilkan formulir pertama (dengan tombol kirimnya sendiri) atau formulir kedua (juga dengan tombol kirimnya sendiri).

person Nicolas    schedule 19.12.2017