web-dev-qa-db-ja.com

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

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

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

どうやってやるの?

24
Carlos Muñiz

あなたがする送信ハンドラで

Drupal 7:

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

Drupal 8:

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

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

  • _$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_get_form()は、リダイレクトを防止するためにAJAXコールバックでフォームを作成するときに_$form_state['no_redirect']_を定義します。_$form_state['no_redirect']_はフォームビルダーによって変更しないでください。関数またはフォーム検証/送信ハンドラ。
  • _$form_state['programmed'] === TRUE_:フォームの送信は通常drupal_form_submit()を介して呼び出されたため、リダイレクトを行うとdrupal_form_submit()を呼び出したスクリプトが壊れます。
  • _$form_state['rebuild'] === TRUE_:リダイレクトせずにフォームを再構築する必要があることを意味します。
17
trampjuice

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);
4
DRUPWAY

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

これが役に立てば幸い

2
nessunluogo

drupal 7の場合、someurl?param1=1&param2=2のようなパラメータを使用してURLにリダイレクトする場合

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
1
berramou