重写Drupal 6中的用户登录提交以重定向经过身份验证的用户

重写Drupal 6中的用户登录提交以重定向经过身份验证的用户,drupal,login,customizing,Drupal,Login,Customizing,我想重定向通过用户登录块登录的用户。我拥有的是一个包含以下代码的模块: 附录,2011年9月3日,15:30h:根据kiamlaluno的建议更改代码 附录,2011年9月3日,17:08h:小补丁:将节点/管理员更改为管理员 附录,2011年9月3日17时24分:删除[] ->代码现在是这样工作的,但不要忘记更改DB中的模块优先级 function _MYMODULE_user_login_submit($form, &$form_state) { global $user;

我想重定向通过用户登录块登录的用户。我拥有的是一个包含以下代码的模块:

附录,2011年9月3日,15:30h:根据kiamlaluno的建议更改代码

附录,2011年9月3日,17:08h:小补丁:将节点/管理员更改为管理员

附录,2011年9月3日17时24分:删除
[]
->代码现在是这样工作的,但不要忘记更改DB中的模块优先级

function _MYMODULE_user_login_submit($form, &$form_state) {
  global $user;
  if ($user->uid == 1) {
    $form_state['redirect'] = 'admin';
  } elseif ($user->uid) {
    $form_state['redirect'] = 'node/add/image';
    return;
  }
}

/**
 * Modifies the outfit and behaviour of the user login block.
 */
function MYMODULE_form_user_login_block_alter(&$form, $form_state) {
    unset($form['#action']);
    // removes the forgot password and register links
    $form['links'] = array();
    // Redirects the user to the image upload page after login
    // This cannot be done by a rule, the rule based redirect is only
    // working for the login page not the user login block.
    $form['#submit'] = array('_MYMODULE_user_login_submit');
} 
它不会重定向用户;似乎只忽略了
\u MYMODULE\u user\u login\u submit()

我已经知道:

  • 我不能使用规则/触发器,因为我不在登录页面上登录,而是在用户登录块上登录
  • 人们总是说:“在帖子上使用Logintobogan”,但我只有“注册时”和“确认时”的重定向选项,但我需要“身份验证时”或“登录后”
  • 无论如何,我不想使用更多的模块,我更喜欢几行PHP
    • 你能试试这个吗

      function user_login_submit_redirected($form, &$form_state) {
        global $user;
        if ($user->uid == 0) { 
          $form_state['redirect'] = 'node/admin';
          drupal_goto('node/admin') ;
        } elseif ($user->uid) { 
          $form_state['redirect'] = 'node/add/image';
          drupal_goto('node/add/image') ;
          return;
        }
      }
      

      您的代码不起作用,因为为表单设置了“#action”属性;在这种情况下,提交表单后重定向表单不起作用

        $form = array(
          '#action' => url($_GET['q'], array('query' => drupal_get_destination())), 
          '#id' => 'user-login-form', 
          '#validate' => user_login_default_validators(), 
          '#submit' => array('user_login_submit'),
        );
      
      要使其工作,您应该首先取消设置
      $form[#action]
      ,然后执行在
      hook\u form\u alter()实现中已经执行的代码

      作为旁注,我将补充:

      • 如果你想确保你的代码有效地将用户重定向到你想要的地方,确保你的模块是最后执行的;如果实现
        hook\u form\u alter()
        的任何其他模块添加表单提交处理程序以将用户重定向到其他页面,并且该模块在您的页面之后执行,那么您的模块将不会产生任何效果。为了确保您的模块在其他模块之后执行,您应该在模块安装期间或在更新挂钩中使用类似于以下的代码。(将“MYMODULE”替换为模块的短名称。)

      • 您可以使用“MYMODULE\u form\u user\u login\u block\u alter()”来代替使用
        MYMODULE\u form\u alter()

      • 您应该附加新的表单提交处理程序,而不是替换现有的表单提交处理程序。这意味着您应该使用
        $form['#submit'][]='user_login_submit_redirected'
      • 在模块中实现的函数应以模块的短名称作为前缀,这意味着“
        MYMODULE\uu
        ”或“
        \umymodule\u
        ”(后者用于专用函数)。不使用此前缀可能会造成与其他模块(如用户模块)的兼容性问题,因为您正在使用的函数的名称以“
        User\uu
        ”开头

      只是一个旁注-管理员有uid 1(您的代码检查0,这可能是匿名用户)。@HenrikOpel:这一点很好。谢谢。非常感谢你的回答和分享你的知识:你的补充笔记对我非常有用。但是我不明白为什么重定向必须控制在表单操作上。因为您发布的代码(相当于用户登录块的当前drupal实现)表明可以使用提交字段进行重定向:drupal函数确实执行重定向。我在第一个代码块中编写的代码是实际使用的
      用户登录块()
      中的代码。该函数将该值用于“#action”,以始终将用户重定向到包含该块的页面,并允许在不使用任何附加函数(如表单提交处理程序)的情况下执行此操作。如果您想重定向使用登录块登录的用户,我认为您唯一的选择是我在回答中描述的。感谢您的澄清,因为user\u login\u submit函数也会使用以下行进行重定向:
      $form\u state['redirect']='user/'$用户->用户标识
      I但操作可能不会更改,因为它可能会触发身份验证,而不是登录后的页面。重定向仅从登录表单发生,而不是从登录块发生。我在Drupal6测试站点中测试了它,同时以匿名用户的身份查看节点;登录后,我没有被重定向到用户页面。我的测试站点没有安装第三方模块;这意味着我描述的行为是Drupal 6的标准行为。我试图遵循您的方法。但它还没有起作用。我不知道如何确保我的代码在所有其他模块中最后运行。谢谢你的建议。但它没有起作用。实际上,我甚至可以在
      global$user之后设置exit()或die()它没有任何效果,正如我所说,它似乎根本没有被调用。
      
      db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE');