フォームを表示するカスタムモジュールがあります。
フォームを送信したら、ユーザーを別のページにリダイレクトします。
どうやってやるの?
あなたがする送信ハンドラで
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
リダイレクトを妨げる可能性のあるトリガーがいくつかあることに注意してください。
$form_state['redirect'] === FALSE
_:設定されている場合、フォームビルダー関数またはフォーム検証/送信ハンドラーはユーザーのリダイレクトを望まないため、drupal_goto()
は呼び出されません。ほとんどのフォームでは、_$form_state['redirect']
_が未定義かFALSEかに関係なく、リダイレクトロジックは同じです。ただし、それが定義されておらず、現在のリクエストに「宛先」クエリ文字列が含まれている場合、drupal_goto()
は代わりにその指定された宛先にリダイレクトします。 _$form_state['redirect']
_をFALSE
に設定するだけで、リダイレクトが防止されます。$form_state['no_redirect'] === TRUE
_:設定すると、フォームを最初に作成したコールバックは、_$form_state['redirect']
_のリダイレクト値に関係なく、リダイレクトを明示的に禁止します。たとえば、ajax_get_form()
は、リダイレクトを防止するためにAJAXコールバックでフォームを作成するときに_$form_state['no_redirect']
_を定義します。_$form_state['no_redirect']
_はフォームビルダーによって変更しないでください。関数またはフォーム検証/送信ハンドラ。$form_state['programmed'] === TRUE
_:フォームの送信は通常drupal_form_submit()
を介して呼び出されたため、リダイレクトを行うとdrupal_form_submit()
を呼び出したスクリプトが壊れます。$form_state['rebuild'] === TRUE
_:リダイレクトせずにフォームを再構築する必要があることを意味します。Drupal 7の場合、カスタムモジュールでこれを試してみましたが、機能しました。テーマで使用することもできます。
function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}
function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}
ところで、私はこのスニペットをここに見つけました: https://Gist.github.com/postrational/5768796
Drupal 8)の外部URLにリダイレクトするには、次のコードのように TrustedRedirectResponse
クラスを使用します。
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
D8では私はこれを好きでした(しかしこれはうまくいきません...以下を参照してください):
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
// Force redirect to "/thankyou" page
$url = "/thankyou";
$path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
if(preg_match('/node\/(\d+)/', $path, $matches)) {
$form_state->setRedirect('entity.node.canonical',
array('node' => $matches[1])
);
}
}
編集/
モジュールが送信された後にsetRedirect/setRedirectUrlが機能することを私は見逃していたので、これはD8での私の解決策です:
/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
$form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}
function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
// Force redirect to "/sent"
$dest_url = "/sent";
$url = Url::fromUri('internal:' . $dest_url);
$form_state->setRedirectUrl( $url );
}
これが役に立てば幸い
drupal 7の場合、someurl?param1=1¶m2=2
のようなパラメータを使用してURLにリダイレクトする場合
$query = array(
'param1' => '1',
'param2' => '2',
);
$form_state['redirect'] = array(
'someurl',
array(
'query' => $query,
'fragment' => 'hash_fragment',
),
);