我创建了一个模块,用于向用户登录块表单添加字段以显示错误。我想在新字段中显示错误,而不是使用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";
}
}
答案 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
的值没有意义。