【问题标题】:Custom redirect after form submit表单提交后自定义重定向
【发布时间】:2011-05-06 08:21:10
【问题描述】:

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

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

我编写了一个名为 '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 仍然将我带到块管理页面而不是主页..

萤火虫或系统日志中都没有错误消息,所以我有点无能为力。各位编码大神有什么想法吗?

【问题讨论】:

    标签: drupal forms redirect hook submit


    【解决方案1】:

    在 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';
    }
    

    【讨论】:

    • 感谢Yorirou 的建议,我刚刚修改了模块并添加了提交处理程序。但是重定向仍然没有带我回家,并且再次没有错误。我开始认为我可能使用了错误的表单 ID 或类似的东西,我会做更多的调试
    • edit - 对,Yorirou 的 sn-p 有效(我以前的方法似乎也有效),问题是我没有在表单 id 中使用下划线。当我用下划线替换连字符时,一切都像魅力一样。
    • 可以节省一些时间的小技巧:如果表单重定向不起作用,请确保 $form_state["rebuild"] = FALSE;
    • 我有一个问题:如何重定向到上一页? $form_state['redirect'] = ???
    【解决方案2】:

    它就像 1 2 3 一样简单

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

    2. 删除 Web 表单的默认 URL 别名,即 [node:title] 并保存设置。这样您的页面网址将是 site.com/thank-you

    3. 编辑该 Web 表单 -> 转到表单设置选项卡,在“重定向位置”部分中,将“自定义 URL”设置为您在步骤 1 中新创建的页面。

    享受吧!

    【讨论】:

      【解决方案3】:

      我一直在努力根据用户的来源在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 偏好进行检查

      【讨论】:

      • 是的完美解决方案,因为表单更改不应该影响其他地方相同表单的表单提交
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        在每个人的回答中让我发疯甚至让我有点生气的是,使用 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');

        我希望这对其他人有帮助。

        【讨论】:

        • 只是为了解释为什么这被否决了:(a) 上面的答案不能取代现有的提交操作(如果你发生了这种情况,你做错了); (b) 您的建议 - 在提交按钮上更改/添加 #submit 功能 - 与在主表单上更改/添加 #submit 功能不同;并且 (c) 情绪化是无益的(尤其是当你不正确的时候)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2013-04-13
        • 1970-01-01
        相关资源
        最近更新 更多