web-dev-qa-db-ja.com

カスタムAjaxフォームを外部URLにリダイレクトする方法

このような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配列から取り出されると、フォームは送信時に適切にリダイレクトされます。別に何をすべきか?

1
GiorgosK

ブラウザーの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を割り当ててクライアント側をリダイレクトします。

2
4k4