【问题标题】:Why doesn't user_load return any values for a user's roles?为什么 user_load 不为用户角色返回任何值?
【发布时间】:2011-04-05 20:42:16
【问题描述】:

所以我在模板中有这段代码:

$thisuser = user_load(array('uid' => '11812'));

据我了解,它应该为 uid 为 11812 的用户返回一个用户对象。该对象应该在此变量中包含该用户的角色数组:

$thisuser->roles

但是那个数组不存在。

我已经使用调试器跟踪了 modules/user/user.module 中的 user_load() 函数,这段代码应该使用该角色数组填充 $user 对象:

  $result = db_query('SELECT * FROM {users} u WHERE '. implode(' AND ', $query), $params);

  if ($user = db_fetch_object($result)) {
    $user = drupal_unpack($user);

    $user->roles = array();
    if ($user->uid) {
      $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
    }
    else {
      $user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
    }
    $result = db_query('SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = %d', $user->uid);
    while ($role = db_fetch_object($result)) {
      $user->roles[$role->rid] = $role->name;
    }
    user_module_invoke('load', $user_info, $user);
  }
  else {
    $user = FALSE;
  }

通过这条线一切都很好:

    $user = drupal_unpack($user);

但是,当我们点击下一行时,应该在 $user 对象中初始化一个空的“角色”数组,什么都没有发生:

    $user->roles = array();

对象中根本没有“角色”数组出现。随后的 db 查询工作正常,并返回正确的角色信息,所以这个 while 循环:

    while ($role = db_fetch_object($result)) {
      $user->roles[$role->rid] = $role->name;
    }

$role->rid 和 $role->name 每次循环都有正确的值,但是 $user->roles 仍然不存在,这里的赋值没有效果。

我正在为此拼命 - 我不知道发生了什么。我知道我可以直接查询 db 以获取用户的角色,如果我真的必须的话,但为什么 user_load() 代码不起作用?

有人知道发生了什么吗?

谢谢。

【问题讨论】:

  • 与问题无关,但您应该只使用 user_load(11812),前者已被弃用,在 Drupal 7 中根本不起作用。
  • 我也试过这样,但没有骰子。安装干净的 Drupal 后问题就消失了,所以我认为它必须是一个模块。
  • 更正:在干净的 Drupal 安装上问题仍然存在。

标签: php drupal drupal-theming


【解决方案1】:

如果您只是执行 user_load(11812) 会怎样?在 Drupal 6 之前,这一直对我有用。

【讨论】:

  • 是的,这也行不通。我想我已经发现它是由一个模块引起的——不确定是哪个模块引起的。但是当我在其他几个 Drupal 安装上执行此操作时,它可以正常工作。
  • 我会为 _user( 调用 hook_user 的模块和可能的错误加载调用进行 grep。尽管我从未经历过从核心加载中删除值的情况。
  • 我会试试的。但这变得更奇怪了。事实证明,它发生在我所有的 Drupal 安装中。但是 user_load() 似乎无法在 $user 对象中插入超过 32 个属性。一旦它达到 32,就不需要进一步添加。我以前从未注意到它,因为我之前从未在 $user->data 中通过 user_load() 中的 drupal_unpack() 函数进行反序列化。现在我做到了,但超过 32 项都失败了。
  • 是的。刚刚在裸drupal安装上试过这个。 $user 对象的属性似乎不能超过 32 个。如果您的 $user->data 属性中的项目数在数据反序列化后将属性总数推到 32 以上,则不会添加任何超过 32 的内容。无法想象是什么原因造成的。
【解决方案2】:

经过一番苦恼,我确定这在 Drupal 中不是问题。这是我愚蠢的调试器,MacGDBp。它有一个错误(或与 Xdebug 插件的 macports 版本的交互)导致对象实例变量在超过 32 个变量时不显示在检查器中。

真傻。

无论如何,如果您使用的是 MacGDBp,请注意这个问题。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多