Životní cyklus presenteru
- dEath
- Člen | 39
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
- „prázdný“ beforeRender fakt volat nemusíš
$form = $this['formular']; $this->template->form = $form;
je hodně fuj…- v action by jsi měl načítat data
- v render plnit šablonu
- redirect můžeš dělat jak v render tak action (záleží na okolnostech)
- dEath
- Člen | 39
- jasný :)
- 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 :)
- 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 :)