你的代码是错误的:$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
没有意义。