2011-04-17 59 views
6

我使用的视场模板代码(在这种情况下看法视场 - 所有成员 - uid.tpl.php):Drupal - 如何在全局访问数组?

<?php 

$users_friends = flag_friend_get_friends($user->uid); 

$users_friends_ids = array(); 

foreach ($users_friends as $id => $value) {  
$users_friends_ids[] = $id;  
} 


?> 

它基本上得到的用户id朋友并将它们放在一个数组中,这样我就可以检查该字段是否与任何用户标识匹配。

所以我的问题是,我不希望在这个模板(有几个原因),但如果我不,我不能访问该数组。我如何使这个数组全局可访问?

回答

5

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

然后我会创建一个带有静态变量的函数来保存好友数组。

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()在尽可能多的地方,只要你想,和第一返回下面的工作代码将只能得到第一次执行的叫法。

+0

我看到你的另一篇文章,关于你如何使用它。实际上不需要重新创建该数组用户ID。你可以使用这个函数来设置$ users_friends(而不是$ users_friends_ids),然后你可以用下面的命令检查一个特定的用户ID是否存在于该数组中:key_exists($ some_uid,$ users_friends) – Coder1 2011-04-18 09:39:21

+0

你怎么称呼模块,它是通过使用module_invoke?在这里真的很苦恼,你可以看到:( – james6848 2011-04-18 10:22:34

+0

我通常有一个用于通用站点助手功能的模块,但是如果你不习惯使用模块,那么你可以将该函数添加到你的template.php文件中。然后,在每个模板中,你需要访问该用户的ids数组,只需做一些事情,如$ users_friends_ids = mymodule_get_friend_ids(); – Coder1 2011-04-18 10:26:34

2

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 */ 
} 
+1

注意:以上可能是不必要的,我看到Coder1优雅的解决方案在最后简单地丢失了一个返回变量 - 并对其进行了编辑 - 编辑应该在“同行评审”后出现 – James 2011-04-18 20:25:50

+0

干杯。这可能没有必要,但总有一点额外的知识让我的牙齿变得好。 – james6848 2011-04-19 10:10:54