sekundární šablona komponenty ignoruje makro extends při AJAXu

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

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. snippet dalsi 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 blok dalsiObsah, Tracy ajax bar ten dump ukáže
  • blok dalsiObsah z šablony dalsiSablona.latte se už nicméně nevykreslí (dump uvnitř bloku dalsiObsah se neobjeví)
  • a šablona zjevně ani nedědí od rodicDalsiSablony.latte, protože žádnej dump kterej si dám do rodicDalsiSablony.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
+
0
-

muzu za to samozrejme ja :) poslu PR s fixem

btw, nebylo by lepsi pouzit komponenty?

David Matějka
Moderator | 6445
+
0
-

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

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!