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

时间:2011-04-17 22:32:54

标签: php drupal drupal-6 drupal-views

我在视图字段模板中使用此代码(在本例中为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匹配。

所以我的问题是我不希望在这个模板中有这个(由于一些原因),但如果我不这样做,我就无法访问该数组。如何使这个数组全局可访问?

2 个答案:

答案 0 :(得分:5)

在不知道你的“几个原因”的情况下,我不能说这是否是肯定的答案。我自己的理由可能是我不希望相同的代码执行很多次,而且我宁愿在多个地方没有相同的代码。

然后我会创建一个带有静态变量的函数来保存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(),第一次返回下面的工作代码只会在第一次调用时执行。

答案 1 :(得分:2)

Coder1 的建议非常好 - 它可以防止您使用大量垃圾填充全局变量命名空间。它可能是最“优雅”的。如果你是PHP的新手,它可能不是最容易使用的(我猜可能是这种情况,如果你很难理解返回数组,但没关系)。

但是,如果这确实是一个优先事项,那么您可能不关心是否有一个额外的全局变量。

我想我可能会在这里说明显而易见的事情 - 但是你可以在执行的任何时候(如果你已经生成了所需的信息 - 例如,已经填充了$ user变量),请执行以下操作:< / p>

$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 */
}