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


Drupal - How can I make an array globally accessible?

我在视图字段模板中使用以下代码(在本例中为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 */
}