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()?


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);
  }

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.');
}

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.


Ein Validierungshandler ist keine Implementierung von hook_validate().
Kiamlaluno
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.