フォームが処理されると、の値$form_state['redirect']
がに送信されdrupal_goto()
、drupal_goto()
常に$_GET['destination']
独自の$path
パラメーターよりも優先されます。
完全を期すために、Drupal 6では、独自のヘッダーをhook_exit()
次のように設定せずに運が悪かったのです。
function mymodule_exit($destination = NULL) {
$my_destination = 'foo/bar';
header('Location: ' . url($my_destination));
exit;
}
Drupal 7では、hook_drupal_goto_alter()
この特定のユースケースのために追加されました:
function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
$path = 'foo/bar';
}
Drupal 7のもう1つのオプションは、目的に近いもので、次drupal_get_destination()
を使用して送信ハンドラーの静的キャッシュをリセットすることですdrupal_static_reset()
。
function mymodule_form_submit($form, &$form_state) {
// See note
$form_state['redirect'][] = drupal_get_destination();
$form_state['redirect'][] = 'foo/bar';
unset($_GET['destination']);
drupal_static_reset('drupal_get_destination');
drupal_get_destination();
}
drupal_get_destination()
リセット後すぐに呼び出すので、Drupalはを呼び出すときを含め、ページビルドの残りの部分の宛先パラメーターをまったく気付きませんdrupal_goto()
。
注:$form_state['redirect']
変数を上書きしたくないため、定義のコードを変更しました。他の送信ハンドラーが独自のリダイレクトを定義している場合があります。Drupalは常に配列の最後の項目を使用するためfoo/bar
、宛先パラメーター(およびその時点までに定義された他のすべてのリダイレクト)をオーバーライドする場合は、最後にする必要があります。