Benutzerdefinierte Validierung für ein Formular?

30

Ich muss einem Formular eine benutzerdefinierte Validierung hinzufügen.

Ich hatte damit gerechnet hook_FORM_ID_validate(), kann aber in der API-Dokumentation keine relevanten Informationen finden.

Wie kann einem Formular eine benutzerdefinierte Validierung hinzugefügt werden?

Gilzero
quelle

Antworten:

57

Sie können einer beliebigen Form eine beliebige Anzahl von Validierungsfunktionen hook_form_FORM_ID_alter()wie folgt hinzufügen :

function mymodule_form_article_node_form_alter(&$form, &$form_state, $form_id) {
  // There will already be some validate handlers added so you need to add to the
  // array rather than overwrite it.
  $form['#validate'][] = 'mymodule_article_form_validate';

  // As mentioned above you can add as many as you want
  $form['#validate'][] = 'mymodule_article_form_validate_2';
}

function mymodule_article_form_validate($form, &$form_state) {
  // Random example, if the title is 'test' throw an error
  if ($form_state['values']['title'] == 'test') {
    form_set_error('title', 'Title cannot be "test"');
  }
}
Clive
quelle
Angenommen, ich habe einem Formular, das bereits über 2 Validierungsfunktionen verfügt, eine benutzerdefinierte Formularvalidierung hinzugefügt. Was ist dann erste Präferenz in Drupal 7?
Guru
Welches ist das erste in der Reihe @Guru
Clive
Wenn das Formular user_registration_form lautet, wird immer "[#validate] => Array ([0] => user_account_form_validate [1] => user_validate_picture)" gespeichert. Angenommen, ich werde eine benutzerdefinierte Validierung hinzufügen. Dann sollte es so aussehen "[#validate] => Array ([0] => user_account_form_validate [1] => user_validate_picture [2] => user_register_validate)". Aber ich möchte zuerst die Funktion "user_register_validate" ausführen.
Guru
Für andere Felder müssen Sie verwenden:if ($form_state['values']['field_custom']['und'][0]['value'] == 'Error') { //throw error }
Chris Happy
Wie wird die Validierung für Größe und Erweiterung auf diese Weise festgelegt? Und noch eine Frage, ob es Ajax-Funktionen wie "Hochladen" und "Entfernen" gibt, wie wir die Validierung dafür handhaben?
Steniya
6

Sie sollten hook_form_alterIhre Funktion verwenden und der #validateEigenschaft hinzufügen .

Countzero
quelle