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