Einen Knoten programmgesteuert validieren?


7

Ich erstelle programmgesteuert viele Knoten. Offensichtlich müssen sie gültig sein, bevor sie gespeichert werden. Solche $nodeObjekte haben CCK-Felder, die mit benutzerdefinierten Feldern gemischt sind.

Da die Validatoren nur a setzen form_set_error()und das Validierungsergebnis kaum zurückgeben, muss ich die Formular-API durchgehen, um zu wissen, ob ein Knoten gültig ist, oder so scheint es.

Ich rufe node_validate()dann an form_get_errors()(was wiederum anruft form_set_error()).

Bei diesem Ansatz scheint es mehrere Probleme zu geben:

  • form_set_error()setzt eine Nachricht mit drupal_set_message(); Für Dinge wie cron (ein Benutzer ohne Sitzung) werden verwaiste persistente Fehlermeldungen zur Datenbank hinzugefügt (sie werden niemals gedruckt und daher niemals gelöscht).
  • Das zurückgegebene Fehlerarray wird erstellt, um in einem mehrdimensionalen Formulararray verwendet zu werden. Besonders bei CCK-Feldern muss ich ziemlich tief graben, um den tatsächlichen Fehler zu finden.
  • Ich möchte nur einen Knoten speichern, daher bin ich nicht an einem benutzerbezogenen Formular interessiert. Die Verwendung der Formular-API fühlt sich einfach falsch an.

Gibt es eine einfachere, elegantere Methode?


Ist das Problem, dass Ihre von Ihnen verwendete Datenquelle möglicherweise ungültige Daten enthält, oder nur, dass Sie versuchen, Ihren eigenen Code zu validieren?
mpdonadio

Ich möchte nur vermeiden, Knoten zu speichern, die "ungültig" sind, je nachdem, was definiert, ob sie gültig sind. Wenn beispielsweise ein Bild erforderlich ist, kann davon ausgegangen werden, dass das Thema dieses Bild unabhängig davon rendern kann. Wenn meine Importeure beginnen, Knoten ohne diese Bilder zu speichern, druckt das Thema fehlerhafte Bildlinks.
berkes

Antworten:


5

Es gibt keine anderen Möglichkeiten, da die Hooks, die die Module zur Validierung eines Knotens implementieren müssen, hook_validate()(wenn das Modul einen Inhaltstyp implementiert) und hook_nodeapi ('validate') (für alle anderen Module) sind. Diese Hooks erhalten einen $formParameter und sollen form_set_error () aufrufen, falls ein Validierungsfehler vorliegt.

Der einfachere Weg, um festzustellen, ob für ein Formular Fehler festgelegt wurden, ist die Verwendung form_get_errors(), die das Array mit allen Fehlern zurückgibt, mit denen form_set_error()auch die Funktion aufgerufen wird form_error().

Wenn mehr als ein Knoten validiert ist, müssen Sie form_set_error(NULL, '', TRUE)vorher aufrufen node_validate()und dann von form_get_errors()dem Array mit den Fehlermeldungen abrufen. Wenn dies leer ist, gibt es keine Fehlermeldungen.

form_set_error(NULL, '', TRUE);

// node_validate() call.

$errors = form_get_errors();

if (!empty($errors)) {
  // Some module reported an error.
}

Alternativ können Sie das folgende Snippet verwenden, um zu überprüfen, ob kein Modul nach dem Aufruf einen Fehler gemeldet hat node_validate():

if (!empty($_SESSION['messages']['error'])) {
  // Some module reported an error.
}

Bevor Sie node_validate()von der Cron-Task aufrufen , müssen Sie $_SESSION['messages']['error']ein leeres Array festlegen . Auf diese Weise sind Sie sicher, dass die im Array gemeldeten Fehler durch die Knotenüberprüfungs-Hooks verursacht werden.

$_SESSION['messages']ist die Variable, drupal_set_message()mit der die an die Funktion übergebenen Nachrichten gespeichert werden.

function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
  if ($message) {
    if (!isset($_SESSION['messages'])) {
      $_SESSION['messages'] = array();
    }

    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }
    // …
  }
  // …
}

ist das Arbeit an Drupal 7?
Luzifer

Die Frage ist für Drupal 6; Sie müssen den Code für Drupal 7 leicht ändern.
kiamlaluno

Kannst du einfach eine Anweisung geben, wie es in Drupal 7
Lucifer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.