フォームを送信した後にページにリダイレクトする方法


24

フォームを表示するカスタムモジュールがあります。

フォームを送信したら、ユーザーを別のページにリダイレクトしたいと思います。

どうやってやるの?

回答:


31

送信ハンドラーで

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);

これを行う別の方法はありますか?リダイレクトする必要があるフォームは、独自の#submitハンドラーで構築されているため(送信ハンドラーはカスタムモジュールに配置されません)、コードにアクセスできません。
カルロスムニズ

@Charlieはform_alterを使用して独自のものを追加します。
googletorp

@Charlie forが主にリンクからアクセス可能な場合、URLに宛先パラメーターを入れます:/my-form?destination=node/123
-tostinni

D7で作業していませんが、そういうものを見つけました。以下の私のメッセージを確認してください。
イグナシオセグラポスティゴ14

D7の回答に感謝し、5年後にD8の回答を更新するために戻ってきました。<3
アリ

17

リダイレクトを妨げる可能性のあるトリガーがいくつかあることに注意してください。

  • $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:リダイレクトなしでフォームを再構築する必要があることを意味します。

7

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


4

Drupal 8で外部URLにリダイレクトするにTrustedRedirectResponseは、次のコードのようにクラスを使用します。

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);

役立つ場合は、このクラスにuseキーワードとその名前空間を含める必要があります。use Drupal\Core\Routing\TrustedRedirectResponse;
SébastienGicquel

2

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 );
}

これが役立つことを願っています


1

以下のためのDrupal 7あなたのようなのparamsでURLにリダイレクトしたい場合someurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.