2011-04-17 50 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