表单提交后自定义重定向

时间:2011-05-06 08:21:11

标签: drupal forms redirect hook submit

我有一个表单,这是一个默认的块管理表单。这是人们用来编辑块内容,可见性等的标准格式。当用户保存表单时,drupal会将用户重定向到块管理页面。

现在,我想将用户带到另一个页面,例如。提交块管理表单后的主页。有几种方法可以实现这一点,但是drupal建议使用如here所述的hook_alter_form方法

我写了一个名为'formdest'的.module文件,其中包含以下内容:

function formdest_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'block-admin-configure':
    $form_state['redirect'] = '/home';
  break;
}
}

以及随附的.info文件:

; $Id: custom.info,v 1.0 2011/01/01 21:55:00 author Exp $
name = formdest
description = form destination
package = Other
core = 6.x

version = "6.x"
project = "custom"
datestamp = "1229018427"

我的自定义模块显示在模块列表中,我可以启用它,从而激活重定向。但是当我测试它时,drupal仍然将我带到阻止管理页面而不是主页..

firebug或系统日志中都没有错误消息,所以我有点无能为力。你们中的任何一个编码神都有什么想法吗?

5 个答案:

答案 0 :(得分:22)

在hook_form_alter()中添加一个提交处理程序,并在那里设置覆盖。

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'my_form') {
     $form['#submit'][] = 'my_submit_handler';
  }
}

function my_submit_handler(&$form, &$form_state) {
  $form_state['redirect'] = 'home';
}

答案 1 :(得分:3)

它就像1 2 3一样简单

  1. 创建一个只有标题的自定义页面,谢谢你 联系我们现在转到此页面的“URL路径设置”和 取消选中“自动别名”并输入您的自定义页面网址即 谢客。

  2. 删除网络表单的默认网址别名,即[节点:标题]并保存设置。所以你的网页网址是site.com/thank-you

  3. 编辑该网页表单 - >转到表单设置选项卡,在“重定向位置”部分设置“自定义URL”,从步骤1中新创建的页面开始。
  4. 享受!

答案 2 :(得分:1)

我一直在努力根据用户的来源在drupal 6中进行动态重定向,这就是我想出来的,我希望它可以帮助其他人:

function mymodule_form_alter(&$form, &$form_state, $form_id){
   if($need_to_redirect){
        /*add a form field to the form, you could also add this value to a 
              session or cookie,but if the user is logged in/out based on this
              action the session will be rebuilt*/
        $form['my_redirect']=array(
            '#type' => 'hidden',
            '#value'=>isset($form_state['post']['my_redirect'])?$form_state['post']['my_redirect']:trim(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH),'/')
        );
   }
   if(isset($form_state['post']['my_redirect'])){
        /*if there is a redirect set for the form add an extra submit handler,
               this ensures that in cases like a node form our redirect will get
               set last*/
        $form['#submit'][]='my_custom_redirect';
        //unset this so it doesn't override our custom redirect
        if(isset($form['#redirect'])) unset($form['#redirect']);
    }
}
function my_custom_redirect($form,&$form_state){
    $router_item = menu_get_item($form_state['values']['my_redirect']);
    //make sure the user has access to this menu item, if not just ignore it
    if ($router_item && $router_item['access']) {
        $form_state['redirect']=$form_state['values']['my_redirect'];
    }
};

显然$need_to_redirect应该用开关替换,或者根据您的form_alter偏好

进行检查

答案 3 :(得分:0)

在表单更改功能中,不使用$ form ['#submit'] [] = ...,而是使用以下内容:

$form['actions']['submit']['#submit'][] = 'MYMODULE_submit';

请参阅https://www.drupal.org/node/1074616#comment-4218548

答案 4 :(得分:-2)

让我疯狂甚至在每个人的答案中让我感到愤怒的东西是使用form_alter进行重定向更换提交操作并且不是简单地将我的新功能附加到它上面。在我的情况下(以及我读过的很少其他线程),我仍然需要执行表单操作。我只是想在之后的其他地方重定向它。我的重定向工作正常,但我的表单没有提交或数据被保存。

一旦我重新阅读了form_alter文档,我意识到$ form ['actions']是一个数组,因此可以接受其数组的其他操作!对于其他任何苦苦挣扎的人,请不要使用

$ form ['actions'] ['submit'] ['#submit'] [] ='myform_redirect_to_myfunction';

相反,只需使用array_shift或array_unshift将回调附加到$ form数组(取决于您希望函数执行的顺序:

array_shift($ form ['#submit'],'myform_redirect_to_myfunction');

我希望这有助于其他人。