dedlfix: Update - Neuer Code

Beitrag lesen

Tach!

Aber jetzt möchte ich entweder die Felder rot markieren oder Ausgeben lassen was falsch ist. Nur wie kann ich dieses jetzt machen?

Du musst dazu statt des "success" die Namen der Felder und die dazugehörigen Nachrichtentexte an den Browser schicken. Das Problem dabei ist, wie du das so schickst, dass dum Im Browser erkennen kannst, was Name und was zugehöriger Text ist, damit du daraufhin die Elemente ansprechen kannst.

Zunächst einmal, musst du dir auf der Serverseite die benötigten Informationen zusmamensammeln. Ein einfaches $Fehler-Array reicht dazu nicht, denn da stehen nur die Texte und noch keine Feldnamen dabei. Außerdem musst du dir überlegen, ob du pro Feld immer nur maximal eine Nachricht ausgeben können möchtest, oder ob es beliebig viele Nachrichten sein sollen. Dementsprechend muss erstmal die Datenstruktur zum Sammeln der Fehler aussehen.

$Fehler = [
  'feldname1' => 'text1',
  'feldname2' => 'text2'
];
$Fehler = [
  'feldname1' => ['text11', 'text12'],
  'feldname2' => ['text21', 'text22'],
];

Alternativ kannst du auch die schon gezeigte Struktur nehmen.

Diese schöne Struktur jedenfalls muss nun zum Browser. Und sie wird dir vom jQuerys post() auch bereits ausgepackt und weiterverarbeitungsgerecht zur Verfügung gestellt, wenn du sie "richtig" einpackst, was in dem Fall JSON heißt.

// Variante mit nur einem Text
$.post('senden.php', data, function(msg) {
  if(msg == "success"){ 
    // ...
  } else if (typeof msg == 'object') {
    Object.keys(msg).forEach(function (key) {
      var text = msg[key];
      $('#'+key).append($('<span>').text(text));
    });
  }
});

Das sollte funktionieren, aber schön ist das noch nicht. Denn im Gut-Fall gibt das PHP-Script einen String, im Fehlerfall ein JSON-Objekt zurück. jQuery versucht das zwar entsprechend dem Inhalt zu erraten, doch besser wäre es, wenn es in beiden Fällen JSON wäre.

Die Struktur kann dazu auf PHP-Seite wie folgt aussehen.

$result = [
  'status' => 'success', // oder 'failed'
  'errors' => [
    'feldname1' => 'text1',
    'feldname2' => 'text2'
  ]
];

Und das Javascript muss dazu noch entsprechend angepasst werden.

dedlfix.