Jak správně získat zpět json odpověď, nebo aspoň nějakou?
- sidrach
- Člen | 23
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.
- sidrach
- Člen | 23
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.
- sidrach
- Člen | 23
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
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