Formuláre s inputmi generovanými za behu

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

Ahojte,
posledný deň som zápasil s problémom, ktorý popisujem nižšie.

V tabuľke mám pre každú udalosť zoznam ľudí. Chcem vytvoriť formulár, ktorý obsahuje input za každého človeka, ktorý sa zúčastnil vybranej udalosti. Problémy na ktoré som narazil:

  • Formulár musí byť vytvorený factory metódou createComponent, v opačnom prípade nebude naplnení submitovanými dátami, nezavolá sa onSubmit, atď
  • createComponent neprijíma žiadne parametre
  • vo vnútri createComponent nemožno testovať formulár na isSubmitted ani checkovať jeho hodnoty
  • inputy pridané do formulára po vrátení metódou createComponent nebudú naplnené submitnutými dátami

Jediné riešenie, ktoré som vymyslel, bolo pridať do formulára hidden element s id udalosti a vo vnútri createComponent checkovať httpRequest.

Riešenie sa mi moc nepáči a zaujímalo by ma, aký je odporúčaný spôsob riešenia.

Vopred vďaka za rady

Filip Procházka
Moderator | 4668
+
0
-

Replicator, můžeš kouknout i na sandbox

public function actionDefault()
{
	$form = $this['usersForm'];
	if (!$form->isSubmitted()) { // pokud formuláře nebyl odeslán
		foreach ($this->model->findUsers() as $user) {
			$container = $form['users']->createOne($user['id']); // vytvoříme položku
			$container->setDefaults($user); // naplníme výchozí hodnoty
		}
	}
}

protected function createComponentUsersForm()
{
	$form = new Nette\Application\UI\Form;

	// přidání dynamického kontejneru
	$form->addDynamic('users', function (Nette\Forms\Container $container) {
		$container->addText('username', 'Uživatel');
	});

	$form->addSubmit('send', 'Odeslat');
	$form->onSubmit[] = array($this, 'SaveUsersSubmitted');

	return $form;
}

public function SaveUsersSubmitted($form)
{
	$users = $form['users']->values;
	foreach ($users as $user) { // jednotlivé řádky
		dump($user['username']); // hodnota z formuláře
	}
}
Akres
Člen | 3
+
0
-

Mám nejspíš podobný problém, ale nejsem si tím jistý a s*** se s tím už druhý den tak bych poprosil o potvrzení protože už pomalu nemám sílu.

Mám internetový obchod s nábytkem. Prodávají se tam např. dvířka do kuchyňské linky. Jako jeden produkt (tzn na jedné stránce ) mám vždycky jednu řadu (řekněme řada s názvem Miláno). V této řadě je mrtě různých rozměrů dveří (fakt, je jich asi 50), které jsou rozdělené do několika sekcí ( dvířka na šuplíky, na poličky atd.), každá sekce má vlastní tabulku, která vypadá asi takhle

---------|Červená| Modrá |Zelená
---------|-------|-------|-------
 Rozměr1 | cena1 | cena2 | cena3
---------|-------|-------|-------
 Rozměr2 | cena4 | cena5 | cena6
---------|-------|-------|-------
atd. myslím, že chápete.

O co mi jde je, že pod každou tabulkou je select box s vybranou variantou, políčko pro množství a tlačítko „Přidat do košíku“.
Čili mám několik formulářů na jedné stránce, které jsou stejné, ale select v nich má jiné hodnoty.
No a zaboha jsem nepřišel na to jak tohle udělat zatím..

Editoval Akres (18. 10. 2011 23:09)

Filip Procházka
Moderator | 4668
+
0
-

Asi bych udělal prototyp formuláře a ten připojil do presenteru tolikrát, kolikrát bude potřeba.

Akres
Člen | 3
+
0
-

No něco na ten způsob mě taky napadlo.. ale jak to udělám?
Jeden ten formulář mám jako třídu poděděnou od AppForm.

michal50070
Člen | 1
+
0
-

$form->addText(‚name‘, ‚Jméno:‘);

$form->addPassword(‚password‘, ‚Heslo:‘);

$form->addSubmit(‚send‘, ‚Registrovat‘);