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']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も意味がありません。
于 2012-08-29T23:16:35.273 に答える