我在视图字段模板中使用以下代码(在本例中为views-view-field——all-members——uid.tpl.php):
<?php
$users_friends = flag_friend_get_friends($user->uid);
$users_friends_ids = array();
foreach ($users_friends as $id => $value) {
$users_friends_ids[] = $id;
}
?>
它获取好友的用户id并将其放入一个数组中,这样我就可以检查字段是否与任何用户id匹配
所以我的问题是我不想在这个模板中有这个(出于几个原因),但是如果我不这样做,我就不能访问数组。如何使这个数组全局可访问?
不知道你的"几个原因",我不能说这是否是肯定的答案。我自己的理由可能是我不希望相同的代码执行很多次,我不希望在多个地方有完全相同的代码。
然后创建一个带有静态变量的函数来保存好友数组。
function mymodule_get_friends_ids() {
// pull in the current global user variable
global $user;
// call up the static variable
static $users_friends_ids;
// return if this static var has already been set
if (is_array($users_friends_ids)) {
return $users_friends_ids;
}
// if we hit here, then this function has not been
// run yet for this page load.
// init array
$users_friends_ids = array();
// if user is anon, no need to go on
if (user_is_anonymous()) {
return $users_friends_ids;
}
// get friends array
$users_friends = flag_friend_get_friends($user->uid);
// build ids array
foreach ($users_friends as $id => $value) {
$users_friends_ids[] = $id;
}
return $users_friends_ids;
}
现在,在您的模板中,您可以在任意多的地方调用mymodule_get_friends_ids(),并且第一个返回下面的工作代码只会在第一次调用时执行。
Coder1的建议非常好-它使您避免使用大量垃圾填充全局变量命名空间。这可能是最"优雅"的。如果您是PHP新手,那么它可能不是最容易使用的(我猜如果您很难理解返回数组,可能就是这种情况,但没关系)。
然而,如果这真的是一个优先级,你可能不关心有一个额外的全局变量。
我想我可能在这里陈述的是显而易见的—但是您可以,在执行的几乎任何时候(如果您需要的信息已经生成—例如,$user变量已经填充),这样做:
$GLOBALS['users_friends_ids'] = /* your code goes here */
在你的模板中,你通过…
$friendsArray = $GLOBALS['users_friends_ids'];
或者你可以简单地使用
结构global $user_friends_ids;
当你想初始化变量,或者在函数或类中访问它时(这是你的模板文件的情况-它们在函数内部被调用,所以你需要全球化或使用$GLOBALS
数组,它是"自动"在全局命名空间中活动的所有变量)。
执行此操作最"合乎逻辑"的地方是在使用众多可用钩子之一的模块内,只执行一次此代码。如果此时已经加载了用户对象(不确定,您必须进行测试),hook_init()
可能会为您完成这项工作。但是您可能不想弄清楚如何制作Drupal模块(这并不那么困难)。
如果您在模板中执行此操作(尽管这不是一个好的做法,但许多具有PHP基础知识的Drupal站点所有者将所有内容放在模板中),您将希望知道哪些模板代码在何时被执行。节点模板代码倾向于在页面模板代码之前执行——这是合乎逻辑的,因为否则页面模板中节点内容的变量就不会被填充。
如果您有节点列表,它们将多次调用此代码,因此您最终将执行与Coder1所描述的类似的操作。如果您不想创建自己的小模块,您可以将他编写的函数声明放在主题的template.php文件中,因为它只被调用一次。您不希望将函数声明放在tpl.php文件中,因为它们有时会被多次调用(并且不允许多次声明函数)。
如果你很难理解函数和返回值,你总是可以在你的代码中做这样的事情(这是非常非常不优雅的——但最好是你理解的不优雅的代码,而不是你不理解的优雅代码)。
if(!isset($GLOBALS['users_friends_ids'])) {
$GLOBALS['users_friends_ids'] = /* your code here */
}