AJAX – nevrací JSON ale HTML fragment

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

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

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…

mkoubik
Člen | 728
+
0
-

Pokud vím, tak konstruktor presenteru by se neměl vůbec přetěžovat – použij místo toho metodu startup. Navíc pro plnění šablony jsou render metody.

enzo
Backer | 15
+
0
-

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

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?)

enzo
Backer | 15
+
0
-

hmm, k tomu asi doda vic autor :-) jak jsem psal, kod jsem si upravil, takze ok, ale spis me zajima jestli to do budoucna nebude nejak vyrazne upraveno… ale k tomu co pises jsem se dostal take a to TODO me znervoznuje ;-)