サイトの特定のページから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';
_に置き換えても同じ結果が得られました。私はいくつかの同様の質問を見つけましたが、それらの回答のどれも私にとってうまくいきません。誰かが良い解決策を持っていますか?
ユーザー登録フォームは、その検証と送信が、アカウントの作成、確認メールの送信、ユーザーのログインなど、コアの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にすることができます。参照ページやユーザーの役割などの特定の条件を指定して、宛先をそれらに依存させることができます。
送信ハンドラでリダイレクトを設定する必要があると思います。カスタム送信ハンドラを$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!'));
}