Jak si nechat samostatně vyrenderovat template

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

Ahoj.

Mám stránku, v ní jQuery, který má za úkol natáhnout data ze serveru.
Představoval by si to tak, že dotaz na konkrentí action vyrenderuje příslušný template, a předá na výstup (pro Ajax). JQuery si tento vyrenderovaný template stáhne, a z něj použije část a tu „vloží“ do stránky.

Problém mám ale s tím vyrenderováním templatu. Nevím jak to obstarat. Na jQuery příjde jako odezva pouze toto: {"state":[]}

Nebo existuje elegantnější způsob, jak natáhnout „kus stránky“, tak aby to šlo třeba i bez layoutu? (jakoby jen ten $content) ?? Potřebuji ta data hlavně přerenderovaná (s použitím Latte filtru)

Děkuji za jakoukoliv pomoc

Editoval tomaass (28. 8. 2010 12:30)

Aurielle
Člen | 1281
+
0
-

Neinvalidoval jsi žádný snippet nebo třeba nemusíš mít správně zavináče…

tomaass
Člen | 74
+
0
-

Pravda. Žádný snippet tam nemam. Nepoužívám ani třídu ajax. Dělám si to sám ručně. Knihovna propojující Nette a Ajax mi kolidovala s jinou knihovnou, kterou používám, proto jsem ji „odstřihl“

bazo
Člen | 620
+
0
-

tak sa potom necuduj, ze ti to nejde

tomaass
Člen | 74
+
0
-

ale nějak to jít musí.

na stránce je jQ kód:

<script>
	jQuery.get("?action=inzert_results" , { "page": param}, function(data) {
		alert(data);
		//alert($(data).find('#results'));
	}, "html");
</script>

a já potřebuju od toho PHP, aby vrátil ten přerenderovaný template. Místo toho to ale vrátí onu „sračku“ s prominutim. Čím to je? Je to nějakým přesměrováním?

Aurielle
Člen | 1281
+
0
-

Ne. Nette pozná, že request je AJAXový a vrátí to, že se žádný snippet nezměnil.
A kdyby ses podělil s tím co ti koliduje, tak bychom to možná mohli vyřešit než aby ses snažil znovu naprogramovat něco, co již naprogramované je a ty to akorát nechceš použít…

Editoval gmvasek (28. 8. 2010 14:15)

tomaass
Člen | 74
+
0
-

No, vzpomínám si, že když ta JS knihovna byla nalinkovaná, tak mi v html nefungoval jQueryjový event

<script>
$(document).ready(function(){
...
...
});
</script>

Editoval tomaass (28. 8. 2010 19:32)

Aurielle
Člen | 1281
+
0
-

Normálně u sebe používám toto:

<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/js/jquery.nette.js"></script>

a kombinaci ještě několika dalších pluginů založených na jQuery a nemám problém.

tomaass
Člen | 74
+
0
-

No, já nevím co mi zlobí. Ale obešel sem to už dávno, a nechci se v tom vrtat. Mam tam nalinkovane jeste dalsi knihovny a vsechno slape jak ma. Me by stacilo vedet, jak to zaridim, aby nette prekousalo template a poslalo ho. Ale jelikoz se furt teto otazce vyhybate, tak hadam, ze to asi nepujde :(

Ondrej
Člen | 110
+
0
-

tomaass napsal(a):

Me by stacilo vedet, jak to zaridim, aby nette prekousalo template a poslalo ho. Ale jelikoz se furt teto otazce vyhybate, tak hadam, ze to asi nepujde :(

ja to dělám tak, že mám proměnnou Presenter::$ajaxMode jako protected a pak ji v action nastavím na FALSE. Tím se vypne ajaxová detekce a pošle HTML výstup místo JSON.

tomaass
Člen | 74
+
0
-

No něco podobného jsem zkoušel, ale v renderu. A nešlo to.
Ted sem to prehodil do action, ale hází to chybu, i když v presenteru to definuju jako protected. Můžu vědět, proč tam máte dvojtečky? To je jako static?

bazo
Člen | 620
+
0
-

tomaass napsal(a):

No, já nevím co mi zlobí. Ale obešel sem to už dávno, a nechci se v tom vrtat. Mam tam nalinkovane jeste dalsi knihovny a vsechno slape jak ma. Me by stacilo vedet, jak to zaridim, aby nette prekousalo template a poslalo ho. Ale jelikoz se furt teto otazce vyhybate, tak hadam, ze to asi nepujde :(

ved predsa musis pouzit snippety

Ondrej
Člen | 110
+
0
-

tomaass napsal(a):

No něco podobného jsem zkoušel, ale v renderu. A nešlo to.
Ted sem to prehodil do action, ale hází to chybu, i když v presenteru to definuju jako protected. Můžu vědět, proč tam máte dvojtečky? To je jako static?

Neni to static, chtel jsem odkazat na tridu Presenter a jeji atribut AjaxMode. https://api.nette.org/…ter.php.html#91

Bohuzel me nettovska implementace private atributu omezuje pri pouzivani javascriptovych ajaxovych knihoven tretich stran, ktere ocekavaji HTML kod, ale nette se pri ajaxovem pozadavku prepne do vystupu JSON, s cimz tyto knihovny nepocitaji. Korektni reseni je nejspis prepsat si metodu Presenter::isAjax() ve svem presenteru, ale pokud mam vic action a jen u nekterych chci potlacit JSON, tak mi prislo vyhodnejsi si private predelat na protected.

newPOPE
Člen | 648
+
0
-

Pokial chces poslat HTML namiesto JSON tak to proste skusit asi takto v actionXXX

<?php

public function actionXXX(...) {

	if($this->isAjax()) {
		$this->template->render();
		$this->terminate();
	}

}

?>

ci to takto pojde na 100% netusim pisem to z hlavy, neviem na co vymyslat ochadzky ;-)

Editoval newPOPE (28. 8. 2010 21:54)

tomaass
Člen | 74
+
0
-

hele zatim to nechce fungovat, ale velice děkuji za cenné podněty. Ještě to skusim pošťourat, kdyby to nešlo, tak se během zítřka ozvu. Zatím děkuju převelice.

tomaass
Člen | 74
+
0
-

Tak je to vyřešeno. Děkuji za spolupráci. Zde je hotové řešení:

<?php
	public function actionInzert_results($param)
	{
	    if($this->isAjax()) {
			// renderuju jen template bez layoutu
			$this->template->setFile(APP_DIR . '/templates/Default.inzert_results.phtml');
			// zavolám metodu pro naplnění hodnot do templatu
			$this->renderInzert_results($param);
			$this->template->render();
			$this->terminate();
	    }
        }
?>

Děkuju

Editoval tomaass (29. 8. 2010 19:03)