2013-09-27 31 views
0

是否可以訪問區域模板中已加載的節點?這是爲了防止兩次重複查詢同一個事物。我知道我可以使用node_load加載節點nid,如果節點已經加載,它將從靜態緩存中檢索節點。但對於這種情況,我不知道nid,所以我更喜歡獲取已加載的nid列表。Drupal 7 - 獲取已加載的節點

PS:使用PDO結果被緩存,即使我多次查詢同一個東西,但仍然希望儘可能地減少數據庫聯繫,所以不會有太多的性能下降。

回答

0

爲什麼不使用hook_node_load()並將加載的nid附加到數組(可能是全局的),以存儲有關加載節點的信息。

稍後使用node_load_multiple([加載nid數組]),您將獲得緩存中的所有節點!

這就是:

/** 
* Nid array set function 
*/ 
function mymodule_push_nid_array($nid) { 
    global $nid_array; 
    if (!isset($nid_array)) { 
    $nid_array = array(); 
    } 
    // Only push, if nid isn't already set 
    if(!in_array($nid, $nid_array)) { 
    array_push($nid_array, $nid); 
    } 
} 

/** 
* Nid array get function 
*/ 
function mymodule_get_nid_array() { 
    global $nid_array; 
    if(!isset($nid_array)) { 
    return array(); 
    } 
    else { 
    return $nid_array; 
    } 
} 

/** 
* Implements hook_node_load(); 
*/ 
function mymodule_node_load($nodes, $types) { 
    foreach ($nodes as $node) { 
    mymodule_push_nid_array($node->nid); 
    } 
} 

/** 
* Returns already loaded nodes 
*/ 
function mymodule_get_all_loaded_nodes() { 
    return node_load_multiple(mymodule_get_nid_array()); 
} 

/** 
* Demo function (shows only up on next page request!) 
* Don't use THIS HOOK IN PRODUCTION 
*/ 
function mymodule_exit() { 
    $nodes = mymodule_get_all_loaded_nodes(); 
    debug($nodes); 
} 

這是工作的代碼,但快速原型。隨意修改。

+0

你能舉個例子嗎?我已閱讀文檔,但我不知道如何使用此功能。 – Shaokan

+0

好的,我寫下了代碼。希望你能處理它,並理解鉤子和模塊系統。 – larrydahooster