Odoslanie JSON-u so snippetmi bez AJAX requestu

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

Zdravim Vas pani,
Mam taku zaludnu otazku. Je mozne nejak v Nette nastavit spravanie response (odpovede na request) tak aby sa to spravalo ako v pripade ze prisiel ajax request? Jednoduchie povedane: pride ni obycajny request ale odpoved bude ajaxova (teda v json).

Aby ste pochopili o co mi ide. Pracujem na komponente uploadera (pomocou flash). No a funguje to asi nasledovne. Uz tu bolo rozoberane ze taketo flash uploaderi nevedia citat httponly cookie a teda dany request nette nevie prihlasit (pretoze neposle cookie, nie je cookie nie je session). Takze som si spravit tiketovy system overovania. Pred samotnym uploadom urobim request na ziskanie tiketu a potom uz flash posle spolu z upload suborom aj v post parametroch ziskany jednorazovy tiket. Tym som si zabezpecil ze pri tom upload requeste ma takou malou obchadzkou ale predsa prihlasi pokial sa subor nenahra na server. Musim podotknut ze nakolko to nahravanie suboru riesi flash, takze tento request NIE JE ajaxovi (a dokonca to nejde ani vo flashi naastavit aby bol). Po nahrati server samozrejme server odpoveda a tu je kamen urazu. Odpoveda ako na obycajny request a teda posle celu html stranku. Ja by som ale chcel aby mi ale nejako odpovedal v JSON aby som mohol prerenderovat len potrebne snipety. Pretoze tuto odpoved dostavam naspat do nejakeho JS callbacku, kde by som mohol odpoved posunut JS funkcii ktora sa stara o prepisanie potrabnych snipetov na stranke. Niekto by mozno povedal ze si mam proste vytvorit payload a stopnut renderovanie stranky a pride mi JSON. To ano, ale co ak mam snipety inde v komponentach (v nadradenych, atd). Takto neviem poriesit vygenerovanie len tych potrebnych snipetov kade taze po stranke (podla toho, ktore boli invalidovane). Alebo viem?

Obsiahla otazka, dufam ze ju pochopite a mozno mi niekto aj poradi. Dikes

voda
Člen | 561
+
0
-

Otázka byla na mě moc dlouhá, takže jsem ji nepřečetl celou, ale podívej se na sendPayload.

wacco
Člen | 11
+
0
-

voda napsal(a):

Otázka byla na mě moc dlouhá, takže jsem ji nepřečetl celou, ale podívej se na sendPayload.

Na konci popisu mojho problemu som spomenul, preco by to payload nemal byt.

_Martin_
Generous Backer | 679
+
0
-

Můžeš v tom Flashi nastavovat HTTP hlavičky? Kdyby jo, tak můžeš AJAXové chování simulovat ručním nastavením X-Requested-With: XMLHttpRequest.

nanuqcz
Člen | 822
+
0
-

Ahoj, nedávno jsem se docela dlouhou dobu hrabal v Nette šablonách a právě ve snippetech.

A jediné řešení, jak to v Nette rozjet, je opravdu jak psal _Martin_ (nastavit při odesílání X-Requested-With: XMLHttpRequest, pokud to falsh umí). Pokud teda nechceš přepisovat kód Nette (konkrétně kód téhle metody)

Edit: Jeeej sry blbost :-) Ona ta metoda isAjax je public, takže ji v presenteru půjde přetížit ;-) Stačí, abys flashem odesílal URL ve tvaru www.example.com/?foo=bar&use_ajax=1 (důležité je tam přidat to use_ajax=1) a v presenteru pak metodu isAjax() přetížit:

class FooPresenter extends BasePresenter
{
    ...

    public function isAjax()
    {
        if ($this->getParam('use_ajax')) {
            return TRUE;
        } else {
            return parent::isAjax();
        }
    }

    ...
}

Testni, jestli to funguje.

Editoval xxxObiWan (10. 6. 2011 12:50)

bojovyletoun
Člen | 667
+
0
-

Něco podobného jsem řešil v iframe MultiUploaderu

	function isIframe(){
		return (bool) $this->getParam('isifframe');
	}

	function isAjax(){ //overload
		return $this->iframe || parent::isAjax();
	}

	public function sendPayload(){ //overload
		if($this->iframe){
			Nette\Debug::$showBar = false; // ve verzi 2beta ::$bar=false;
			$json = htmlSpecialChars(json_encode($this->payload), ENT_QUOTES);
			$this->sendResponse(new Nette\Application\Responses\TextResponse($json));
		}else{
			parent::sendPayload();
		}
	}
_Martin_
Generous Backer | 679
+
0
-

Hlavičky by mi přišly jako čistější řešení (pokud by šly realizovat), ale tohle je taky pěkné=)

wacco
Člen | 11
+
0
-

_Martin_ napsal(a):

Hlavičky by mi přišly jako čistější řešení (pokud by šly realizovat), ale tohle je taky pěkné=)

Docital som sa aj som testol, ze pri tom uploade vo flashi nie je mozne hlavicky nastavit.

The FileReference.upload() and FileReference.download() methods do not support the URLRequest.requestHeaders parameter.

Vyskusam to asi s tym pretazenim Presenteru, divim sa ze ma to hned nenapadlo.

wacco
Člen | 11
+
0
-

Tak som to vyskusal. Ide to vyborne.
Rozmyslam ale ci by to neslo nejak „automatizovat“. Chcel som komponentu co najjednoduchsiu na nastavovanie. Teraz aby komponenta fungovala musim upravit toto tam, hetno hentam, tamtu tunaka.
Samotna komponenta nedokaze prepisat metodu BasePresneter->isAjax() na zelane spravanie.
Co myslite, slo by to nejako, ci to by som uz vela chcel?

nanuqcz
Člen | 822
+
0
-

A nešlo by to v té komponentě nějak přetížit pomocí extension method ?

$this->getPresenter()::extensionMethod('isAjax', function(){ ... })

Ale teď jen střílím od boku, beztak to takhle nepůjde :-)

Filip Procházka
Moderator | 4668
+
0
-

Opravdu jen střílíš od boku, nepůjde to :)

Proč bys měl přetěžovat isAjax metodu? Udělej si vlastní kontrolu, vlastní metodu.

nanuqcz
Člen | 822
+
0
-

HosipLan napsal(a):
Proč bys měl přetěžovat isAjax metodu?

Protože v přeložené šabloně se rozhoduje, jestli se pošlou snippety, nebo HTML výstup, tímto způsobem:

if ($presenter->isAjax()) {   //zjednodušeně
    //pošlou se snippety
} else {
    //zobrazí se HTML výstup
}

…proto je potřeba přetížit metodu isAjax() presenteru. Nebo mi něco uniká? :-)

Filip Procházka
Moderator | 4668
+
0
-

Máš pravdu, je to potřeba :) Každopádně, čistější by bylo posílat tu hlavičku.