AJAX – nevrací JSON ale HTML fragment
- enzo
- Backer | 15
Ahoj,
začal jsem používat Nette framework celkem nedávno a jsem s ním velmi
spokojený. Teď jsem ale narazil na menší problém. Využil jsem příkladu
Fifteen pro pochopení logiky a zpracování AJAX požadavků v rámci
frameworku. Narazil jsem však na problém, že v mé implementaci se nevrací
odpověď zakódovaná jako JSON, ale pouze HTML fragment. Hledal jsem všude
možně v dokumentaci, fóru, ale nic. Tak jsem včera strávil několik hodin
bádáním, páč mi to nedalo. Nakonec jsem zjistil, že při AJAX požadavku
dojde, stejně jako při renderovaní celé stránky, na „echo“ a tím
„skončí“ jakékoli další zpracování skriptu. Používám pro render
následující metodu, viz. příklad Fifteen:
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/XXXControl.latte');
$template->render();
}
Tím „skončením“ myslím, že skutečně nedojde ani na jiné snippety, které v rámci šablony mám zahrnuté. Upravil jsem si proto logiku tak, že všechny mé Control prvky (widgety) dědí nejprve od třídy BaseControl, která mi zajistí správné renderování, tj. pro AJAX požadavky vrací JSON do payload->snippets.
Otázka zní, co dělám blbě, a proč mi metoda render nefunguje rovnou tak easy jako v příkladu Fifteen? Nenapadá někoho něco?
- enzo
- Backer | 15
Tak jsem zdá se úplně náhodou objevil kde je problém.
Takhle vypadá konstruktor když vše funguje Ok.
public function __construct()
{
parent::__construct();
}
A takhle vypadá, když metoda render „nezafunguje“ tak easy.
public function __construct()
{
parent::__construct();
$this->template->something = 'abc';
}
Nejsem nette guru, ale podle všeho, pokud „hrábnu“ na šablonu moc brzy, tak se něco změní a tím pádem už nedojde automaticky ke zpracování snippetu do JSON, ale pouze na echo. Výhodou je, že se takto dá upravit chování, což jsem si upravil i ve své aplikaci :-) Na druhou stranu, je otázka jestli je toto zamýšlená vlastnost a nebo nějaké nekalé chování/bug, které pak může mít i další důsledky…
- enzo
- Backer | 15
jj, tomu rozumím, ale nebavíme se tu o presenteru, ale control prvku, který mám ve vlastní třídě, viz. příklad Fifteen :-)
V presenteru jsem žádný konstruktor nikdy nepoužil, používám jak píšeš startup a ten i klidně přetěžuju a vše funguje Ok.
Editoval enzo (1. 2. 2011 23:18)
- bojovyletoun
- Člen | 667
Tak jsem se po tom pídil: a dostal jsem se až k řádku Presenter::run():198
a latteMacros::renderSnippets():1213
Akorát nechápu, jak „se k tomu dojde“? skončil jsem
u createtemplate. Co kód na obou místech v okolí dělá?
V případě presenteru: proč je tam todo? jaký je současný stav a co to
dělá? co je na tom třeba vylepšit? Proč se renderuje standartní výstup a
pak k tomu JSON? (pro konrolu programátora?)