Vynucené vrácení HTML pro AJAX request

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

Ahoj,
chtěl sem se zeptat, jak se dá pro ajax request resp. jQuery volání fce load vynutit vrácení HTML obsahu.

Konkrétně jde o to, že používám twitter bootstrap a potřebuji do modálního okna načíst HTML obsah z adresy která je mířená na akci presenteru. Jenže do něj se mi vrátí jen prázdné snippety, resp. „{"state“:[]}„. Zkoušel jsem si vynutit vrácení obsahu Templaty přes $this->sendTemplate(); , ale setkal jsem se jen s odpovědí “{}".

Díky za tip

ViPEr*CZ*
Člen | 817
+
0
-

Já třeba ajax v Nette používám tak, že když třeba zavolám funkci jQuery load(…);, tak load předám vygenerovaný odkaz v šabloně (přes plink nebo link). V presenteru bych si pak sestavil šablonu a zavolám metodu render nad šablonou a terminate() (pokud jde o akci či view presenteru, tak ani terminate není třeba).

besir
Člen | 170
+
0
-

**@ViPEr*CZ*** No stejnou úvahu sem měl právě i já, ale neznámo proč se mi to chová tak že prostě pošle JSON Response.

Nicméně, dalším bádáním a díky Tvému nakopnutí jsem přišel na to, že toto funguje:

/**
	 * Info render
	 * @author Petr Besir Horáček <sirbesir@gmail.com>
	 */
	public function renderInfo()
	{
		if($this->isAjax())
		{
			$this->getTemplate()->setFile(__DIR__.'/../templates/User/info.latte');
			$this->getTemplate()->render();
			$this->terminate();
		}
	}

… ale proč sakra musim nastavit šablonu? Vzhledm k tomu, že se mi nikde nezobrazí, ani do logu neuloží vyjímka tak nevim jakou se snaží načíst když tam není $this->getTemplate()->setFile(…);

ViPEr*CZ*
Člen | 817
+
0
-

Udělal bych to ještě takto:

public function renderInfo()
{
        if($this->isAjax())
        {
            $this->getTemplate()->setFile(__DIR__.'/../templates/User/info.latte');
            $this->getTemplate()->render();
            $this->terminate();
        } else
            $this->terminate();
}

A navíc pokud jsi v této metodě, tak se automaticky nastaví info.latte ve složce pro aktuální presenter. Takže setFile je pak k ničemu. A pokud obsah v info neobalíš do bloku, který se includuje do @layout.latte, pak ani render a následný terminate v tomto případě není potřeba. Ten v tom else jo, aby v případě, že se na to koukneš neajaxově, došlo k přerušení a vrácení prázdného výstupu.

Editoval ViPEr*CZ* (23. 1. 2013 15:00)

besir
Člen | 170
+
0
-

No jde o to, že teoreticky sem si to myslel take, prakticky to bez setFile(), render() a terminate() vrati jen „{"state“:[]}“.

Proste se to nevim proč i přesto že je to render chová jak handle metoda, ale payload je prazdny.

ViPEr*CZ*
Člen | 817
+
0
-

besir napsal(a):

No jde o to, že teoreticky sem si to myslel take, prakticky to bez setFile(), render() a terminate() vrati jen „{"state“:[]}“.

Proste se to nevim proč i přesto že je to render chová jak handle metoda, ale payload je prazdny.

No asi furt používáte snipety ne?

besir
Člen | 170
+
0
-

ViPErCZ napsal(a):

besir napsal(a):

No jde o to, že teoreticky sem si to myslel take, prakticky to bez setFile(), render() a terminate() vrati jen „{"state“:[]}“.

Proste se to nevim proč i přesto že je to render chová jak handle metoda, ale payload je prazdny.

No asi furt používáte snipety ne?

  1. nevykej mi prosím :D
  2. nepoužívám, resp. v té aplikaci ano, ale né v tomto místě… ten render má a na neajaxové volání vrátí výsledek bez @layoutu
ViPEr*CZ*
Člen | 817
+
0
-

No to bude někde něco divokýho, protože jQuery metoda load na nějakou URL, která se vykoná v nějaký renderXXXX() metodě Presenteru nemůže poslat {"state“:[]} pokud to teda není text v šabloně nebo se to nevykresluje v nějakém echu.

besir
Člen | 170
+
0
-

Tak jako v tý šabloně je prostě na zkoušku jen tohle:

<strong>Fooo</strong>

A v akci to co je výš. Ted mě tak napadá, že eště musim vyřešit to když se to nebude volat ajaxově aby se připojila template. Ale to udělám druhou neajaxovou akcí a vložím do ní šablonu pro ajax. Pač {block content} asi neoIfuju :D