NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Symfony - Dynamický formulář

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michael K.
Člen
Avatar
Michael K.:29.1.2018 11:04

Ahoj,

začal jsme se Symfony frameworkem, základní principy jsem pochopil (oficiální dokumentace je perfektní).

Nicméně, zadrhnul jsem se u dynamického formuláře. Pokusím se co nejlépe nastínit o co jde...

Mám dvě tabulky, jedna slouží pro ukládání dat, druhá jako zdroj polí pro formulář.

Například:
Tabulka_products
ID / part_number / model
1 / 7440 / T1
2 / 7442 / T1
3 / 7950 / T2
4 / 7952 / T2
5 / 8100 / F4

apod...

Další tabulku mám, kde mají být data:
ID / create_date / part_number / pieces
0 / 2018-01-29 / 7950 / 150
1 / 2018-01-29 / 7440 / 200

Zkrátka, uživatel by měl zadávat počet kusů u daného dílu.

Teď otázka zní, je nějaký elegantní způsob jak pole generovat automaticky na základě první tabulky ?

Snažil jsem se to vyřešit takto:

//Načtu data z první tabulky..
 $products = $this->getDoctrine()->getRepository('AppBundle:PurchaseInventoryProducts')->findAll();

        $purchase_data_row = new purchase_inventory_data;
        $form = $this->createFormBuilder($purchase_data_row);

//Ve smyčce přidám pokaždé pole k danému part-numberu
        foreach($products as $product) {
            $x = $product->getPartnumber();
            $form = $form->add('pieces',NumberType::class,
                array(
                'label' => $x,
                'attr' => array(
                        'name' => $x,
                        'class' => 'form-control',
                        'style' => 'width: 30%'
                )
            ));
        }

Problém je, že se mi vytvoří pouze poslední záznam.

Když zkusím tento kód (child generuji jako part-number, nemám tam "natvrdo" název sloupce 'pieces':

//Načtu data z první tabulky..
 $products = $this->getDoctrine()->getRepository('AppBundle:PurchaseInventoryProducts')->findAll();

        $purchase_data_row = new purchase_inventory_data;
        $form = $this->createFormBuilder($purchase_data_row);

//Ve smyčce přidám pokaždé pole k danému part-numberu
        foreach($products as $product) {
            $x = $product->getPartnumber();
            $form = $form->add($product->getPartnumber()',NumberType::class,
                array(
                'label' => $x,
                'attr' => array(
                        'name' => $x,
                        'class' => 'form-control',
                        'style' => 'width: 30%'
                )
            ));
        }

Dostanu následující chybu..

Neither the property "3D7844-35AA0" nor one of the methods "get3D7844-35AA0()", "3D7844-35AA0()", "is3D7844-35AA0()", "has3D7844-35AA0()", "__get()" exist and have public access in class "AppBundle\Entity\purchase_inventory_data".

Musím tím pádem nějakým způsobem dynamicky generovat entitu ?

Děkuji všem za tipy ! Snad jsem vysvětlil srozumitelně, o co se mi jedná a na nic jsem nezapomněl :)

 
Odpovědět
29.1.2018 11:04
Avatar
Neaktivní uživatel:29.1.2018 14:31

Popravdě nechápu co chceš vlastně udělat.

Formulář se vypíše jen 1 protože ho vlastně v cyklu pořád přepisuješ, takže se zobrazí ten poslední.

Ta druha ukázka kódu nefunguje protože první parameter v add() má být název proměnné z entity purchase_inven­tory_data

Editováno 29.1.2018 14:34
Nahoru Odpovědět
29.1.2018 14:31
Neaktivní uživatelský účet
Avatar
Michael K.
Člen
Avatar
Michael K.:30.1.2018 7:08

Jedná se mi o to, aby formulář generoval vstupní pole na základě záznamů z tabulky. Měla by to být inventura. Tzn, někde si vytvářím nové položky a právě díky tomuto vygenerovaném formuláři chci přihazovat kusy.

Převedu to do jednoduššího příkladu:
mám dejme tomu zverimex - mám již formulář, kde si přidávám typy zvířat: například si přidám kočku, poté psa, poté hada apod..

A oný druhý formulář, který řeším a chtěl bych vygenerovat na základě typů zvířat.

Pokud bych si vytvořil psa, hada a kočku, formulář by měl vypadat potom takto:

Zvíře Počet
Pes (vstupní pole pro zadání počtu)
Had --------||----------
Kočka --------||---------

Tzn. když v jiném formuláři přidám další zvíře, chtěl bych aby se generovalo v formuláři, kde přidávám jejich počty.

Formulář se vypíše jen 1 protože ho vlastně v cyklu pořád přepisuješ, takže se zobrazí ten poslední.

Přesně tak, to jsem pochopil, proč se to tak chová

Ta druha ukázka kódu nefunguje protože první parameter v add() má být název proměnné z entity purchase_inven­tory_data

Zde taky chápu, tím pádem mě napadá myšlenka - generovat si entitu na základě databáza, ale předpokládám, že to nebude asi moc košér, že ?

Děkuji :)

 
Nahoru Odpovědět
30.1.2018 7:08
Avatar
Neaktivní uživatel:30.1.2018 8:42

Hele, takhle si vygenerujes vice formularu:

$form1 = $this->createForm(
    MyFirstFormType::class
);

$form2 = $this->createForm(
    MySecondFormType::class
);

if ($request->isMethod('POST')) {

    $form1->handleRequest($request);
    $form2->handleRequest($request);

    if ($form1->isSubmitted()) {
        // Handle $form1
    } else if ($form2->isSubmitted()) {
        // Handle $form2
    }

}

Zdroj: https://stackoverflow.com/…-a-same-page

//mělo by to fungovat na SF2.8,3.X a snad i 4.X

Editováno 30.1.2018 8:43
Nahoru Odpovědět
30.1.2018 8:42
Neaktivní uživatelský účet
Avatar
petrekov
Člen
Avatar
petrekov:30.1.2018 16:22

Tak formBuilder je v základu mapován na entitu, tedy její sloupečky, jenže ty budeš mít ty data v řádcích. Musel by sis kolem formBuilderu podle mě nastavit až moc logiky, než aby se to vyplatilo takhle používat, lepší bude si myslím formulář s combo boxem a pod ním formulář, který by sis dotahoval ajaxem přímo mapován s načtenými daty pro jednotlivé zvíře. Pokud bys to chtěl chytřejší, můžeš mít list a u každého zvířete tlačítko edit a po kliknutí ajaxem dotáhnout pod daný řádek s pomocí jqeury potřebný formulář. Tak by to bylo asi nejjednodušší.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
30.1.2018 16:22
Do diskuze musí jít člověk připraven ztratit svůj názor
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.