sekundární šablona komponenty ignoruje makro extends při AJAXu
- jahudka
- Člen | 71
Helou,
tohle je nějaká novinka v dvačtyřce asi, protože doteď to fungovalo..
Mám komponentu, která má šablonu s pár snippetama. Jeden z těch snippetů uvnitř volá metodu tý komponenty, která volitelně renderuje nějakej další obsah – doslova je v tý hlavní šabloně tenhle kód:
<div n:snippet="dalsi">
{php $control->renderDalsi() }
</div>
Metoda renderDalsi()
vypadá nějak takhle:
public function renderDalsi() {
$tpl = $this->createTemplate();
$tpl->setFile('dalsiSablona.latte');
$tpl->render();
}
Toto je třeba, protože potomci té komponenty si tuhle metodu můžou
přetížit a udělat v ní cokoliv jiného a to je záměr – obyčejné
makro include
nestačí.
V šabloně dalsiSablona.latte
je pak napsáno:
{extends 'rodicDalsiSablony.latte'}
{block dalsiObsah}
<p>Tady je nejakej dalsi obsah</p>
{/block}
A konečně rodicDalsiSablony.latte
obsahuje:
<h3>Dalsi obsah:</h3>
{block dalsiObsah}{/block}
Když tohle načtu normálně, zafunguje to tak jak má – vyrenderuje se něco jako:
<div id="snippet-komponenta-dalsi">
<h3>Dalsi obsah:</h3>
<p>Tady je nejakej dalsi obsah</p>
</div>
Ale když na tu komponentu pošlu nějakej signál / submitnu form a
v handleru si zavolám $this->redrawControl('dalsi')
, snippet
snippet-komponenta-dalsi
je v payloadu prázdnej. Zkoušel jsem si
tam dát pár bardumpů a objevil jsem, že:
- metoda
renderDalsi()
se zavolá a vpořádku proběhne úplně stejně jako při ne-ajaxovém požadavku – tj. snippetdalsi
se správně překreslí a hlavní šablona funguje jak má - šablona
dalsiSablona.latte
se zpracuje (tj. když do ní dám{dump 'foo'}
mimo blokdalsiObsah
, Tracy ajax bar ten dump ukáže - blok
dalsiObsah
z šablonydalsiSablona.latte
se už nicméně nevykreslí (dump uvnitř blokudalsiObsah
se neobjeví) - a šablona zjevně ani nedědí od
rodicDalsiSablony.latte
, protože žádnej dump kterej si dám dorodicDalsiSablony.latte
se nevypíše
Jinak řečeno: když si v komponentě klasickou továrničkou
createTemplate()
vybleju novou šablonu a vyrenderuju ji, šablona
se chová nějak úplně podivně – ani koza ani rak – buď čekám, že
dědí od rodicDalsiSablony.latte
a vykreslí se tak jak chci, a
nebo čekám, že nedědí, a pak by se blok dalsiObsah
měl
vyrenderovat rovnou, jako když dám do @layout.latte
blok
title
.
Any ideas jak to fixnout?
- David Matějka
- Moderator | 6445
muzu za to samozrejme ja :) poslu PR s fixem
btw, nebylo by lepsi pouzit komponenty?
- David Matějka
- Moderator | 6445
poslal jsem PR
https://github.com/…tte/pull/127
https://github.com/…ion/pull/150
jako hotfix by mohlo stacit dat na zacatek renderDalsi
$this->snippetMode = FALSE;
- jahudka
- Člen | 71
David Matějka napsal(a):
btw, nebylo by lepsi pouzit komponenty?
Tohle je právě už komponenta, jde jen o vykreslení formuláře pro nějaký dílčí nastavení tý komponenty, dalo by se to separovat do subkomponenty, ale pak bych pro potomka kterej si chce přidat jedno políčko musel podědit ještě tu subkomponentu a to mi přijde overkill :-) ale asi by to šlo no..
David Matějka napsal(a):
jako hotfix by mohlo stacit dat na zacatek
renderDalsi
$this->snippetMode = FALSE;
Zkusím, dík!