Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][XML] Obsługa odpowiedzi XML
Forum PHP.pl > Forum > XML, AJAX > AJAX
troophel
Witam,

zdaję sobie sprawę, że jest masa tutoriali na ten temat, ale mimo niemalże kopiowania przykładów nie udało mi się sprawić, aby mój kod zadziałał.

Robię prostą przeglądarkę zdjęć, nawigacja pomiędzy obrazami napisana jest w AJAXie. Skrypt php pobiera dane dot. obrazka z bazy, po czym generuje kod xml. I wszystko chodzi pięknie jeśli obsługuję odpowiedź poprzez responseText. Niestety muszę odseparować sam obrazek od jego opisu. Obsługę responseXML skopiowałem z książki:

  1. function showImgResponse(obj) {
  2. $('imgLoader').hide();
  3. xmlRoot = obj.responseXML.documentElement;
  4. imgSrcArray = xmlRoot.getElementsByTagName('imgSrc');
  5. imgIdArray = xmlRoot.getElementsByTagName('imgId');
  6. var html = "";
  7. for (var i=0; i<imgSrcArray; i++)
  8. html += imgSrcArray.item(i).firstChild.data;
  9. $('album').innerHTML = "Oto album:" + html;
  10. }


Problem jest taki, że skrypt nie wykonuje nic. Nie wyświetla nawet "Oto album". Samo zapytanie AJAX jest wykonywane, gdyż loader pojawia się i znika, co znaczy, że w.w. funkcja showImgResponse również działa. Najgorsze jest to, że konsola błędów nic nie wyrzuca, ani nie wyrzuca nic php. Naprawdę nie mam już pomysłu.
Tutaj jeszcze przykładowy XML:
  1.      <?xml version="1.0" encoding="utf-8"?>
  2.      <response>
  3.        <photo>
  4.          <imgSrc><img src="img/ruch_run.jpg"/></imgSrc>
  5.          <imgId><input type="hidden" value="4"/></imgId>
  6.        </photo>
  7.        <description>
  8.        Czwarte nasze foto :)
  9.        </description>
  10.      </response>


Dzięki za pomoc,

Pozdrawiam,

Adam
erix
Cytat
Najgorsze jest to, że konsola błędów nic nie wyrzuca, ani nie wyrzuca nic php. Naprawdę nie mam już pomysłu.

Zrób sobie w FireBugu breakpointa zaraz po wykonaniu funkcji, będziesz miał wówczas tracing z zawartością wszystkich obiektów.

Poza tym:
  1. dałeś trochę za mało kodu, sama funkcja, to nieco za mało - przyda się jeszcze MIME zwracanej odpowiedzi i konkretnej strony
  2. domniemam, że korzystasz z jQuery - dlaczego wyciąganie danych z XML robisz na piechotę, skoro możesz wszystko mieć dosłownie jedną linijką...?

Cytat
ale mimo niemalże kopiowania przykładów nie udało mi się sprawić

Właśnie dlatego o wiele lepiej uczyć się z dokumentacji niż z książek autorstwa tzw. programistów, którzy klepią listingi bez sprawdzania.
troophel
Firebug faktycznie zwraca responseXML = null. Nie mam pojęcia natomiast jak sprawić by nie widział tego jako responseText, ale jako XML właśnie. Zacząłem kombinować również z JSON, również bez skutku. Myślałem, że może napisanie wszystkiego z klasy DOMDocument coś da, ale czegoś mi pewnie brakuje. Wkleję może php obsługujący ajaxa:

  1. <?php
  2. if ($_GET['mod'] == "album") {
  3.  $id = $_GET['imgId'];
  4.  if ($_GET['opt'] == 'prev') {
  5.    $query = "SELECT * FROM images WHERE id<'".$id."' ORDER BY id DESC LIMIT 0,1";
  6.  } else {
  7.    $query = "SELECT * FROM images WHERE id>'".$id."' LIMIT 0,1";
  8.  }
  9.  $mysql_query = mysql_query($query);
  10.  
  11.  if (mysql_num_rows($mysql_query)==0) {
  12.    if ($_GET['opt'] == 'prev') {
  13.      $query = "SELECT * FROM images ORDER BY id DESC LIMIT 0,1";
  14.    } else {
  15.      $query = "SELECT * FROM images LIMIT 0,1";
  16.    }
  17.    $mysql_query=mysql_query($query);
  18.    $data = mysql_fetch_array($mysql_query);
  19.  } else {
  20.  $data = mysql_fetch_array($mysql_query);
  21.  }
  22.  
  23.  $xml = new DOMDocument("1.0", "utf-8");
  24.  $xml->formatOutput = true;
  25.  $resp = $xml->createElement("response");
  26.  $xml->appendChild($resp);
  27.  $photo = $xml->createElement("photo");
  28.  $resp->appendChild($photo);
  29.    
  30.    $imgSrc = $xml->createElement("imgSrc");
  31.    $photo -> appendChild($imgSrc);
  32.      $imgSrc->appendChild($xml->createTextNode($data['url']));
  33.    $imgId = $xml -> createElement("imgId");
  34.      $imgId->appendChild($xml->createTextNode($data['id']));
  35.    $photo -> appendChild($imgId);
  36.    
  37.  $description = $xml->createElement("description");
  38.    $description->appendChild($xml->createTextNode($data['description']));
  39.  $resp->appendChild($description);
  40.  echo $xml -> saveXML();
  41. }
  42. ?>


I używam prototype.js.

Dzięki za pomoc,

Pozdrawiam,

Adam
erix
Mam nadzieję, że wywołujesz to tak:
Kod
new Ajax.Request('/your/url', {
  onSuccess: function(transport) {
      // yada yada yada
  }
});


Cytat
Wkleję może php obsługujący ajaxa:

A gdzie Ty ustalasz MIME? Nie ma.
troophel
Jest jak mówisz - wszystko rozbijało się o brak MIME, nie wiem czemu to przeoczyłem sciana.gif .

Niemniej - niezmierne dzięki smile.gif Pomógł -> klik winksmiley.jpg

Pozdrawiam,

Adam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.