Egoblog.cz - Petr Kobelka

Nette a AJAX záludnost

Nette mě nedávno hodně překvapilo. Člověk by řekl, že si Nette bude upravovat pouze svoje data v AJAXu, ale ono ejhle ne.


PHP | Komentáře (0) | Shlédnuto 3447 × | Vloženo: 25. září 2014

Co se vlastně stalo?

Píšu jeden systém pro zákazníka, který se seskládá z několika modulů. Pro nás budou relevantní pouze dva Admin a Public. Admin modul slouží ke správně obsahu, Public modul slouží k zobrazování dat uživatelům (tohle je zjednodušený pohled pro ilustraci). V administraci mám nějakou funkcionalitu, která si tahá data asynchroně (AJAXem).

Mno a stejnou funkcionalitu jsem potřeboval do public modulu. Mám rád heslo "Do it simply, stupid" a tedy jsem vzal funkcionalitu z adminu a zkopíroval ji do publiku. Provedl jsem @inject potřebných services do presenteru a vše by mělo začín fungovat jako v adminu.

Jsem ale naivní. Pochopitelně se tak nestalo.

Pátrání pokračuje

Začal jsem pátrat po rozdílech, protože stejný kus kódu, který v jednom modulu funguje, v druhém nefunguje. Zkoušel jsem na webu googlit chybu

SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data

Informací s touto chybou je v google relativně dost, ale žádná mi nedokázala odpovědět na moje otázky, proč se moje aplikace Nette tak zlobí na to, že po ní chci, aby si AJAXem natáhla nějaké informace. Různě jinak poskládat funkci v podstatě nešlo, chyba byla vždy na řádku, kde jsem chtěl parsovat JSON kód, který mi sem poslalo PHP z Nette presenteru.

Musel jsem tedy jít o krok výše. Z čeho se skládají stránky, tedy spíše co si stránky natahují za informace. Prioritně jsem zkoumal natahované javascripty.

Chyba nalezena. Nette mě překvapilo

Našel jsem jediný rozdíl a sice v tom, že v modulu Public mám v definici layoutu (ano, pro každý z modulů tu mám vlastní layout, protože každý má trochu jiné rozložení jednotlivch komponent ve stránce) navíc Nette kód pro AJAX. Předpokládal jsem, že v tom problém nebude, přece si Nette bude ošetřovat pouze svoje informace. Mýlil jsem se a problém byl skutečně v tom kódu (je k dispozici níže).

Když jsem našel tuhle informaci, našel jsem celkem rychle i funkční řešení. Problém byl v tom, že díky tomuto kódu se mi všechna data, která jsou z PHP a jsou zpracována funkcí json_encode automaticky dekódují.

Tudíž volání toho, že chci json dekódovat pak nedává smysl, protože je již dekódovaný.

Původní volání funkce:

var objs = jQuery.parseJSON(data);

jsem přepsal následovně:

if  (typeof data == "string")
{
  var objs = jQuery.parseJSON(data);
}
else
{
  var objs = data;
}

a to vyřešilo celý problém. Pokud mi přijde type STRING je třeba data dekódovat. Jinak jsou již dekódována a je vrácen type OBJECT. Níže je ukázka již hotového řešení (vše v IDE Netbeans).

Mě to vzalo asi hodinu práce to celé analyzovat a vyřešit. Doufám, že Vám se to díky tomuto popisu nestane ;-)

Nette - AJAX JQuery kód pro snipety

Přikládám ještě zdrojový kód pro ajaxové volání v Nette. Určitě jej najdete i jinde na webu a děkuji Janu Markovi za jeho napsání. Díky tomuto kódu mají v Nette ajaxové části aplikace budoucnost a daří se mi mít spokojenější zákazníky.

/**
 * AJAX Nette Framwork plugin for jQuery
 *
 * @copyright   Copyright (c) 2009 Jan Marek
 * @license     MIT
 * @link        http://nettephp.com/cs/extras/jquery-ajax
 * @version     0.2
 */

jQuery.extend({
	nette: {
		updateSnippet: function (id, html) {
			$("#" + id).html(html);
		},

		success: function (payload) {
			// redirect
			if (payload.redirect) {
				window.location.href = payload.redirect;
				return;
			}

			// snippets
			if (payload.snippets) {
				for (var i in payload.snippets) {
					jQuery.nette.updateSnippet(i, payload.snippets[i]);
				}
			}
		}
	}
});

jQuery.ajaxSetup({
	success: jQuery.nette.success,
	dataType: "json"
});
Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.