コードが間違っています: を使用する代わりに、 を使用$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']
Drupal によって呼び出される 2 番目の検証ハンドラであるuser_login_authenticate_validate()から設定される値です。設定されていない場合は、Drupal がユーザーを認証しようとする前にエラーが発生したか、ユーザーが認証されなかったことを意味します。最初のケースは、ユーザーがブロックされている ( user_login_name_validate() がそれを検証する) か、ユーザーが認証を何度も試行した場合に発生する可能性があります ( flood_is_allowed ( )を使用してユーザーが認証を試行しすぎていないことを確認するuser_login_authenticate_validate( ) を参照)。 ); 後者のケースは、ユーザーが正しいパスワードを入力しなかった場合に発生する可能性があります。( user_login_final_validate()を参照してください。)
補足として:
- デフォルトのメッセージとして使用しましたが、ユーザーがログインする前に表示するメッセージがない場合は、
t('Initial message')
に置き換えることができます。''
- ユーザー ログイン ブロックは、既にログインしているユーザーには表示されません。
$user->uid
($user
はグローバル変数) は、ログイン ブロックが表示され、ログインに失敗した場合は常に 0 です。ログイン ブロックの表示中に の値をチェックして$user->uid
も意味がありません。