Zpětná hodnota z handleru
- err
- Člen | 77
Ahoj,
lze nějak dostat zpět čistý return z handleru? return mi posle celou
stranku.
Příklad:
V šabloně volám ajaxem handler a chci ziskat navratove hodnoty (backdata)
$.ajax ({
url: '/handlers?do=getMyValue',
type: "GET",
data: { 'key_id' : this.id, 'val' : $(this).val()},
success: function(backdata) {
alert(backdata);
},
error: function(backdata) {
alert('ERROR:' + backdata);
}
});
v presenteru:
public function handleGetMyValue($key_id=NULL, $val=NULL) {
if (isAjax() .... ) {
...
return 'Vse OK';
}
}
Proc mi to vraci ale celou html stranku a ne jen „Vse OK“?
- err
- Člen | 77
To u me funkcni nebude. Mam nette 2.0.13. Stale to ale nevysvetluje, proc nemuzu poslat vystup z funkce PHP. Pokud poslu zpatky pres return
return json_encode(array('id' => "1", 'data' => "OK"));
Tak mi to stale vraci celou sablonu. Tady tedy vse pro /handlers.
Editoval err (8. 5. 2016 18:20)
- jiri.pudil
- Nette Blogger | 1032
Stale to ale nevysvetluje, proc nemuzu poslat vystup z funkce PHP.
Protože ta handle metoda je jenom jedním z kroků v životním cyklu presenteru. Tím, že v ní zavoláš return, sice ukončíš její běh, ale požadavek se zpracovává dál, tj. vykreslí se stránka. Tomu můžeš zabránit právě tím, že životní cyklus presenteru v handle metodě ukončíš, např. odesláním odpovědi – JSON ve 2.0.13 takto:
$this->payload = ['id' => 1, 'data' => 'OK'];
$this->sendPayload();
- err
- Člen | 77
Děkuji, ale stále mi to nechce docvaknout. Přeskočím námitku, proč když si chci napsat funkci „Hello world!“ musím projet celý presenter a né pouze ten daný handler, který mi to vypíše. Podle toho, co jsi napsal, to znamená, že si na výpis $this->payload musím napsat další funkci sendPayload(), která mi to returnem pošle? Tuším to správně?
A nelze tedy napsat nikoli handler ale jinou funkci, na kterou se prostě odkážu a která nebude tahat celý cyklus presenteru? A jak bych se na ni z ajaxu odkázal, když ne přes ?do=, což je asi automaticky handler?
Editoval err (8. 5. 2016 18:46)
- CZechBoY
- Člen | 3608
Žádnou metodu sendPayload nepíšeš, v Nette už je.
https://api.nette.org/…ter.php.html#…
- Šaman
- Člen | 2666
Nepoužívej v tom presenteru return. Handler nemá nic vracet – má
něco provést, pak přesměrovat, překreslit, poslat flashmessage, nebo
nějakou odezvu. Komu by ten handler něco vracel?
Takže jestli chceš opravdu vrátit jen string ahoj
, tak ho echni
a pak ukonči presenter pomocí $this->terminate()
. Ale pro
komunikaci s JS je lepši použít třeba tu sendJson()
. Ona už
to ukončí sama. Ale žádný return.
- Šaman
- Člen | 2666
- Říkáš, že ti to hází pětistovku – ty nepoužíváš Tracy, nemáš zapnutý ladicí režim?
- Jakou máš verzi Nette? Aktuální, nebo něco historického?
- Na jakém řádku ti to vyhazuje ten access error? U sendPauload, nebo tam, kde to plníš?
- Práci s payloadem je přímo v dokumentaci, hned ten první příklad.
Editoval Šaman (8. 5. 2016 19:33)
- err
- Člen | 77
Unlink:
Ahoj. Tohle mi vrati zase celou stranku. Alert jsem zrusil, abych nedelal chybu
v parsovani JSON a cely vstup dat davam posilam pres jQuery
$(„#backdata“).append(backdata);
Hodnoty mi to nevypise zadne, ale nacte to celou stranku. Tzn. ze mam sablonu
v sablone.
Zkousel jsem obe moznosti:
Tahle nevrátí žádná data
$this->payload->id = 1;
$this->payload->data = 'OK';
$this->sendPayload();
Tahle zase vrátí jen celou stránku.
$this->payload->id = 1;
$this->payload->data = 'OK';
Šaman:
- Tady je jeste Ladenka. Tu pouzivam, ale u tehle chyby se nic nezobrazi, asi kvuli tomu ajaxu. Chyba je jen v konzoli prohlizece a pak v logu.
- Mam 2.0.13
- Ted, co jsem napsal, chybu nehaze zadnou, ale data nejsou.
- Diky. S dokumentaci mam obas problem, protoze casto zahrnuje priklady, ktere ve starsich nebo naopak v novych verzich nefunguji. Ale ctu ji a snazim se, aby to bylo prvni, kde to hledam. Samozrejme projizdim pred dotazem tak hodinu az nekolik dni Google.
- err
- Člen | 77
Dekuji vsem za pomoc.
$this->payload->id = 1;
$this->payload->data = 'OK';
$this->sendPayload();
Tak tohle uz vraci. Musi se na to pustit parser. Protoze mam i starsi jQuery.
Spravne je tedy v handleru to, co jse uvedli a co je vyse a v ajaxu (pokud je to jen jednoprvkove pole, jak je v prikladu):
$.ajax ({
...
success: function(backdata) {
alert(backdata.data);
},
...
});
Dekuji, vsem jeste jednou diky. Proste jsou veci, ktere jsem v nette nepochopil a nemuzu se dostat pres starsi zpusoby, kdy jsem si napsal funkci, tu jsem si zavolal a pres RETURN si nechal vratit to, co jsem potreboval.
Navic, kdyz return je k tomu stvorene a jakekoli dlasi provadeni by mel sam ukoncit. Nette, jak jsem prochazel nakonec ->terminate() vola take. Takze to vlastne po trech dalsich funkcich ukonci sam.
Hodne se mi libi latte a jeho makra a navazani na presenter. Vlastni funkce se mi zatim nezazily. Zda se mi, ze to spis odvadi od zvladnuti jazyka nez aby jej to naucilo. Clovek vlastne poradne netusi, co vsechno se taha.
Editoval err (8. 5. 2016 21:03)
- Šaman
- Člen | 2666
return
ale ukončuje jen funkci. ano, handler byl tím returnem
ukončen, byla vrácena hodnota (ale nikomu) a presenter dál pokračoval ve
svém životním cyklu přesně podle dokumentace.
Fce terminate()
ukončí celý tento cyklus – vyhodí výjimku a
ta je zachycena speciální obsluhou. Stejnou výjimku vyhazují všechny
sendResponse()
, sendJson()
, …
Nezapomeň, že handler je ten parametr v url ?do=getMyValue
,
když nepřeruší životní cyklus, tak se provede tento signál a dále se
pokračuje na render metodu (v tomto případě asi
renderHandlers
), která vrátí latte šablonu.
- Šaman
- Člen | 2666
Jen teda poslední – na JSON je ideální ta
sendJson(array|Object)
, připravíš si pole (může být i hodně
rozsáhlé) a pošleš jako json. Ten payload je spíš univerzální nástroj
pro komunikaci, zapisují se do něho snippety (asi proto není možné ho
přepsat), klidně tam může být půlka věcí nativní z Nette a půlka
tvoje. Pomocí sendJson()
metody presenteru rovnou odešleš JSON a
ukončíš životní cyklus.
- Jan Mikeš
- Člen | 771
Jen pro úplnost, jak již psal @err výše, ve 2.0.13
sendJson()
ještě není.
Funkční příklad s JsonResponse a bez Payloadu ve 2.0.13 by tedy vypadal takto:
use Nette\Application\Responses\JsonResponse;
public function handleGetMyValue()
{
if ($this->isAjax()) {
$this->sendResponse(new JsonResponse(array(
"id" => 1,
"data" => "Ok",
)));
}
}
- err
- Člen | 77
Ahoj,
to, co jsem napsal v podekovani skutecne funguje a zdarne to uz pouzivam stale
ve verzi 2.0.13
Soucasne plati, ze ve starem jQuery 1.10.2 jeste neni parseJSON(), ale to
nevadi, protoze jsou vracena data funkcni. V tom uvedenem popise by tedy
alert(backdata.data) vyhodil alert okno s textem „OK“;
Take plati, ze $this->payload lze rozsirovat asi dle libosti. Ja to pak upravil az na:
$this->payload->id = 1;
$this->payload->message = 'OK';
$this->payload->value = $hodnota_zpet;
$this->sendPayload();
Znovu dekuji za pomoc. Hledal bych to hodiny, ne-li dny.
Abych ale neotalel, ted uz pro zmenu resit tvrdsi orisek. Pouzit hodnoty jedne
tabulky jako hlavicky sloupcu ve vypisu, hodnoty z druhe tabulky, jako hlavicky
radku a hodnoty z treti tabulky pak dle vazeb id nazvu sloupcu a id nazvu radku
vypsat. Je to takova ta tabulka zapasu a vysledku a oddilu. Docela si s tim
uzivam :-)