Action a beforeRender, cyklus presenteru
- Tymikes
- Člen | 63
Zdravím, chtěl bych se zeptat ohledně životního cyklu presenteru.
Mám vytvořený formulář. Po odeslání dat onValidate posílám do
actionDefault, ten mi odchytne formulář a podle toho pošle do šablony data.
Všechno funguje, jak má. Ale když koukám na teorii, hodilo by se tohle
spíš na beforeRender. Ale jakmile to samé udělám s beforeRender a spustím
preseter, nastane chyba, že není proměnná a přitom by tam být měla nebo
se z beforeRender ztratí?
public function actionDefault($form, $values) {
if ($form) {
//Nastavení filtrů
$this->template->ukoly = ...
}
else {
$this->template->ukoly = ...
}
}
- Martk
- Člen | 661
beforeRender se volá před každou render* metodou. Nemůže přijímat žádné parametry, pokud si je chceš vyžádat, tak je potřeba:
$this->getParameter('form');
// nebo v presenteru persistentní parameter (zůstane i pře změně akce)
/** @persistent */
public $form;
beforeRender používej jen, pokud se má kód provést pro všechny akce.
Je imho špatné přesměrovávat formulář na akci (podle mě se vše ztratí, hned po obnovení stránky). Raději udělej tohle:
protected function createComponentForm() {
// ....
$form->onSuccess[] = [$this, 'successForm'];
return $form;
}
public function successForm($form, $values) {
$this->template->ukoly = //... - vše zmizí po obnovení stránky
// nebo lepší varianta
$this->redirect('this', ['myValues' => $values]); // Vyžádej si $values jako pole
}
Více k životnímu cyklu ti řekne zvýrazněný kód. Můžeš tam vidět i to, že beforeRender se volá bez parameterů.
Editoval Antik (24. 4. 2016 10:43)
- Martk
- Člen | 661
U toho posledního takhle:
public function renderDefault(array $myValues = []) {
$this->template->ukoly = $myValues;
}
protected function createComponentForm() {
// ....
$form->onSuccess[] = [$this, 'successForm'];
return $form;
}
public function successForm($form, array $values) {
$this->redirect('this', ['myValues' => $values]);
}