Životní cyklus presenteru

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

Ahoj,

pořád řeším jednu takovou věc. pročetl jsem si dokumentaci, ale ještě jsem se nesetkal s best practice řešením ohledně řešení životního cyklu presenteru.

Dejme tomu, že mám například Presenter, který mi vypíše formulář, naplní formulář a vypíše nějaké položky. Je toto řešení správné, pokud jde o použití action a render?

// BasePresenter muze obsahovat napriklad vlastni helpery v beforeRender()
final class MujPresenter extends BasePresenter {

	/* vlastne mam volat v tomto presenteru beforeRender, pokud je mam definovane v
	 * BasePresenter? Rekl bych ze ne, ale radeji jsem to napsal ...
         */
	public function beforeRender(){
		parent::beforeRender();
	}

	// ziskani a vykresleni formulare
	public function actionFormular(){
		$form = $this['formular'];
		$this->template->form = $form; // pro vlastni vykresleni napr. jinak {control $form} v sablone
	}

	public function renderFormular(){
		$this->template->titulek = $titulek;
	}

	// vykresleni obsahu nacteneho z modelu -> databaze
	public function actionPolozky(){
		try {
			$polozky = Model::ziskejPolozky()->fetchALL();
		} catch (PolozkyException $e) {
			/* Napriklad by tady mohlo byt toto:
			 * $this->flashMessage($e->getMessage());
			 * $this->redirect('uvodnistranka');
			 */
		}

		$this->template->polozky = $polozky;
	}
}

Model reseny napr. takto (jeste by me zajimalo, jestli je model dobre zapouzdreny jako singleton (nebo zminovany pseudosingleton, aby se to nemuselo vytvaret uvnitr)

class Model extends Object {

	public static function ziskejPolozky(){
		try {
			return = dibi::select('*')->from('tabulka');
		} catch (DibiException $e) {
			Debug::processException($e); // logovani vyjimky
			throw new PolozkyException('Nepodarilo se nacist polozky');
		}
	}

}

Pochopil jsem tedy dobře, že je lepší provádět načítání dat v action (kvůli možné validaci, redirect, atd.) a render používat pouze pro vykreslení – tedy například vykresleni promenna title nebo zminene vytvoreni menu (a pokud pouziji v action $this->template->polozky = $polozky – tak to projde cyklem az do render a nasledne se vykresli, jako kdyby to bylo v render?)

Nebo neni chybou, pokud budu nacitat polozky z databaze uz v render a pokud budu potrebovat cokoliv validovat, presmerovavat, tak to provadet v action? ja prave ze beru i nacitani polozek jako obsluhu.

Diky, snad jsem zapsal vsechno co jsem chtel a snad to nebude nejakej velkej nesmysl.

Patrik Votoček
Člen | 2221
+
0
-
  1. „prázdný“ beforeRender fakt volat nemusíš
  2. $form = $this['formular']; $this->template->form = $form; je hodně fuj
  3. v action by jsi měl načítat data
  4. v render plnit šablonu
  5. redirect můžeš dělat jak v render tak action (záleží na okolnostech)
dEath
Člen | 39
+
0
-
  1. jasný :)
  2. jo, dobře .. $this->template->form = $form ne, tak v šabloně použiju {widget nazevformulare}, a mohu například nějak otestovat, že na šablonu komponenta dorazila? například pokud nedorazí, tak se vykreslí něco jiného … jestli je takova možnost, zajímalo by mě to :)
  3. ano a pokud tady v action načítat data, tak to tedy tím cyklem projde až do fáze render, co jsem pochopil, pokud v action použiji např. $this->template->promenna = $prommena? myslim, aby to bylo spravne reseni … nemam nic posilat na sablonu, napriklad toto (je to pouze myslenka)
final class MujPresenter extends Presenter {

	public function actionDefault(){
		$promenna ... // nacteni nejaky polozek;
		$this->setView('Default', array('promenna' => $promenna);
	}

	public function renderDefault($promenna){
		$this->template->promenna = $promenna;
	}
}

nesnazim se v tom hledat slozitosti, ale spravny postup podle cyklu … jestli je tedy spravny postup pouzit $this->template->promenna … nebo jestli je todle vlastne jedno, protoze to je ten cyklus a v action to projde az na render … vaze se ke 4. … nebo v tom hledam prilisne slozitosti?

5. jasny :)

dEath
Člen | 39
+
0
-

Pochopil jsem to tedy správně, s tím, že v action to projde až do render? nebo poslední kód co jsem napsal je optimální? jak by se to dalo tedy zapsat?