このようなajaxハンドラでフォームを設定すると
public function buildForm(array $form, FormStateInterface $form_state) {
//...
$form['actions']['submit'] = array(
//...
'#ajax' => [
'wrapper' => 'custom_form_wrapper',
'callback' => '::ajaxCallback',
],
);
}
submitForm
にリダイレクトを設定しようとしています
public function submitForm(array &$form, FormStateInterface $form_state) {
$url = 'https://example.com';
$form_state->setResponse(new \Drupal\Core\Routing\TrustedRedirectResponse($url, 302));
}
何も起こらず、エラーメッセージは表示されませんが、フォームは処理が終了したようです。
Ajaxパーツがaction:submit配列から取り出されると、フォームは送信時に適切にリダイレクトされます。別に何をすべきか?
ブラウザーのajaxスクリプトはjqueryコマンドを含むjson配列を想定しているため、リダイレクト応答を返すことはできません。そのため、ajaxコールバックから RedirectCommand を返す必要があります。
public function ajaxCallback(array &$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$command = new RedirectCommand('https://example.com');
return $response->addCommand($command);
}
次に、window.locationを割り当ててクライアント側をリダイレクトします。