Ajax problém, render více šablon
- crempa
- Člen | 198
Ahoj,
v nové beta verzi mám problém u komponenty která při renderu používá
více šablon, něco jako:
<?php
$headerTemplate->render();
$contentTemplate->render();
$footerTemplate->render();
?>
při klasickém dotazu je vše OK, ajaxový dotaz a invalidace snippetů v šablonách skončí HTML výstupem a záznamem do logu v podobě InvalidStateException – Cannot send header after HTTP headers have been sent…
Komponenta s jednoduchým
<?php
$template->render();
?>
funguje bez problémů a výše uvedené v alpha verzích chodilo také.
Nějaký nápad, zda dělám něco špatně já a nebo je něco špatně v Nette?
Díky
Editoval crempa (13. 6. 2011 10:38)
- crempa
- Člen | 198
Presne tak to je, vzhledem k variabilite komponenty je nutne mit jeji
grafickou reprezentaci rozdelenou do vice sablon…
Ono by nejspis slo to cele prepsat tak, ze by se pouzila jen jedna hlavni
sablona a tri by se v ni pres bloky vkladaly… Klicove ale je, ze neco slo a
ted nejde, takze zda to nemuze delat problemy i v jinych pripadech…
- uestla
- Backer | 799
Troufale si troufnu tvrdit, že je to mírně v rozporu
s architekturou – každé komponentě by měla náležet jediná šablona
(přesněji FileŠablona
), neboť má v sobě zabudovánu
továrničku:
$control->getTemplate();
Čili pokud si vytváříš vlastní vedlejší šablony, je to jako bys je používal nezávisle na Frameworku a tipnu si tvrdit, že pak ani AJAX a invalidace snippetů nebude fungovat tak, jak očekáváš.
Je mi přesto divné, že to v minulé verzi fungovalo…
- uestla
- Backer | 799
Chápu, jde prostě o to, že jedna komponenta → jedna FileŠablona –
ani nevím, je-li správně mít potřebu právě metodu
createTemplate()
volat v metodě render()
–
myslím, že ne. Třeba při vytváření šablony pro odesílaný e-mail, to
jo, ale to není šablona komponenty, čímžto jsem se zase obloučíčkem
vrátil na začátek úvahy…
- crempa
- Člen | 198
2gmvasek: vsak proc ne, pokud bych ji ale nesmel pouzivat tak predpokladam ze bude private…
Uvahu je mozne vest jinak, rekneme ze potrebuju aby se komponenta renderoval ze trech, souborove oddelenych sablon… tak to je proste potreba, logicky jsem tak dospel k nazoru ze je to nejjednodussi vyresit tak, ze si vytvorim tri instance templatu, nasypu do nich hromadu parametru a postupne si je renderuju, do ted to bylo dva roky bez problemu funkcni…
Nikde jsem nenasel ze by bylo receno „pokud renderujes komponentu musis pouzit jen jednu sablonu“ takze bud je to:
- chyba v Nette
- nedostatek v dokumentaci
- neumim hledat v dokumentaci
Jak jsem jiz vyse uvedl ma dany problem pravdepodobne reseni udelat si jednu rodicovskou sablonu a do ni ty tri proste includovat postupne tak jak je renderuju… to je ale totez v bledemodrem a vzhledem k realizaci komponenty by to ale znamenalo znacne upravy v kodu (je tam navic render do PDF a podobne zalezitosti) a proto bych byl radsi kdyby byla zachovana puvodni funkcnost.
- 22
- Člen | 1478
no já nevím, ale je přece možné v šabloně volat komponentu s parametrem, podle kterého určíš, jaká šablona se má použít:
{control myControl 2}
public function render($id)
{
}
takže mi z toho plyne, že komponenta může mít šablon klidně víc, ale nemyslím si, že můžeš renderovat všechny 3 současně. Pokud potřebuješ 3 šablony současně, tak potřebuješ i 3 komponenty, z nichž každá se stará o to svoje. Jestli jsem teda pochopil správně tvůj problém.
Editoval 22 (15. 6. 2011 8:18)
- crempa
- Člen | 198
Mam jednu komponentu, jeden logicky celek s presne danou funkcnosti, ktera se ale graficky realizuje ze trech oddelenych sablon, protoze je nutne aby bylo mozne jeji render ovlivnovat prave na urovni definice tech sablon.
Vzdy se pouziji vsechny tri sablony, jake to ale budou je dano konkretni instanci dane komponenty.