1

我对drupal有一个非常奇怪的问题。如果您查看某种类型的节点,我有一个自定义模块会执行 goto(请参见下面的代码)。问题是,过了一会儿,我进入了一个无限循环,其中 datafile_flow_node_view 被无限调用(发生在每个页面上,也发生在不包含 CT 的页面上)。

最有趣的部分是(尽管我没有在任何地方使用搜索)视图模式是 search_index。禁用搜索模块后,问题就消失了。当我重新启用模块时,问题消失了一段时间,然后它返回(我不知道何时以及为什么)。

任何人都可以解释为什么会这样吗?

function datafile_flow_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'datafile') {
    drupal_goto('node/' . $node->nid . '/edit');
  }
}

@EDIT 显然这发生在运行 cron 期间。有没有办法避免在 cron 期间执行 hook_node_views ?

4

1 回答 1

1

没有办法避免在 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 使用的默认值),并且没有模块更改它。可以编写不对此做出任何假设的代码,以及从该页面回调中使用的参数。(留给读者作为练习。;)

参考

于 2012-12-18T14:42:14.040 回答