不使用form_set_error()显示Drupal登录错误消息

时间:2012-08-29 09:42:37

标签: drupal

我创建了一个模块,用于向用户登录块表单添加字段以显示错误。我想在新字段中显示错误,而不是使用form_set_error()。我能够在登录块中看到警告字段。但是当我提交错误时,它不会显示错误。

代码如下。一旦出现错误,我不明白如何刷新表单的值。

function usermoved_form_user_login_block_alter(&$form, &$form_state) {
  $form['warning'] = array(
    '#value' => t('oops'),
    '#weight' => 11
  );
  $form['#submit'][] = 'usermoved_form_submit_code';
}

function usermoved_form_submit_code($form, &$form_state) {
  global $user;
  if (!$user->uid) {
    $form['warning']['value']= "changed to someting";
  }
}

1 个答案:

答案 0 :(得分:0)

您的代码错误:它应该使用$form['warning']['value']而不是$form['warning']['#value']。即使这样做,消息(应传递给t())也不会显示给用户,因为$form不是通过引用传递的,而且它不是表单提交处理程序返回的值,预计不会返回任何价值。

当表单验证处理程序引发错误时,表单提交处理程序将永远不会被调用。如果您正在检查用户ID以查看用户是否尚未登录,则您无法在表单提交处理程序中执行此操作,因为未登录的用户意味着在验证阶段出现错误,并且表单提交处理程序不会被调用。

您可以使用的是表单验证处理程序。

function usermoved_form_user_login_block_alter(&$form, &$form_state) {
  $message = (empty($_SESSION['usermoved_form_user_login_block_alter']) ? t('Initial message') : $_SESSION['usermoved_form_user_login_block_alter']);

  $form['warning'] = array(
    '#value' => $message,
    '#weight' => 11
  );

  $form['#validate'][] = 'usermoved_form_validate_code';
}

function usermoved_form_validate_code($form, &$form_state) {
  if (empty($form_state['uid'])) {
    $_SESSION['usermoved_form_user_login_block_alter'] = t('The error message');
  }
  else {
    unset($_SESSION['usermoved_form_user_login_block_alter']);
  }
}

$form_state['uid']user_login_authenticate_validate()的值集,是Drupal调用的第二个验证处理程序。如果未设置,则表示在Drupal尝试对用户进行身份验证或用户未进行身份验证之前存在一些错误。第一种情况可能发生在用户被阻止时(user_login_name_validate()验证),或者用户尝试了太多时间进行身份验证(请参阅使用user_login_authenticate_validate()验证用户未进行身份验证的flood_is_allowed()尝试太多时间进行身份验证);当用户没有输入正确的密码时,可能会发生后一种情况。 (见user_login_final_validate()。)

附注:

  • 我使用t('Initial message')作为默认消息,但如果您在用户登录前没有向用户显示任何消息,则可以将其替换为''
  • 用户登录块不会显示给已登录的用户。 $user->uid(其中$user是全局变量)总是0,当显示登录块时,以及登录失败时;在显示登录块时检查$user->uid的值没有意义。