Dynamický formulář – změna JavaScriptem

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

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
+
0
-

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
+
0
-

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
+
0
-

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.
	}
}
Ellesmess
Člen | 21
+
0
-

Ok; ještě se nad tím musím pořádně zamyslet a prošťourat to, co už jsem sbastlil :) – díky