1

ユーザー ログイン ブロックを介してログインしたユーザーをリダイレクトしたいと思います。私が持っているのは、次のコードを含むモジュールです。

付録、2011 年 3 月 9 日、15:30h: kiamlaluno のアドバイスに従ってコードを変更しました。

付録、2011 年 3 月 9 日、17:08h: 小さな修正: ノード/管理者を管理者に変更。

付録、3.9.2011、17:24h: 削除[] -> コードは現在このように機能していますが、DB でモジュールの優先順位を変更することを忘れないでください。

function _MYMODULE_user_login_submit($form, &$form_state) {
  global $user;
  if ($user->uid == 1) {
    $form_state['redirect'] = 'admin';
  } elseif ($user->uid) {
    $form_state['redirect'] = 'node/add/image';
    return;
  }
}

/**
 * Modifies the outfit and behaviour of the user login block.
 */
function MYMODULE_form_user_login_block_alter(&$form, $form_state) {
    unset($form['#action']);
    // removes the forgot password and register links
    $form['links'] = array();
    // Redirects the user to the image upload page after login
    // This cannot be done by a rule, the rule based redirect is only
    // working for the login page not the user login block.
    $form['#submit'] = array('_MYMODULE_user_login_submit');
} 

ユーザーをリダイレクトしません。_MYMODULE_user_login_submit()単に無視されているようです。

私がすでに知っていること:

  • ログインページではなくユーザーログインブロックでログインしているため、ルール/トリガーを使用できません
  • 投稿では常に「logintoboggan を使用する」と言われますが、「登録時」と「確認時」のリダイレクト オプションしかありませんが、「認証時」または「ログイン後」が必要です。
  • とにかく、私はこれ以上モジュールを使いたくありません。私は数行の PHP を好みます。
4

2 に答える 2

1

user_block_login()がフォームの「#action」プロパティを設定するため、コードは機能しません。その場合、送信後にフォームをリダイレクトしても機能しません。

  $form = array(
    '#action' => url($_GET['q'], array('query' => drupal_get_destination())), 
    '#id' => 'user-login-form', 
    '#validate' => user_login_default_validators(), 
    '#submit' => array('user_login_submit'),
  );

これを機能させるには、まず unset$form[#action]を設定してから、実装で既に実行しているコードを実行する必要がありますhook_form_alter()

補足として、以下を追加します。

  • コードがユーザーを目的の場所に効果的にリダイレクトすることを確認したい場合は、モジュールが最後に実行されるようにしてください。実装する他のモジュールがhook_form_alter()フォーム送信ハンドラーを追加してユーザーを別のページにリダイレクトし、そのモジュールがあなたのモジュールの後に実行された場合、あなたのモジュールは何の効果もありません。モジュールが他のモジュールの後に実行されるようにするには、モジュールのインストール中または更新フックで次のようなコードを使用する必要があります。(「MYMODULE」をモジュールの短い名前に置き換えます。)

    db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE');
    
  • を使用する代わりにMYMODULE_form_alter()、フォーム ID を確認する必要がない `MYMODULE_form_user_login_block_alter() を使用できます。

  • 既存のフォーム送信ハンドラーを置き換えるのではなく、新しいフォーム送信ハンドラーを追加する必要があります。これは、 を使用する必要があることを意味します$form['#submit'][] = 'user_login_submit_redirected';
  • モジュールに実装された関数には、モジュールの短い名前を前に付ける必要があります。これは、" MYMODULE_" または " "を意味します_MYMODULE_(後者はプライベート関数用です)。このようなプレフィックスを使用しないと、ユーザー モジュールなどの他のモジュールとの互換性の問題が発生する可能性があります。これは、使用している関数の名前が「user_. 」で始まるためです。
于 2011-09-03T10:31:50.613 に答える
-1

これを試してもらえますか

function user_login_submit_redirected($form, &$form_state) {
  global $user;
  if ($user->uid == 0) { 
    $form_state['redirect'] = 'node/admin';
    drupal_goto('node/admin') ;
  } elseif ($user->uid) { 
    $form_state['redirect'] = 'node/add/image';
    drupal_goto('node/add/image') ;
    return;
  }
}
于 2011-09-03T08:44:42.750 に答える