Rozdělení velkého formuláře do více menších a uložit jedním tlačítkem

Danny
Člen | 146
+
0
-

Ahoj,
jak obecně řešíte to že pokud máte jeden obrovský formulář, kde je hromada inputů a potřebujete ho kvůli přehlednosti nebo znovu použitelnosti rozdělit na komponenty?

Jde mi o to že mám formulář o kterým vím že bude rozsáhlý, rád bych ho nějak rozdělil(základní informace, finanční informace, kontaktní informace atd) a pro každou část udělal vlastní komponentu s šablonou, formem a zpracovával to jednotlivě. Nicméně jich bude hodně a bylo vhodné aby tam bylo jen jedno tlačítko které tyto komponenty uloží najednou (aby uživatel nemusel ukládat třeba 10 komponent po jedné).

Jde to vůbec? Jakou cestou se vydat? Mít jen jeden formulář a v něm to rozdělit alespoň do kontejnerů kvůli přehlednosti?

Díky :-)

Pavel Kravčík
Člen | 1182
+
0
-

Je to málo informací. Záleží na datech a hlavně jejich validaci. Pokud každá z těch 10ti částí má nějaká povinná data nebo závislá (např. krok 3 doprava ovlivní krok 6 doručení apod.), tak stejně jedno tlačítko nedává smysl. Protože to bude strašně nepřehledné v jaké části ten uživatel něco zapomněl vyplnit. Nemá to obecnou poučku, v tomhle případě jde vždy o konkrétní formulář. Ale můžeš popřemýšlet o:

  • wizard form
  • ajaxový form (každé tlačítko bude mít onChange[]) a uloží se hned po focusOut v JS. Tj. nepotřebuješ jedno velké tlačítko
Danny
Člen | 146
+
0
-

Ahoj @PavelKravčík díky za reakci,
nevím jestli bych to definoval jako kroky, neměl by to být wizard, ale ano budou tam závislosti. Proč by jedno tlačítko nedávalo smysl? Kdybych měl jeden obrovský formulář a na konci jeho tlačítko na uložení tak ten princip bude úplně stejný, taky by uživatel hledal v jaké části co zapomněl vyplnit.

Jde mi obecně o to jak k tomuhle problému přistupovat, protože mi nepřijde nejlepší řešení mít jeden obrovský form kde je vše nepřehledné jak z hlediska definice inputů tak z hlediska zpracování těch dat. Raději bych z toho měl několik části/komponent/kontejneru které by se například definovali i v jiné třídě se svojí šablonou (nebo i měli svoje vlastní zpracování dat ale to nevím jestli je reálné).

mystik
Člen | 291
+
+1
-

No jak častý bude podle tebe use-case, kdy uživatel bude vyplňovat všechno najednou versus use-case, kdy bude chtít jen změnit údaje v jedné části. Z mého pohledu mi přijde lepší mít 10 logicky rozdělených částí ukládaných zvlášť než dlouhý form a jedním tlačítkem na konci. Pak když chci změnit jeden údaj v prostředku tak ho musím najít, scrollovat dolů, odeslat a když něco neprojde validací tak zase scrollovat nahoru, opravit, scrollovat dolů, odeslat, …

Maximálně bych tam dal tlačítko Uložit vše, které jen pomocí AJAXU odešle všechny části pomocí jejich submitů postupně.

Danny
Člen | 146
+
0
-

@mystik To je otázka, upřímně nevim, řekl bych že ze začátku to spíš bude vše na jednou a poté doplňování postupně. Tvoje myšlenka se shoduje s tím jak bych chtěl aby to vypadalo, můžeš mi blíž popsat jak prakticky vyřešit to aby se pomocí AJAXU zpracovali všechny části? Úplně nechápu jak to v praxi bude fungovat. Díky

mystik
Člen | 291
+
0
-

Asi bych na to šel jednoduše tak, že bych ty formuláře udělal AJAXově odesílané (používáš už něco na AJAXizaci appky?), a pak is jen selectnul všechna odesílací tlačítka (třeba si je označit nějakou speciální třídou) a poslal jim click() event. Prostě jen simulovat jako kdyby to uživatel postupně oklikal sám.

Záleží pak zda tam nebudou nějaké komplikace, třeba že ty formuláře nemůžou mít mezi sebou závislosti (odeslání jednoho vynutí překreslení jiného), apod. Tam už by to mohl být docela oříšek.

mystik
Člen | 291
+
0
-

Tam bych to asi řešit tak, že při úpravě jednoho ze závislých formulářů bych ten druhý hodil disabled s nějakou hláškou, že je nejdříve potřeba uložit provedené změny a odblokoval ho až po uložení a překreslení.

Kori
Člen | 73
+
0
-

@Danny Delam to presne jak rikas, rozdeleni do kontejneru. Bud to muzes mit v jedne classe a nebo pro kazdy kontejner samostatnou tridu.

Danny
Člen | 146
+
0
-

@Kori Můžeš mi prosím ukázat nějaký praktický příklad v kódu? Obecně mě zajímá jak to řešit kdybych chtěl mít kontejnery v jiných třídách. Díky

Editoval Danny (12. 8. 2022 21:02)

Kori
Člen | 73
+
+1
-

@Danny Tak uplne primitivni priklad, pisu z hlavy

class TestContainer extends \Nette\Forms\Container
{
	....
}
$form->addComponent(new TestContainer(), 'testcontainer');
dump($form['testcontainer']->getValues());

Ten container muze vlastni factory / byt service, atd…

Danny
Člen | 146
+
0
-

@Kori Díky za tip, přenášíš i nějak závislost do toho containeru/servisy aby se starala o zpracování těch dat? Myslím tím i třeba to že by byla schopná nasetovat data z toho formu/containeru do nějaké entity vrátit zpátky.

Editoval Danny (15. 8. 2022 10:46)