Dziś jest wtorek, 7 października 2008 roku (z kalendarza...)

Kłopoty z advAjax

Icon

18.05.2006, 15:47

Webmaster

Komentarze (0)

Powrót

Wczoraj postanowiłem wreszcie zaimplementować obsługę AJAX w Open Power Forms. Pod ręką była akurat biblioteka advAjax oraz formularz z jednego z przykładów, więc zacząłem łączyć to ze sobą. Kod JavaScript nie działa jednak do tej pory, i to z bardzo dziwnego powodu. Teoretycznie powinien on zrobić dokładnie to, co chcę, tj. sprawdzić, jaki jest wynik kontroli umieszczony w nadesłanym z OPF pliku XML. Jednak z niewiadomych powodów advAjax wcale nie przekazuje do kodu obiektu DOMDocument, tylko zwyczajny Document, a ten z kolei przy próbie odwołania się do listy elementów zwróconych metodą getElemenstById() - obiekty HTMLElement niekompatybilne z kodem.

Mój kod JavaScript prezentuje się w ten sposób:

function DoCheck()
{
	document.getElementById("message").innerHTML = '';
	advAJAX.assign(document.getElementById("form1"), {
		parameters:
		{
			"opfAjax": "1"
		},
		onLoading: function(obj)
		{
			var el = document.getElementById("message");
			var m = document.createElement('p');
			el.style.display = 'block';
			var text = document.createTextNode('Trwa dodawanie informacji...');
			m.appendChild(text);
			el.appendChild(m);
		},
		onComplete: function(obj)
		{
			document.getElementById("message").style.display = 'none';
		},
		onSuccess: function(obj)
		{
			var xmlDoc = obj.responseXML;
			// debug
			alert(obj.responseText);
			var opfResult = xmlDoc.getElementsByTagName('opfResult');
			
			if(opfResult.length > 0)
			{
				for(var i = 0; i < opfResult.length; i++)
				{
					// debug
					alert(opfResult.item(0));
				}
				if(opfResult.item(0).nodeValue == 1)
				{
					createMessage("message", 'Dobrze');
				}
				else
				{
					createMessage("message", 'Zle: '+opfResult.length);
				}
			}
			else
			{
				createMessage("message", 'Nieprawidlowe zrodlo! '+opfResult.length);
			}
		},
		onError: function(obj)
		{
			createMessage("message", "Wystapil blad podczas pobierania.");
		}
	});
}
 
function createMessage(id, content)
{
	var el = document.getElementById(id);
	
	// Usun stare te te.
	resetChildren(el);
	
	var m = document.createElement('p');
	el.style.display = 'block';
	m.appendChild(document.createTextNode(content));
	el.appendChild(m);
} // end createMessage();
 
function resetChildren(node)
{
	var i = 0;
	for(i = 0; i < node.childNodes.length; i++)
	{
		node.removeChild(node.childNodes.item(i));
	}
} // end resetChildren();

OPF, w przypadku prawidłowego wypełnienia formularza, generuje na razie prostą odpowiedź:

<opfResponse>
<opfResult>1</opfResult>
</opfResponse>

Dla błędnych danych jest ona dłuższa, gdyż zawiera wynik kontroli każdego z pól oraz ewentualne dane kontrolne. Podejrzewając, że być może problem leży w nagłówkach (notabene ustawionych), zrobiłem na szybko plik noopf.php:

<?php header('Content-type: application/xml;charset=iso-8859-2');
echo '<'.'?xml version="1.0" encoding="iso-8859-2"?'.'>'; ?>
<opfResponse>
<opfResult>1</opfResult>
</opfResponse>

Oczywiście przekierowanie odpowiedzi na niego także nic nie dało - formularz w najlepsze wyświetlał sobie "Źle: 1" oraz informacje, że na liście opfResult mam obiekty HTMLElement, w których nodeValue jest ustawione na wartość null. To oznacza, że PHP nie ma z tym raczej nic wspólnego i coś jest źle albo w moim kodzie, albo w advAjax. Co - nie jestem w stanie powiedzieć, niemniej wypadałoby to odkryć jak najszybciej.

Skoro już jesteśmy przy temacie AJAX oraz OPF, wymienię może tryby, w jakich te technologie będą mogły ze sobą współpracować:

  1. Pełna kontrola z raportem - jeśli dane są poprawne, OPF wysyła też wpisane wartości, aby kod JavaScript mógł jakiś raport utworzyć.
  2. Pełna kontrola bez raportu - jeśli dane są poprawne, wysyłana jest skrótowa informacja, jak powyżej, że wszystko jest OK.
  3. Kontrola wybiórcza - można zlecić sprawdzenie jednego, wybranego pola lub grupy pól.
  4. Kontrola niskopoziomowa - OPF wykonuje kontrolę, ale wysłaniem odpowiedzi musi zająć się już programista (jeżeli chce wysłać niestandardowe dane).

Formularze będą mogły pracować bez żadnych modyfikacji także wtedy, gdy AJAX jest niedostępny.

Powrót

Skomentuj

NickInformacja
E-mailTylko do użytku wewnętrznego.
WWWNie zapomnij o http://
LayoutNapisz tu, czy widzisz dzienny czy nocny layout.
WpisFormatowanie wiki
Internauto, pamiętaj! Wolność to nie samowola - dbaj o kulturę wypowiedzi oraz dyskusji w sieci.

Na Zyxist.com panuje swoboda wyrażania opinii oraz krytyki pod dowolnym adresem. Jedyny warunek: musi być ona kulturalna i rzeczowa. Na chamstwo, prostactwo lub jawne obrażanie kogokolwiek nie ma tu miejsca i takie komentarze są bardzo szybko usuwane. Jeśli zamierzasz polemizować z treścią wpisu, wpierw uważnie ją przeczytaj.

© Tomasz "Zyx" Jędrzejewski 2005 - 2008 | Wykonanych zapytań: 1 | Serwer wirtualny zapewnia