没有办法避免在 cron 任务期间执行,但是当被调用以构建用于填充搜索索引的节点内容hook_user_view()
时,您可以避免将用户重定向到另一个 URL 。hook_node_view()
function mymodule_node_view($node, $view_mode, $langcode) {
if ($view_mode != 'search_result') {
if ($node->type == 'datafile') {
drupal_goto('node/' . $node->nid . '/edit');
}
}
}
一般来说,调用drupal_goto()
inside是个坏主意hook_node_view()
;钩子应该改变$node->content
,而不是重定向用户。
会发生什么:
- 在 cron 任务期间,搜索模块会更新其索引
- Node 模块更新搜索索引,并为此调用
node_view()
,它调用 的任何实现hook_node_view()
,包括您显示的那个
- 正如
drupal_goto()
在 cron 任务期间所说,Drupal 有问题
用户查看节点时调用的假设hook_node_view()
是不正确的。您确定用户正在查看节点的唯一时刻是调用 node/%node 的页面回调时。
您可以做的是实现类似于以下的代码。(我正在编写简化代码只是为了展示正确的方法。)
function datafile_flow_menu_alter(&$items) {
if (isset($items['node/%node'])) {
$items['node/%node']['page callback'] = 'datafile_flow_node_view';
}
}
function datafile_flow_node_view($node) {
if ($node->type == 'datafile') {
drupal_goto('node/' . $node->nid . '/edit');
}
return node_page_view($node);
}
代码被简化了,因为它假设页面回调是node_page_view()
(Drupal 使用的默认值),并且没有模块更改它。可以编写不对此做出任何假设的代码,以及从该页面回调中使用的参数。(留给读者作为练习。;)
)
参考