答案 0 :(得分:3)
除非您将其包含在具有自己的命名空间的函数中,否则请尝试以不同于$node
的方式命名变量 - 例如,将其命名为$my_node
。根据上下文,Drupal核心和其他模块很可能会访问和修改“节点”名称。
如果在函数内部发生这种情况,请尝试以下操作并让我知道输出是什么:
$test_node_1 = node_load(344983); // Any hard-coded $nid that actually exists
echo $test_node_1->nid;
$test_node_2 = node_load(arg(1)); // Consider using hook_menu loaders instead of arg() in the future, but that's another discussion
echo $test_node_2->nid;
$test_node_3 = menu_get_object(); // Another method that is better than arg()
echo $test_node_3->nid;
修改强>
由于您正在使用hook_block,我认为我看到了您的问题 - 块本身正在被缓存,而不是节点。
根据http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_block/6
上的文档,尝试在hook_block中设置BLOCK_NO_CACHE
或BLOCK_CACHE_PER_PAGE
你应该尽可能地避免使用arg() - 它有一点安全风险,并且有更好的方法来完成arg()在模块环境中会做的任何事情。
修改:* 强>
一些示例代码显示了我所指的内容:
function foo_block ($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
$blocks[0] = array(
'info' => 'I am a block!',
'status' => 1,
'cache' => BLOCK_NO_CACHE // Add this line
);
return $block;
case 'view':
.....
}
}
答案 1 :(得分:0)
node_load
使用db_query
,它使用mysql_query
- 因此无法通过该函数轻松更改数据库的缓存。
但是,node_load
确实使用了Drupal的static $nodes
缓存 - 这可能是你的问题,而不是数据库的缓存。您可以node_load
使用node_load
($reset = TRUE
)调用node_load($nid, NULL, TRUE
来清除该缓存。
完整文档位于http://api.drupal.org/api/drupal/modules--node--node.module/function/node_load/6
的node_load手册页上答案 2 :(得分:0)
我很幸运地将节点ID传递给node_load而不是数组。
node_load(1);
根据Druapl's api这是可以接受的,看起来如果你传入一个数组作为第一个变量,它作为一个条件数组加载到数据库查询中。
答案 3 :(得分:0)
问题不在arg()
,您的问题是您为匿名用户启用了缓存。
您可以关闭缓存,也可以使用cache exclude module从缓存中排除模块的菜单项。
修改:正如您现在解释的那样,这是一个块,您可以使用BLOCK_NO_CACHE
中的hook_block
将块从块缓存中排除。