Как правильно использовать form_set_error ()?

8

В моем модуле Drupal 7 у меня есть форма и обработчики проверки. Я вызываю свою форму из field.tpl.php с помощью print render(drupal_get_form('my_form')); это работает как ожидалось.

Проблема в случае неправильного входного значения.

Перед отображением сообщения об ошибке требуется два неверных представления: во-первых, красная рамка обведена неправильным вводом, а во-вторых, отображается сообщение об ошибке (с красной рамкой).

Итак, как правильно использовать form_set_error()?

druvik
источник
Там нет drupal_set_error()функции. Вы уверены, что не имели в виду form_set_error()?
kiamlaluno
Вы правы! Я имею в виду form_set_error ()! Я пытаюсь обновить первый пост.
druvik

Ответы:

6

Создатели форм не должны вызываться внутри файла шаблона, так как они вызываются слишком поздно. Когда вы звоните render(drupal_get_form('my_form')), код, который отображает сообщения об ошибках, был выполнен, и возможные сообщения об ошибках, сообщенные обработчиком проверки, сохраняются в текущем сеансе из функции drupal_set_message () , из которой вызывается form_set_error().

Код для вывода сообщения об ошибке находится в файле page.tpl.php .

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

<?php print $messages; ?>

Код, drupal_set_message()который сохраняет сообщения для показа, следующий:

  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);
  }
киамлалуно
источник
Хорошо. Я понимаю, что использование form_set_error()в файле шаблона является неправильным способом. Итак, каков правильный путь?
druvik
1
drupal_get_form()должен вызываться не внутри файла шаблона, а внутри модуля.
kiamlaluno
Хорошо, я поместил его в модуль и использовал Display Suite, чтобы отобразить его на своей странице. Спасибо.
druvik
Вы должны пометить это как правильный ответ, если он помог вам.
Малкс
8

Вы должны смотреть на form_set_error вместо

если у вас есть такой элемент:

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

в функции обратного вызова проверки сделайте это, если вы обнаружите, что значения в $form_state['values']недопустимы

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
источник
На самом деле, это функция, которую я использую. (Я исправляю ошибку из моего первого поста).
druvik
1

form_set_error()должен вызываться внутри вашей hook_validate()функции в ответ на LSU_JBob.

Амин
источник
Обработчик проверки не является реализацией hook_validate().
kiamlaluno