我有一个显示表单的自定义模块。
提交表单后,我想将用户重定向到其他页面。
我怎样才能做到这一点?
我有一个显示表单的自定义模块。
提交表单后,我想将用户重定向到其他页面。
我怎样才能做到这一点?
Answers:
在提交处理程序中
Drupal 7:
$form_state['redirect'] = 'url';
Drupal 8:
$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
/my-form?destination=node/123
。
应该注意的是,有一些触发器可能会阻止重定向:
$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
:表示表单无需重新定向就可以重建。对于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);
use
关键字和其命名空间:use Drupal\Core\Routing\TrustedRedirectResponse;
在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 );
}
希望这可以帮助