【问题标题】:Accessing user profile variables访问用户配置文件变量
【发布时间】:2010-02-17 18:44:07
【问题描述】:

使用配置文件模块,我创建了一个名为 profile_real_name 的文本字段,用户在注册时填写该字段。如何在 node.tpl.php 中访问这个变量?

我使用dsm($user) 函数输出用户变量,它包含除了profile_real_name的数据之外的所有内容

我还在 phptemplate_preprocess_user_profile 上运行了 dsm($vars),我可以看到它包含一个名为 account 的对象,其中确实包含我需要的信息,但该对象在 $user 变量中不可用。

非常感谢

【问题讨论】:

    标签: php drupal templates preprocessor


    【解决方案1】:

    如果您想在 node.tpl.php 中访问作者的个人资料信息,那么您需要使用 phptemplate_preprocess_node 函数而不是 user_profile 函数。节点预处理函数默认没有 $account 对象,所以你必须加载它:

    这在你的 template.php 文件中的 phptemplate_preprocess_node 函数中:

    if ($vars['uid']) {
      $vars['account'] = user_load(array('uid' => $vars['uid']));
    }
    

    然后您就可以在您的 node.tpl.php 中访问作者的个人资料值。您具体询问的值是:

    print($account->profile_real_name);
    

    但是,听起来您可能希望节点作者的姓名显示为 profile_real_name 值而不是他们的帐户名?

    如果是这样,更有效的方法是覆盖 theme_username 函数。

    这不是您直接询问的内容,因此我不会在这里深入探讨,但 drupal.org 论坛上的这篇文章将是您开始使用 Drupal 5 或 6 的绝佳场所: http://drupal.org/node/122303#comment-204277

    【讨论】:

    • 感谢 ashtonium。也许我错了,但似乎有几种方法可以用 Drupal 实现同样的事情,这对新手来说有点困惑,但我很享受它。
    • 是的,这就是 Drupal 的好处和挫折之一:评估解决挑战的各种可能方法并选择最适合您情况的方法。不过我也喜欢。
    • 我应该将它插入到 mytheme_preprocess_user_profile 函数中吗?谢谢!
    【解决方案2】:

    $account 是您通常称为非全局用户的用户,以避免意外覆盖全局用户,从而导致用户以该用户身份登录。

    我刚刚做了一些检查,解决您的问题的最简单方法是在模板中使用 $account 而不是 $user。

    在模板中使用$user 或像WmasterJ 建议的那样做是错误的。您将发布错误的数据。您将发布登录用户的数据,而不是正在观看个人资料的用户的数据。当您查看除您自己之外的所有其他用户的个人资料时,就会发生此错误。

    预处理函数并不难制作,在你的主题的 template.php 文件中,你只需将 phptemplate 替换为你的主题名称定义的代码。在这种情况下,您不需要更改预处理功能,因为您已经拥有了所需的功能。

    【讨论】:

    • 嗨 googletorp,我仍然很确定如何将变量从 phptemplate_preprocess_user_profile 中取出并放入另一个预处理函数中。老实说,我不完全确定如何创建自己的预处理函数,但我会调查您的回复并阅读有关如何执行此操作的信息。您还知道为什么 WmasterJ 的以下回复被扣分了吗?在 Drupal 中做事有错吗?
    • 嗨 googletorp,我现在明白你的意思了,但我仍然不知道如何访问 $account 数组。我试图查找它,但我找不到任何东西。我将 dsm($account) 放入我的 phptemplate_preprocess_node 中,它什么也没回来。
    • $account 在模板中可用,而不是预处理功能。而且它不是一个数组,而是一个对象。
    【解决方案3】:

    如果您想在 user-profile.tpl.php 中执行此操作,您需要的所有信息都存在于 $account 数组中。

    否则,您可以通过加载基于用户对象的用户对象来访问用户数据(即当前登录的人,或者如果您可以查询数据库并以这种方式获取uid)。

    首先获取当前用户的uid

    $uid = $user->uid;
    

    然后加载一个用户对象:

    // Create user objets based on uid ()
    $user_obj = user_load($user->uid);
    

    然后加载用户配置文件变量:

    // Load profile
    profile_load_profile($user_obj);
    

    现在$user_obj 变量(通过引用profile_load_profile 传递)有一个对象,其中包含可以像这样访问的配置文件信息:

    $user_obj->profile_real_name
    

    希望对你有帮助!

    【讨论】:

    • 您好 WmasterJ,不完全确定您的回复为何被扣分,但我会在查看 googletorp 的回复的同时尝试一下。非常感谢
    • 您好 WmasterJ,您的回复效果很好。我使用您的代码来获取变量,并将其添加到 phptemplate_preprocess_page 中的 $vars 数组中。我对 Drupal 还是很陌生,所以我不确定我在做什么。感谢您的帮助
    • 我认为 googletorp 给我打了分,因为他在回答中说按照我建议的方式这样做会覆盖全球用户。也许您想验证一下,因为它对我很有用,但是我又一次没有验证他在第一句话中所说的话。太好了,它对你有帮助:)
    • 我对你投了反对票,因为你的回答既错误又无效。您的代码引入了一个 OP 没有意识到的错误……然而。另外我没有说使用你的方法会覆盖全局用户。我用 $user 和 $account 解释了这个传统。
    • 你能解释一下这个错误吗?并说如何避免它,现在我很困惑,后来的每个人都不知道错在哪里,但是“正确答案”的勾号仍然会让他们看到我的答案,
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 2017-04-25
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多