Odoslanie JSON-u so snippetmi bez AJAX requestu
- wacco
- Člen | 11
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
Otázka byla na mě moc dlouhá, takže jsem ji nepřečetl celou, ale podívej se na sendPayload.
- wacco
- Člen | 11
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.
- nanuqcz
- Člen | 822
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
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();
}
}
- wacco
- Člen | 11
_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
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
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
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
HosipLan napsal(a):
Proč bys měl přetěžovatisAjax
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
Máš pravdu, je to potřeba :) Každopádně, čistější by bylo posílat tu hlavičku.