如何在用户注册后使Drupal重定向到页面

时间:2011-04-13 13:04:22

标签: php drupal

我有一个Drupal网站,我想显示不同的欢迎页面,具体取决于我的用户输入的个人资料字段。我无法使用全局$ user变量,因为用户不会自动登录(他们必须在他们登录之前使用他们的电子邮件地址)。

我可以在哪里添加代码来设置重定向? 我在形式验证器中尝试使用$ form ['#redirect']和$ form_state ['redirect'],但这不起作用。

3 个答案:

答案 0 :(得分:10)

您可以使用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. 不要在任何钩子中发出drupal_goto()。特别是hook_user或hook_form_alter。 drupal_goto将禁止其他钩子被调用;至少打破功能,但经常破坏你的数据库。
  4. 不要在form_alter回调中发出drupal_goto(),例如“_submit”,这可能会破坏许多其他模块甚至可能损坏您的数据库。

答案 1 :(得分:1)

与伯克的答案类似,但似乎你只是希望这是一次性的事情。为此,您可以检查$ account->访问属性以检查他们的上次登录。如果为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;
  }
}
?>

答案 2 :(得分:0)

我建议您使用Login Destionation module,或者您可以使用Rules模块redirect action,这可能是您的目的。

以防您不想编写自己的自定义模块: - )