Více variant jednoho formuláře

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

Ahoj,

řeším takovou otázku jak nejlépe pracovat s více varianty formuláře. Mám např. nějaký editační form, ale potřebuji ho třeba na 4 varianty a teď mě napadlo více způsobů, ale moc se mi to nelíbí.

1. možnost
vytvořit zvlášť presenter a v něm metoda default() varinata1() varinata2() varianta3().
metoda default rozpozná podle id od jaký typ záznamu se jedná a zavolá např. forward příslušné varianty. To je dobré v tom, že budu mít pro každou variantu zvlášť templatu, jelikož používám manuální rendering. Musím ale v presenteru vytvořit komponentu ke každé variantě formuláře tudíž createComponentVarianta1Form() …, …, …, a v každé té šabloně si pak vzít potřebný form. To se mi nelíbí v tom, že musím psát pro každou variantu zvlášť formulář (časté opakování kódu) a vtom, že ve finále je presenter hodně obsáhlý.

2. možnost
vytvořit jeden formulář, kterému předám id záznamu a on už vše vytvoří uvnitř sebe a vrátí potřebný form. To je skoro stejné jen bych musel navěsit na každou variantu button s nějakým callbackem, tady se mi zase nelíbí, že to bude sice v jednom souboru, ale chaotické.

3. možnost
vytvořit jeden formulář, který bude obsahovat úplně vše a v jednotlivých metodách z něho odebírat.

Jedna věc je jakým způsobem řešíte obsluhu více variantového firmuláře a druhá jeho tvorba :)
Budu rád za všechny tipy a rady

CZechBoY
Člen | 3608
+
0
-

Já si udělám fasádu na ten form a případně přidávám políčka.

class UserFacade
{
	public function createRegisterForm ()
	{
		$form = $this->factory->create();

		$form['heslo']->setRequired('Heslo je povinné');
		$form->onSuccess[] = [$this, 'registerSucceeded'];
		return $form;
	}

	public function createEditForm ($id_user)
	{
		$form = $this->factory->create();

		$form->addHidden('id')->setValue($id_user);

		$form->onSuccess[] = [$this, 'editSucceeded'];

		return $form;
	}
}
pcs
Člen | 22
+
0
-

CZechBoY napsal(a):

Já si udělám fasádu na ten form a případně přidávám políčka.

class UserFacade
{

	public function createEditForm ($id_user)
	{
		$form = $this->factory->create();

		$form->addHidden('id')->setValue($id_user);

		$form->onSuccess[] = [$this, 'editSucceeded'];

		return $form;
	}
}

Jak pak tuhle funkci zavolám? Já normálná používám

protected function createComponentEditForm() {
...
}

a to mohu zavolat v latte pomocí

{control editForm}

ale nevím jak volat tvojí funkci a předat jí parametr.

CZechBoY
Člen | 3608
+
0
-

@pcs předáš ho továrničce

protected function createComponentEditForm()
{
	$form = $userFacade->createEditForm($id_user);

	return $form;
}

a vykreslíš třeba přes

{control editForm}

Editoval CZechBoY (21. 8. 2016 1:18)