如何正确使用form_set_error()?


8

在我的Drupal 7模块中,我有一个表单及其验证处理程序。我用field print render(drupal_get_form('my_form')); tpl.php调用表单;它按预期工作。

问题是输入值错误。

在显示错误消息之前,它需要两次不正确的提交:第一次,我的错误输入周围有红色边框,第二次,显示了错误消息(带有红色边框)。

那么,什么是正确的使用方式form_set_error()


没有drupal_set_error()功能。你确定你不是故意的form_set_error()吗?
kiamlaluno

你是对的!我的意思是form_set_error()!我尝试更新第一篇文章。
druvik

Answers:


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

如果可以帮助您解决此问题,则应将其标记为正确答案。
马尔克斯2012年

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

实际上,这就是我使用的功能。(我从第一篇文章中纠正了错误)。
druvik

1

form_set_error()应该在hook_validate()函数内部调用,如LSU_JBob回答。


验证处理程序不是的实现hook_validate()
kiamlaluno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.