Coder1的建议非常好 - 它使您无法用很多垃圾填充全局变量名称空间。这可能是最“优雅”的。如果你对PHP比较陌生,那么它可能不是最容易使用的(如果你很难在返回数组的时候猜测可能是这种情况,但没关系)。
但是,如果这确实是一个优先事项,那么您可能并不在意拥有一个额外的全局变量。
我想我可能会在这里说明一个明显的问题 - 但是,在几乎任何执行点(只要你需要的信息已经生成 - 例如$ user变量已经被填充),你可以这样做:
$GLOBALS['users_friends_ids'] = /* your code goes here */
在你的模板
然后,您可以通过访问这个...
$friendsArray = $GLOBALS['users_friends_ids'];
或者你可以简单地使用结构
global $user_friends_ids;
当你想初始化变量,或者在一个函数或类中访问它时(这是你的模板文件的情况 - 它们被称为函数内部,所以你需要全局化或使用$GLOBALS
阵列,它是“自动”在全局命名空间中活动的所有变量)。
要做到这一点的最“合逻辑”的地方是在模块内使用众多可用钩子之一来执行此代码只需执行一次。 hook_init()
可能会为你做,如果用户对象已经加载在这一点(不知道,你将不得不测试)。但是你可能不想弄清楚制作Drupal模块(这并不困难)。
如果你在模板内部做这件事(虽然这不是一个好习惯,但很多Drupal网站所有者开始了解PHP的知识将所有内容都放在模板中),所以你会想知道在什么时候执行哪个模板代码。节点模板代码倾向于在页面模板代码之前执行 - 这是合乎逻辑的,因为否则页面模板中节点内容的变量将不会被填充。
如果你有节点清单,他们会多次调用这个代码,所以你最终会做类似Coder1描述的东西。如果你不想创建你自己的小模块,你可以把它写在主题的template.php文件中的函数声明,因为它只被调用一次。你不想在tpl.php文件中放置函数声明,因为它们有时会被调用多次(并且你不允许多次声明函数)。
如果你很难理解函数和返回值,你可以在你的代码中这样做(这是非常非常不雅的 - 但最好是让你理解的不雅的代码比优雅的代码更好)这是你不)。
if(!isset($GLOBALS['users_friends_ids'])) {
$GLOBALS['users_friends_ids'] = /* your code here */
}
我看到你的另一篇文章,关于你如何使用它。实际上不需要重新创建该数组用户ID。你可以使用这个函数来设置$ users_friends(而不是$ users_friends_ids),然后你可以用下面的命令检查一个特定的用户ID是否存在于该数组中:key_exists($ some_uid,$ users_friends) – Coder1 2011-04-18 09:39:21
你怎么称呼模块,它是通过使用module_invoke?在这里真的很苦恼,你可以看到:( – james6848 2011-04-18 10:22:34
我通常有一个用于通用站点助手功能的模块,但是如果你不习惯使用模块,那么你可以将该函数添加到你的template.php文件中。然后,在每个模板中,你需要访问该用户的ids数组,只需做一些事情,如$ users_friends_ids = mymodule_get_friend_ids(); – Coder1 2011-04-18 10:26:34