Ich erstelle programmgesteuert viele Knoten. Offensichtlich müssen sie gültig sein, bevor sie gespeichert werden. Solche $node
Objekte 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 mitdrupal_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?
Antworten:
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$form
Parameter 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 denenform_set_error()
auch die Funktion aufgerufen wirdform_error()
.Wenn mehr als ein Knoten validiert ist, müssen Sie
form_set_error(NULL, '', TRUE)
vorher aufrufennode_validate()
und dann vonform_get_errors()
dem Array mit den Fehlermeldungen abrufen. Wenn dies leer ist, gibt es keine Fehlermeldungen.Alternativ können Sie das folgende Snippet verwenden, um zu überprüfen, ob kein Modul nach dem Aufruf einen Fehler gemeldet hat
node_validate()
: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.quelle