0
是否可以訪問區域模板中已加載的節點?這是爲了防止兩次重複查詢同一個事物。我知道我可以使用node_load
加載節點nid
,如果節點已經加載,它將從靜態緩存中檢索節點。但對於這種情況,我不知道nid
,所以我更喜歡獲取已加載的nid
列表。Drupal 7 - 獲取已加載的節點
PS:使用PDO結果被緩存,即使我多次查詢同一個東西,但仍然希望儘可能地減少數據庫聯繫,所以不會有太多的性能下降。
是否可以訪問區域模板中已加載的節點?這是爲了防止兩次重複查詢同一個事物。我知道我可以使用node_load
加載節點nid
,如果節點已經加載,它將從靜態緩存中檢索節點。但對於這種情況,我不知道nid
,所以我更喜歡獲取已加載的nid
列表。Drupal 7 - 獲取已加載的節點
PS:使用PDO結果被緩存,即使我多次查詢同一個東西,但仍然希望儘可能地減少數據庫聯繫,所以不會有太多的性能下降。
爲什麼不使用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);
}
這是工作的代碼,但快速原型。隨意修改。
你能舉個例子嗎?我已閱讀文檔,但我不知道如何使用此功能。 – Shaokan
好的,我寫下了代碼。希望你能處理它,並理解鉤子和模塊系統。 – larrydahooster