web-dev-qa-db-ja.com

特定のURLから参照された場合、ユーザー登録後にリダイレクト

サイトの特定のページからform_alterで参照されている場合、ユーザー登録を入力した後にユーザーをリダイレクトしようとしています

_function custom_markup_form_alter(&$form, &$form_state, $form_id) {

if($form_id == 'user_register_form' && strpos($_SERVER['HTTP_REFERER'], 
'/resources/price-sheets') > 0 ) {

    $form_state['redirect'] = 'node/50';

    }
}
_

ユーザー/登録ページでdpm($form_state)とすると、_$form_state['redirect'] = 'node/50';_が表示されます。しかし、フォームを送信すると、ホームページにリダイレクトされます。 _$form_state['redirect'] = 'node/50';_を_$_GET['destination'] = 'node/50';_に置き換えても同じ結果が得られました。私はいくつかの同様の質問を見つけましたが、それらの回答のどれも私にとってうまくいきません。誰かが良い解決策を持っていますか?

1
phandolin

ユーザー登録フォームは、その検証と送信が、アカウントの作成、確認メールの送信、ユーザーのログインなど、コアのuser.moduleの多数の関数によってオーバーライドされるという意味で、通常のフォームではありません。フォームリダイレクトの単純なform_alterは、後でログイン関数によってオーバーライドされるため、役立つとは思わないでください。

また、単純に$form_state['redirect'] = 'node/50';$_GET['destination'] = 'node/50';に置き換えることはできません。登録フォームが提供される前に、宛先クエリ文字列をページのURLの一部にする必要があります。したがって、form_alterの一部として追加しても、何も変更されないと思います。あなたができることは:

if($form_id == 'user_register_form' && strpos($_SERVER['HTTP_REFERER'], 
'/resources/price-sheets') > 0 && !isset($_GET['destination'])) {
    drupal_goto('user/register?destination=node/50';
    }
}

または、user.api.phpに詳述されている hook_user_login を使用して、そこにリダイレクトを追加して、ユーザーが正常に登録された(そしてログインした)後に起動することもできます。

他の1つの解決策は、 ログイン先 モジュールを使用することです。

ログイン先モジュールを使用すると、ログイン後、サイトへの登録時(7.x)、ワンタイムログインリンクまたはログアウト時(7.x)にユーザーがリダイレクトされる宛先をカスタマイズできます。宛先は、内部ページまたは外部URLにすることができます。参照ページやユーザーの役割などの特定の条件を指定して、宛先をそれらに依存させることができます。

2
longboardnode

送信ハンドラでリダイレクトを設定する必要があると思います。カスタム送信ハンドラを$formに追加し、カスタム送信ハンドラで$form_state['redirect']を目的の場所に設定します。 form_alterで実行すると、機能しない場合があります。 フォームのリダイレクト を参照してください

function my_redirect_form_my_content_type_node_form_alter(&$form, &$form_state){
  $form['#submit'][] = 'my_redirect_node_form_submit';
}

function my_redirect_node_form_submit($form, &$form_state) {
  $form_state['redirect'] = 'node/10'; // the address of your thank you page
  // if you are really, really determined to force the redirect, even if a destination has been set in the url, add this:  unset($_GET['destination']);
  // you could also add a message (this is in addition to whatever message is produced by the nodeapi function): drupal_set_message(t('Congratulations!'));
}
2
Beebee