[Prototype/Ajax] Fehler aus PHP wiedergeben

Renegade

Well-known member
ID: 159167
L
3 August 2006
851
77
Hi,

Ich versuche gerade ein kleines Javascript-Script zu schreiben, welches mit Ajax sozusagen im "Hintergrund" eine News löscht.
Da ich nicht alles selbst schreiben will, verwende ich Prototype, Scriptaculous und Smarty.

Bis jetzt sieht meine Javascript Funktion so aus:
PHP:
function delete_news(id, source) {
  new Ajax.Request(source,
    {
      method:'get',
      onSuccess: Effect.BlindUp('news_'+id),
      onFailure: function() { alert('Es ist ein Fehler aufgetreten!') }
    });
}

Und so rufe ich sie dann auf:
PHP:
<a href="#" onClick="delete_news({$data.news_id}, './source/ajax_news.php?area=del&id={$data.news_id}')"><img src="./img/icons/delete.png" alt="löschen" title="löschen" height="16" width="16" /></a>

Das klappt soweit super.
Ich möchte nun aber ein Fehler ausgeben, wenn die PHP Datei ebenfalls ein Fehler ausgibt (z.B. wenn die nötigen Rechte zum löschen fehlen).

Nun zwei Fragen:
Wie mache ich das am besten in der PHP Datei? Habe mir gedacht die Funktion "die" wäre ganz hilfreich.

Wie verarbeite ich dann den Rückgabewert mit Javascript?
 
Wenn Du Prototype >= 1.6.0 verwendest, kannst Du dafür sehr gut den JSON-Header nehmen, den Prototype unterstützt.

Abhängig vom Ergebnis setzst Du in der PHP-Datei den JSON-Status:
PHP:
Header('X-JSON: {success: '.($result?'true':'false').'}');
Mit einer kleinen Anpassung Deines onSuccess-Handlers kannst Du das dann auswerten:
PHP:
onSuccess: function(transport, json) {
  if (json && json.success) {
    Effect.BlindUp('news_'+id); 
  } else {
    alert('Fehler');
  }
}
Somit sehe Deine JS-Funktion folgendermassen aus:
PHP:
function delete_news(id, area, source) {
  new Ajax.Request(source,
    {
      method:'get',
      parameters: {
        area: area,
        id: id
      },
      onSuccess: function(transport, json) {
        if (json && json.success) {
          Effect.BlindUp('news_'+id); 
        } else {
          alert('Fehler');
        }
      },
      onFailure: function() {
        alert('Es ist ein Fehler aufgetreten!');
      }
    });
}
Ich habe noch eine weitere Optimierung eingebaut - Du übergibst die Id sowieso an die Funktion, also erzeug die Parameterliste doch gleich mit in der Funktion und Du sparst Dir das redundante Angeben der Id im Funktionsaufruf.
HTML:
<a href="#" onClick="delete_news({$data.news_id}, 'del', './source/ajax_news.php');">...</a>
Obwohl man auch noch überlegen könnte, auch noch die URL und den Parameter area aus dem HTML ins Javascript zu befördern, aber evtl. brauchst Du die Funktion an anderer Stelle ja auch nochmal mit anderer URL und/oder Parameter.
 
Zuletzt bearbeitet:
Hi,

Wow, danke für die super Hilfe und die Optimierung.
Vielen Dank :)

//Edit: Klappt wunderbar :) Kann dir leider keine Bewertung für den Beitrag geben.