Action a beforeRender, cyklus presenteru

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

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
+
0
-

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)

Tymikes
Člen | 63
+
0
-

Jo moje verze kupodivu funguje, ale pouze na Action. Jinak tvoje ani jedna mi nefunguje, pokud spustím hlasí, že nemá definované proměnné. Jak má vypadat pak render?

Martk
Člen | 661
+
+1
-

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]);
}
Tymikes
Člen | 63
+
0
-

Jojo, funguje to, zbavím se action.
Ale zase nevýhoda je, že vidím v URL ty ošklivé parametry, které posílám :/ přes action je nevidím.