Php Drupal-如何使数组全局可访问?

Php Drupal-如何使数组全局可访问?,php,drupal,drupal-6,drupal-views,Php,Drupal,Drupal 6,Drupal Views,我在视图字段模板中使用了这段代码(在本例中是视图字段——所有成员——uid.tpl.php): 它基本上获取朋友的用户ID并将它们放入一个数组中,这样我就可以检查该字段是否与任何用户ID匹配 所以我的问题是,我不想在这个模板中包含这个(出于一些原因),但如果我不想,我就无法访问数组。如何使此阵列全局可访问?如果不知道您的“几个原因”,我无法确定这是否是答案。我自己的理由可能是,我不希望同一个代码执行多次,也不希望在多个地方有相同的代码 然后,我将创建一个带有静态变量的函数来保存friends

我在视图字段模板中使用了这段代码(在本例中是视图字段——所有成员——uid.tpl.php):


它基本上获取朋友的用户ID并将它们放入一个数组中,这样我就可以检查该字段是否与任何用户ID匹配

所以我的问题是,我不想在这个模板中包含这个(出于一些原因),但如果我不想,我就无法访问数组。如何使此阵列全局可访问?

如果不知道您的“几个原因”,我无法确定这是否是答案。我自己的理由可能是,我不希望同一个代码执行多次,也不希望在多个地方有相同的代码

然后,我将创建一个带有静态变量的函数来保存friends数组

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文件中,因为它们有时会被多次调用(并且不允许您多次声明函数)

如果您很难理解函数和返回,您可以在代码中执行类似的操作(这是非常非常不雅观的-但是最好有您确实理解的不雅观的代码,而不是您不理解的优雅代码)


我看到了你的另一篇关于如何使用这个的帖子。实际上不需要重新创建用户ID数组。您可以使用此函数设置$users\u friends(而不是$users\u friends\u ID),然后您可以使用以下内容检查该数组中是否存在特定的用户ID:key\u exists($some\u uid,$users\u friends)您如何调用模块,是否使用模块调用?正如你所看到的,这里真的很挣扎:(我通常有一个用于通用站点助手功能的模块,但是如果您还不习惯使用模块,您可以将该函数添加到template.php文件中。您可能应该将函数名中的“mymodule”更改为您的主题名。然后,在需要访问该用户ID数组的每个模板中,只需执行以下操作:$users\u friends\u ids=mymodule\u get\u friends\u ids();我似乎无法在函数中实现这一点。我已经运行了一些简单的测试,以查看函数是否正在被提取,它是否正在被提取,并且如果从函数包装器中提取代码并放入模板中,代码可以正常工作。我将继续插入。(一旦我完成了正在进行的工作,我会将您的回答标记为“已接受”)我编辑以在末尾添加变量的返回。Coder1做了我经常做的事情:忘记在函数末尾返回变量。您需要在//添加行之后添加行……注意:以上可能是不必要的,我看到Coder1的优雅解决方案只是在结尾缺少一个返回变量——并且已经编辑了它——编辑应该d出现在“同行评议后”的欢呼声中。这可能不是必要的,但有一点额外的知识让我全身心投入总是好的。
global $user_friends_ids;
if(!isset($GLOBALS['users_friends_ids'])) {
   $GLOBALS['users_friends_ids'] = /* your code here */
}