Pořadí zpracování block a jeho opoždění

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

Zdravím narazil jsem na zajimavý problém:

layoutu mám definovaný block title

<title>{block title}{/block}</title>

V podšabloně(contentu) ho chci redefinovat výstupem z komponenty

detail.latte
{block content}
{control article:detail}
{/block}
{block title}{control headerComp:title}{/block}

Problém je v tom že voláni {control article:detail} plní proměnné které využívá {control headerComp:title} a i přesto že je v sablone jeho voláni před volánim {control headerComp:title}
tak narážím na problém že se nevolají v tomto pořadí a proměné jsou neinicializované.

Je nějaký zpusob jak opozdit vyhodnocení nějakého bloku ,nebo jiné řešení ??
Předem díky

duke
Člen | 650
+
0
-

Řešením je plnit proměnné jinde než v render metodě; nejlépe v metodě k tomu účelu určené. Účelem metody render rozhodně není změna nastavení komponenty a proto by na to neměl nikdo (žádná jiná metoda) spoléhat.

Předpokládám, že jde o nějaké líné načítání. To lze iniciovat při renderování, ale neměla by to dělat přímo metoda render ale např. nějaká metoda getFoo(). Tu pak lze v případě, že je třeba v obou render metodách pracovat s foo, volat z obou render metod.

Editoval duke (23. 5. 2013 16:30)

Filip Procházka
Moderator | 4668
+
0
-

Řešením je nespoléhat se na pořadí.

protected function createComponentArticle()
{
	$control = new ArticleControl($this->articles->find($this->articleId));
	$control->setHeaderControl($this['headerComp']); // zkratky jsou fuj ;)
	return $control;
}

Nyní komponenta article ví že existuje druhá komponenta a dokonce jsme ji rovnou předali. Není nic jednoduššího, než rovnou přidat titulek přes nějakou metodu k tomu určenou ;)