Pořadí zpracování block a jeho opoždění
- Fires
- Člen | 97
Zdravím narazil jsem na zajimavý problém:
V 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
Ř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
Ř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 ;)