web-dev-qa-db-ja.com

カスタムログインリダイレクトがhook_user_loginで失敗しました

ユーザーがサイドバーのログインブロックからログインした直後にユーザー編集ページにリダイレクトしようとしています。 hook_user_login を実装しましたが、うまくいきませんでした。 drupal_goto()または$edit['rediect']$_GET['destination']に優先することはできないようです

function mymodule_user_login(&$edit, $account){
    if ( user role is employee and user has not completed profile yet ) {
        // both failed to redirect, although my condition is true
        $edit['redirect'] = 'user/'.$account->uid.'/edit'; 
        drupal_goto('user/'.$account->uid.'/edit');
    }
}

ホームページ(mydomain.com)でログインしようとしましたが、フックでexitを実行すると、URLがmydomain.com/node?destination=nodeに変更されていることがわかりました。サイト情報で私のホームページのパスが空白です。

[編集]
リダイレクトの条件は、ログインしているユーザーが従業員の役割を持ち、彼のプロファイルがまだ完了していない場合です。私のユースケースは this とよく似ていますが、コンテンツプロファイルを使用しません。

$ _GET ['destination']をオーバーライドする方法で問題が解決すると思います。

3
Sithu

drupal_goto() が設定されている場合、_$_GET['destination']_が使用されます。以下は、関数から使用されるコードです。

_  if (isset($_GET['destination']) && !url_is_external($_GET['destination'])) {
    $destination = drupal_parse_url($_GET['destination']);
    $path = $destination['path'];
    $options['query'] = $destination['query'];
    $options['fragment'] = $destination['fragment'];
  }
_

hook_user_login()内に_$edit['redirect']_を設定しても効果はありません。
あなたにできることは、hook_user_login()の_$_GET['destination']_を変更することです。ユーザーが設定したパスに確実にリダイレクトされるようにしたい場合は、モジュールの重みを増やすなどして、フックが最後に実行されるようにする必要があります。

5
kiamlaluno

rules moduleを使用すると、最短の方法があります。 更新:

手順

1- 新しいルールを作成

まず、新しいルールを開始する必要があります。これを行うには、ルール管理センターに移動し、[トリガーされたルール]をクリックして、[新しいルールを追加]タブをクリックします。 「ユーザーがログインしました」というイベントを選択し、「ログイン時にアカウントページにリダイレクトする」というラベルを設定して、「送信」をクリックします。これで、まだ空の新しいルールが作成されました。このルールに追加するすべての条件とアクションは、「ユーザーがログインしました」というイベントで評価されます。

2- 条件を追加条件セクションadd conditionSelect the condition to add選択PhpExecute Custom php code(-PHPフィルターがインストールされていることを確認してください)。条件セクションで状態を確認してください。

3- リダイレクトアクションを作成する

これを行うには、「アクションの追加」リンクをクリックし、「システム」セクションで「ページのリダイレクト」アクションを選択して、「次へ」ボタンをクリックします。トークンモジュールがインストールされている場合は、「ページリダイレクト」アクションでトークンの置換を使用できます。これにより、ユーザーのIDをリダイレクトパスに配置できます。そのため、「ユーザーアカウントページにリダイレクトする」アクションを呼び出し、パスuser/[account:uid]を設定します。 Drupalは常に、現在のページに宛先パラメーターを設定するため、ユーザーがログに記録するとリダイレクトが適用されるようにするには、これをアクティブにする必要があります。オプションをオンにして、[保存]ボタンをクリックします。

2
Yusef

ログイン先 モジュールも同じ機能を提供していると思います。それとは別に、それはまたいくつかのより多くの機能を提供します。試す価値があります。

0
mohit_rocks