Dynamický formulář – změna JavaScriptem
- Ellesmess
- Člen | 21
Zdravím, zase já a zase formuláře.
Bylo to tu asi probíráno, mnohé jsem pročetl, ale stále jsem nenarazil na odpověď/řešení.
Po dlouhém boji se snippety se mi povedlo docílit ajaxového tahání selectu, ovšem nepodařilo se mi přijít na to, jak Nette donutit, aby mi tento select odeslalo.
Otázka je: jak správně vyřešit sestavení formuláře tak, abych již v době jeho sestavení znal příchozí hondoty a upravil jeho vygenerování tak, aby odpovídal stavu při změně JavaScriptem?
Napadlo mě v sestavení chytit HttpRequest a v postu se zeptat na příslušné ID, které filtruje závislou položku, nicméně to považuju za prasárnu.
Rád bych to vyřešil bez DependencySelectu a jiných doplňků.
Díky
Nette 2.0/PHP 5.3
- uestla
- Backer | 799
IMHO jsou DependencySelectboxy a podobné věci zbytečné, psal jsem to už tutonc…
Mimo tam popsaného řešení lze ještě sestavovat
formulář v attached
metodě. Hodnoty z HTTP požadavku
se konkrétním prvkům formuláře totiž přidávají
při připnutí k formuláři (fakt, nekecám).
class MyForm extends UI\Form
{
protected function attached($presenter)
{
parent::attached( $presenter );
$this->buildForm();
}
private function buildForm()
{
$day = $this->addSelect('day', 'Day', array( ... ));
if ($day->value !== NULL) {
$month = $this->addSelect('month', 'Month', array( ... ));
if ($month->value !== NULL) {
$year = $this->addSelect('year', '...', ...);
// atd.
}
}
$this->addSubmit('send', 'Submit');
}
}
V šabloně pak vykresluji podmíněně tak, že se zeptám
na existenci prvku formuláře… Když pak formulář obalím
snippetem a navěsím na něj AJAX, vše je automatizované.
Píši z paty, takže kód ber spíš jako myšlenku než funkční
věc.
- Ellesmess
- Člen | 21
Hmm, velice zajímavé. Časem se ještě naučím víc se šťourat ve zdrojácích a dokumentace – sice jsem některé bloky pročetl, ale ještě se moc nechytám :).
Každopádně zatím jsem to zkusil vyřešit tak, že mám Control, ve kterém si definuji, které inputy jsou „dynamické“ a po sestavení formuláře a nastavení defaultních hodnot projdu tyto hodnoty a zjišťuji, zda přisly v HttpREquestu – podle toho si pak volám callbacky, které mi formulář přizpůsobi do podoby, v jaké jej odeslala AJAXová úprava. Zdá se, že to funguje pěkně a není to až taková čuňárna.
Tak či tak se podívám, jak implementovat Tvé řešení.
Díky za pomoc :)
- uestla
- Backer | 799
Je pravda, že nastavování defaultních hodnot jsem nezmínil.
Ty je potřeba logicky nastavit těsně po přidání prvku do
formuláře, tedy ještě předtím, než budu jeho hodnotu kontrolovat
a podle toho pak dynamicky přidávat další prvky.
Určovat si dynamické prvky a kontrolovat ručně přítomnost
v požadavku mi přijde zbytečné, protože jak jsem psal, tak
se to vlastně děje za tebe – z HTTP požadavku se případně
odeslané hodnoty vyplní, čili tobě stačí kontrolovat přímo
ty hodnoty.
$day = $form->addSelect('day', 'Day', array( ... ));
$day->setDefaultValue( date('j') );
if ($day->value !== NULL) {
$month = $form->addSelect('month', 'Month', array( ... ));
$month->setDefaultValue( date('n') );
if ($month->value !== NULL) {
$year = $form->addSelect('year', '...', ...);
$year->setDefaultValue( date('Y') );
// atd.
}
}