Jak správně získat zpět json odpověď, nebo aspoň nějakou?

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

Trochu v tom plavu ale, potřeboval bych pomoct s tímhle:

Mám skript:

<script>
    $('#pokracovatAjax').click(function(event){
       event.preventDefault();
       $.post("{link ulozitDres!}", { 'svg': $('#svg_wrapper').html() }, function(payload){ console.log(payload.test); });
    });
</script>

a handle v presenteru:

public function handleUlozitDres($svg)
{
  if ($this->isAjax()) {
	$ses_svg = $this->getSession('ses_svg');
	$ses_svg->data = $svg;
	$ses_svg->setExpiration('10 minutes');
	//zkoušel jsem:
	$this->payload->test[] = 'Test';
	//i něco takového:
	$this->sendResponse(new Nette\Application\Responses\JsonResponse(array('zprava'=>'uspech')));
	$this->terminate();
  }
}

Když si vypíšu do konzole payload, tak mi to vrátí celý html kód zobrazené stránky, když zkusím tak jak je teď, tak „undefined“. Element s id pokracovatAjax je odkaz s nastavenou třídou ajax. Cílem je dostat informaci o tom, jestli se akce provedla, potřebuji si bez reloadu ukládat do session aktuální stav svg grafiky, kterou uživatel naklikal a nějaké další informace.

one-two
Člen | 80
+
0
-

Šel bych na to takto:

public function handleXXX(){
    $response = array('zprava' => 'uspech');
    $this->sendJson($response);
}

a v JS si dumpni celej payload

sidrach
Člen | 23
+
0
-

one-two napsal(a):

Šel bych na to takto:

public function handleXXX(){
    $response = array('zprava' => 'uspech');
    $this->sendJson($response);
}

a v JS si dumpni celej payload

Dík za odpověď. Bohužel stejný stav, payload vypíše jen kód stránky. Nejspíš jsem někde něco opomenul a nenastavil, nebo nevím.

matopeto
Člen | 395
+
0
-

a $this->isAjax() je true? Je mozne, ze ked to posielas POSTom, tak to nette nedetekuje ako ajax.

sidrach
Člen | 23
+
0
-

matopeto napsal(a):

a $this->isAjax() je true? Je mozne, ze ked to posielas POSTom, tak to nette nedetekuje ako ajax.

Do url se to nevleze, tak moc nemám jinou možnost. Každopádně to vypadá, že se vůbec neprovede ten handle. Ať do něj napíšu cokoliv, nic to neudělá.

sidrach
Člen | 23
+
0
-

Jsem trotl, neměl jsem nalinkovaný nette.ajax.js, to byla asi první zásadní chyba.

sidrach
Člen | 23
+
0
-

Ale se stejným výsledkem :(

akadlec
Člen | 1326
+
0
-

no tak si zkontroluj tu url co voláš ne? jestli se vubec dostaneš na ten handle co chceš.

sidrach
Člen | 23
+
0
-

Jo, ta jede, i v konzoli se mi vypíše požadavek jako OK.

sidrach
Člen | 23
+
0
-

Prostě ne. Nejsem schopen získat cokoliv jiného než výpis html.

Zkoušel jsem nette.ajax.js i jquery.nette.js doplňky, zkoušel jsem různě měnit co posílám jako odpověď, cokoliv dám do handle, tak se asi? neprovede, ale data se postem odeslaly a „odpověď“ se vrátí. Nemá prosím někdo po ruce příklad, šablonu a presenter ve které mu to nějaká obdoba funguje? Většina dokumentovaných příkladů je na snippety. :/

sidrach
Člen | 23
+
0
-

Jupí! Tak se konečně povedlo, chyba byla v tom, že latte makro {link handle!} vrací link jinak než aby ho šlo použít jako parametr url pro jquery $.post. I když jsem poskládat manuálně celý $.ajax, tak to dělalo to samé, nahradil jsem to teda jenom za ‚?do=jmenoHandle‘ a najednou se vrací odpověď správně.

Výsledný kód handleru:
(json responses mám v use)

public function handleUlozitDres($svg)
{
  if($this->isAjax()){
    $ses_svg = $this->getSession('ses_svg');
    $ses_svg->data = $svg;
    $ses_svg->setExpiration('10 minutes');
    $odpoved = array ('něco0'=>'cosi0', 'něco1'=>'cosi1');
    $this->sendResponse(new JsonResponse($odpoved));
  }
}

a jquery:

<script>
    $('#pokracovatAjax').click(function(event){
       event.preventDefault();
       console.log('ajax klik');
       var $svg = $('#svg_wrapper').html();
       $.post('?do=ulozitDres', { svg: $svg }, function(odpoved){ console.log(odpoved); });
       console.log('ajax konec');
    });
</script>

a odpověď : Object { něco0=„cosi0“, něco1=„cosi1“}

Připadám si jako Kryštof Kolombus. :D