Budoucnost formularu v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
richard
Člen | 60
+
0
-

Delam hromadu formularu, vlastne skoro jenom formulare. Toto jsou me navrhy/feature requesty. Mnohe jsem si jiz zkousel implementovat, nicmene to neni v kvalite, kterou bych chtel prezentovat.

  1. Implementaci $container->getToggledValues(). Uz to tady nekde bylo, ale jak popsano, tak mi to nefungovalo. Metoda by vracela jenom ty prvky, ktere jsou ve formulari viditelne.
  2. Oznaceni labelu tridou required, pokud jsou splneny podminky a pole je pozadovano (->adConditionOn(..)->setRequired()).
  3. Disablovani podminek na prvcich, ktere nejsou zobrazeny. Pokud mi podminka schova input, nemel by trvat na validite. Nebo moznost toto chovani zapnout.
  4. Implementaci kroku form → verify data → submit, kde se muzu pohybovat tam a zpet mezi form a verify.
  5. Wizard – vice krokovy formular. Jako $wizard[‚first_form‘] = $form; $wizard[‚first_form‘]->getNextForm = function() { return ‚second_form‘; }. Posledni krok by byl znovy ‚verify‘…
  6. Asi by stalo za to dat checkbox list do zakladu, zprovoznit js validaci a vymyslet podminky typu ‚MAX_CHECKED‘,‚MIN_CHECKED‘,‚VALUES_IN‘…
  7. Vypozoroval jsem ze se neustale opakuje vzor: trigger(prepinac) – trigger value – action (display,require,display-as-required) – dependent(libovolny prvek). Nastavenim tohoto zpusobem: $form->setDependency($trigger,$triggerValue,$action,$dependent); by se usetrilo hodne psani a premysleni.
  8. toggle recursively – tzn pokud prepinac A hodnota 1 zobrazi prepinac B hodnota 2 a to zobrazi input C, mela by prepinac A hodnota 2 schovat B i C, protoze sice B/2 je splneno, ale jaksi neni videt. V praxi se toto musi slozite osetrovat. (toto pouze navazuje na uvahu c. 3)

Omlouvam se za ukecanost. Predem bych se chtel omluvit, ze mi cas a znalosti nedovoluji intenzivne se zapojit do vyvoje. Muj obdiv a diky tem, kteri tak cini.

Editoval richard (28. 11. 2013 8:07)

Casper
Člen | 253
+
0
-
  1. Tohle mám osobně implementované v BaseForm::getValues() na základě nějaké mé vlastní konvence jak musím pojmenovávat toggles. Problém je v tom, že to těžko zobecníš, protože jedním togglle můžeš schovat více prvků – aneb id toho toggle může být cokoliv.
  2. Tohle je věc rendereru / manuálního vykreslování.
  3. Nevím jestli to dobře chápu, ale pokud myslíš, že nezobrazený input by neměl být required, tak je na tobě, abys mu předal v podstatě stejnou podmínku pro tuhle validaci jako u toho toggle co ho skrývá. Opět to nejde moc zobecnit, protože tohle opodmínkování může být hodně složité.
  4. Nevím jestli chápu, jaký je rozdíl mezi verify data a onValidate[] ?
  5. Tohle není tak snadné, sám mám FormWizard implementovaný, ale věřím, že každý by si ten Wizard představoval jinak. Můžeš si zkusit to implementovat tak obecně aby proti tomu nikdo nic neměl, ale to se ti asi nepodaří, protože možných přístupů je spousta.
  6. Sejde na tom kolik lidí to skutečně potřebuje tak často. Já třeba skoro vůbec.
  7. Nechápu :)
  8. Totéž jako v 1 – nelze zobecňovat.
richard
Člen | 60
+
0
-

Casper napsal(a):

  1. Tohle mám osobně implementované v BaseForm::getValues() na základě nějaké mé vlastní konvence jak musím pojmenovávat toggles. Problém je v tom, že to těžko zobecníš, protože jedním togglle můžeš schovat více prvků – aneb id toho toggle může být cokoliv.
  2. Tohle je věc rendereru / manuálního vykreslování.
  3. Nevím jestli to dobře chápu, ale pokud myslíš, že nezobrazený input by neměl být required, tak je na tobě, abys mu předal v podstatě stejnou podmínku pro tuhle validaci jako u toho toggle co ho skrývá. Opět to nejde moc zobecnit, protože tohle opodmínkování může být hodně složité.
  4. Nevím jestli chápu, jaký je rozdíl mezi verify data a onValidate[] ?
  5. Tohle není tak snadné, sám mám FormWizard implementovaný, ale věřím, že každý by si ten Wizard představoval jinak. Můžeš si zkusit to implementovat tak obecně aby proti tomu nikdo nic neměl, ale to se ti asi nepodaří, protože možných přístupů je spousta.
  6. Sejde na tom kolik lidí to skutečně potřebuje tak často. Já třeba skoro vůbec.
  7. Nechápu :)
  8. Totéž jako v 1 – nelze zobecňovat.

Obecne souhlasim. Upresnim:
1, …jedním toggle můžeš schovat více prvků… moje predstava byla spis ->toggle($form[‚input_nebo_container‘]); Schovaval by se cely pair wrapper.
2, Tohle mi prave nesedi. Pokud formular krici ‚Tohle je poviny udaj‘, a prvek ma focus, proc se musi label obarvovat separatnim js…?
3, Myslim to tak, ze pokud by se zobrazovaly/zkryvaly prvky formulare a nikoliv jakykoliv HTML element (viz toggle($form[‚input_nebo_container‘]); tak nema smysl validovat prvek, ktery je schovan (a treba vyplnen). Rozumim tomu, ze manualne se toto da nastavovat, ale nedava to smysl.
4, Souhlasim, na toto by se vice hodilo rozsireni komponentou, stylem ber nebo neber.
5, Myslel jsem to jako verification screen. Pak jen $form->verifyScreen = ‚You are going to submit this data, click submit or go back to the form and change the values‘; $form->verifyButton = ‚Next‘;
Asi by to byl chaos pri manualnim vykreslovani…
7 & 8,
Obcerstveni:

  • jidlo
  • piti

Jidlo:

  • zakusek
  • hlavni chod

Zakusek:

  • dort
  • zmrzlina
  • jiny zakusek

Jiny Zakusek:

Piti:

  • pivo
  • limo
  • jine piti

Jine Piti:

Formular se zobrazi jenom jako Obcerstveni a dalsi pouze relevantni hodnoty se zobrazuji jako mandatory podle tohoho, co se vybere.

V soucasnych formularich je toto docela harakiry.

Muj navrh je aby se toto cele delo jako

$form->addDependency($form['obcerstveni'],Form::EQUAL,'jidlo',Form::DISPLAY_REQUIRE,$form['jidlo']);
$form->addDependency($form['jidlo'],Form::EQUAL,'zakusek',Form::DISPLAY_REQUIRE,$form['zakusek']);
$form->addDependency($form['zakusek'],Form::EQUAL,'jiny zakusek',Form::DISPLAY_REQUIRE,$form['jiny_zakusek']);
$form->addDependency($form['piti'],Form::EQUAL,'jine piti',Form::DISPLAY_REQUIRE,$form['jine_piti']);

Dependent muze byt prvek nebo container a toggle se provede na wrapperu inputu nebo na vsech inputech v containeru.
Input ktery je schovan pak nema smysl validovat…

Diky za odpoved.

Editoval richard (28. 11. 2013 10:15)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ad 6) Dovolím si odkázat na svůj doplněk, který přesně toto umí, včetně JS validace :). V základu to Nette podle mě taky nepotřebuje, s Composerem v Nette 2.1 (či s mým jiným doplňkem pro řadu 2.0.x) je to o připsání řádku do composer.json a druhého řádku do config.neon.

David Grudl
Nette Core | 8228
+
0
-

ad 6) na tohle by měly stačít klasické validace MIN_LENGTH, MAX_LENGTH a IS_IN, ne?