提交表单后如何重定向到页面


Answers:


31

在提交处理程序中

Drupal 7:

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

Drupal 8:

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

有替代的方法吗?我需要重定向的表单是使用其自己的#submit处理程序构建的(提交处理程序未放置在我的自定义模块中),因此我无权访问代码。
卡洛斯·穆尼兹(CarlosMuñiz)

@Charlie使用form_alter添加您自己的。
googletorp

@Charlie(如果您的for主要是通过链接访问的),请将目标参数放在URL:中/my-form?destination=node/123
tostinni's

无法在D7上工作,但是我发现可以。在下面查看我的消息。
Ignacio Segura Postigo 2014年

我只想说谢谢您回答D7,然后在5年后回来更新D8的答案。<3
ant

17

应该注意的是,有一些触发器可能会阻止重定向:

  • $form_state['redirect'] === FALSE:如果设置,则表单构建器功能或表单验证/提交处理程序不希望用户被重定向,这意味着drupal_goto()不被调用。对于大多数形式,无论$form_state['redirect']是未定义还是假,重定向逻辑都是相同的。但是,如果未定义它,并且当前请求包含一个“目的地”查询字符串,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;
塞巴斯蒂安·吉凯尔

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,如果您想使用以下参数将其重定向到url,someurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.