Znovupoužiteľné formuláre a best practise

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

Zdravím

je jasné, že formuláre píšeme pomocou továrničok (https://forum.nette.org/…nebo-tovarna).

Mňa by teraz zaujímalo ako to prakticky použiť.
Majme situáciu: požadujem formulár na vkladanie a editáciu dát.

Takže, vytvorím továrničku:

class FormularFactory extends Object {

	private $myModel;

	function __construct(MyModel $myModel)
	{
		$this->myModel = $myModel;
	}

	public function create($id = NULL)
	{
		$form = new Form();
		//Vytvoríme formulár podľa potrieb

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

		if ($id != NULL) {
			$form->setDefaults($this->myModel->find($id));
		}
		return $form;
	}

	public function formSubmitted(Form $form)
	{
		$this->myModel->save($form->getValues());
	}
}

Teraz neviem či je to nastavovanie hodnôt pri edite takto čisté ale nič lepšie ma nenapadlo.

A teraz problém, ako to čisto napojiť na presenter.

  1. potrebujem overovať oprávnenia (to by sa malo dať z časti na úrovni presentera – oprávnenia na akcie + kontrola odkiaľ vytváram komponentu)
  2. čo ak zadám neplatné id? vyhodiť výnimku a odchytávať ju v createComponent?
  3. čo ak budem chcieť kontrolovať napríklad, že môžem editovať len entitu, ktorej som autorom, opäť vyhadzovať výnimku a odchytávať v createComponent
  4. ako oboznámiť presenter s výsledkom (spraviť si event v továrničke?)
  5. ak mám actionEdit($id) v presentery, ako preniesť parameter $id do továrničky

je toto v poriadku?

class MyPresenter extends Presenter
{
	protected $id = NULL;

	public function actionEdit($id)
	{
		$this->id = $id;
	}

	protected function createComponentFormular()
	{
		$form = $this->formFactory->create($this->id);
		return $form;
	}

}

Ak máte ešte nejaké tipy, tak kľudne sem s nimi.

Ďakujem :)

Šaman
Člen | 2668
+
+1
-

Já nastavuji defaultní hodnoty (případně přidávám atypická tlačítka apod.) až v action metodě. V tovární třídě připravím základní formulář a jeho zpracování, v action předám defaults a navěsím dodatečnou obsluhu (flashmessage, redirect).

Unlink
Člen | 298
+
0
-

No aj to je riešenie, ale ide mi o to, aby ten presenter nemusel nutne mať tiež k dispozícii ten model.

Šaman
Člen | 2668
+
0
-

No, on ten model presenter pořebuje většinou v renderDetail(), takže tenhle požadavek mě zatím nepálil. Dřív jsem taky zkoušel mít chytré formuláře, ale nějak jsem došel ke zkušenosti, že přemíra vlastní invence formulářům škodí. I když zrovna to načítání hodnot by umět mohl.

Unlink
Člen | 298
+
0
-

A tie flashmessages a presmerovania navesuješ priamo na form a jeho onSuccess?
Ako potom riešiš situáciu, keď ti model vyhodí výnimku?