Wie verwende ich form_set_error () richtig?

8

In meinem Drupal 7-Modul habe ich ein Formular und seine Validierungshandler. Ich rufe mein Formular von einer field.tpl.php mit auf print render(drupal_get_form('my_form')); es funktioniert wie erwartet.

Das Problem liegt im Falle eines falschen Eingabewerts.

Vor dem Anzeigen der Fehlermeldung sind zwei falsche Übermittlungen erforderlich: Beim ersten Mal befindet sich ein roter Rand um meine falsche Eingabe, und beim zweiten Mal wird die Fehlermeldung angezeigt (mit dem roten Rand).

Also, was ist der richtige Weg zu verwenden form_set_error()?

Druvik
quelle
Es gibt keine drupal_set_error()Funktion. Bist du sicher, dass du es nicht so gemeint hast form_set_error()?
Kiamlaluno
Sie haben Recht! Ich meine form_set_error ()! Ich versuche den ersten Beitrag zu aktualisieren.
Druvik

Antworten:

6

Formularersteller sollten nicht in einer Vorlagendatei aufgerufen werden, da sie zu spät aufgerufen werden. Wenn Sie aufrufen render(drupal_get_form('my_form')), wurde der Code ausgeführt, der die Fehlermeldungen rendert, und die vom Validierungshandler gemeldeten eventuellen Fehlermeldungen werden in der aktuellen Sitzung von drupal_set_message () gespeichert , von dem aus aufgerufen wird form_set_error().

Der Code zum Drucken der Fehlermeldung befindet sich in der Datei page.tpl.php .

<?php if ($breadcrumb): ?>
  <div id="breadcrumb"><?php print $breadcrumb; ?></div>
<?php endif; ?>

<?php print $messages; ?>

Der Code, in dem drupal_set_message()die anzuzeigenden Nachrichten gespeichert werden, ist der folgende:

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

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }

    // Mark this page as being uncacheable.
    drupal_page_is_cacheable(FALSE);
  }
kiamlaluno
quelle
OK. Ich verstehe, dass die Verwendung form_set_error()in einer Vorlagendatei der falsche Weg ist. Also, was ist der richtige Weg?
Druvik
1
drupal_get_form()sollte nicht in einer Vorlagendatei, sondern in einem Modul aufgerufen werden.
Kiamlaluno
Ok, ich habe es in ein Modul eingefügt und Display Suite verwendet, um es auf meiner Seite anzuzeigen. Vielen Dank.
Druvik
Sie sollten dies als die richtige Antwort markieren, wenn es Ihnen geholfen hat.
Malks
8

Sie sollten stattdessen form_set_error betrachten

Wenn Sie ein Element wie dieses haben:

function my_custom_module_form() {
  $form = array();
  $form['my_element'] = array(
    '#type' => 'textfield',
    '#title' => 'My Text field',
    '#default_value' => 'Some default text.',
  );
  return $form;
}

Führen Sie dies in Ihrer Validierungs-Rückruffunktion aus, wenn Sie feststellen, dass die Werte in $form_state['values']nicht gültig sind

function my_custom_module_form_validate($form, &$form_state) {
  // Do some checking on $form_state['values'], if you don't like it.
  form_set_error('my_element', 'This is the error message that will be displayed.');
}
LSU_JBob
quelle
Tatsächlich ist das die Funktion, die ich benutze. (Ich korrigiere den Fehler aus meinem ersten Beitrag).
Druvik
1

form_set_error()sollte innerhalb Ihrer hook_validate()Funktion aufgerufen werden, wie von LSU_JBob beantwortet.

Amin
quelle
Ein Validierungshandler ist keine Implementierung von hook_validate().
Kiamlaluno