0

我创建了一个模块,该模块将一个字段添加到用户登录块表单以显示错误。我想在新字段中显示错误,而不是使用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";
  }
}
4

1 回答 1

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没有意义。
于 2012-08-29T23:16:35.273 回答