如何让Drupal在用户注册后重定向到其他页面

3

我有一个Drupal网站,我想根据用户输入的个人资料字段显示不同的欢迎页面。我不能使用全局变量$ user,因为用户没有自动登录(他们必须验证电子邮件地址才能登录)。

在哪里可以添加代码以设置重定向?我尝试了在表单验证器中使用$form['#redirect']和$form_state['redirect'],但没有成功。

3个回答

10
你可以使用logintobogan来获得灵感: logintobogan
#implementation of hook_user
mymodule_user($op) { 
  if ($op == 'login') {
    $_REQUEST['destination'] = '/user/will/be/redirected/here'
  }
}
重要的部分是确保在user.module中最终调用drupal_goto()时,您已经设置了$_REQUEST['destination']
需要注意以下几点:
1. Logintoboggan有很多代码来处理各种边缘情况,比如重定向到/出https。如果您的情况简单,则可以忽略此类代码。 2. 您的模块必须在user.module之后调用,并且可能在其他实现hook_user的模块之后调用,因为它们也可能更改这个全局变量。非常丑陋,但在Drupal中工作的方式就是这样。 3. 不要在任何hook中发出drupal_goto()。特别是不要在hook_user或hook_form_alter中发出。drupal_goto将禁止调用其他钩子; 至少会破坏功能,但通常会破坏数据库。 4. 不要在"_submit"等form_alter回调中发出drupal_goto(),这可能会破坏许多其他模块,甚至可能会破坏您的数据库。

1

与Berke的答案类似,但似乎您只希望这是一次性的。对此,您可以检查$account->access属性以检查其上次登录时间。如果为0,则表示他们第一次登录。

无论是电子邮件验证还是非电子邮件验证,这都应该可以正常工作。

<?php
/**
 * Implements hook_user().
 */
function mymodule_user($op, &$edit, &$account, $category = NULL) {
  switch ($op) {
    case 'login':
      // execute this if they have never accessed the site before
      if ($account->access == 0) {
        // run conditional logic based on profile fields
        // to set destination here
        $_REQUEST['destination'] = 'path/to/welcome-page';
      }
      break;
  }
}
?>

添加一个开关/情况是愚蠢的。考虑用if(($op == 'login') && ($account->access == 0)) {替换它。这将避免很多人大脑炸裂。 - berkes

0

我不建议您基于“想编写自己的模块”来做出决定。像logintoboggan、login-destination这样的规则和模块提供了一些基本的可配置重定向逻辑,但没有什么花哨的东西。如果您需要实际的业务逻辑,那么几行PHP代码是最好的选择。问问自己:我是否需要业务逻辑,例如“如果用户已支付,则跳转到Foo”?然后只需为此创建一个模块即可。 - berkes
我尝试使用这个模块,但它对我没有起作用。总的来说,我对第三方模块感到非常沮丧。几乎总是回归到我自己编写的更简单的模块。 - ingrid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接