回答:
送信ハンドラーで
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
。
リダイレクトを妨げる可能性のあるトリガーがいくつかあることに注意してください。
$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コールバックでフォームを構築するときに、リダイレクトを防ぐためにajax_get_form()
定義$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);
use
キーワードとその名前空間を含める必要があります。use Drupal\Core\Routing\TrustedRedirectResponse;
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 );
}
これが役立つことを願っています