Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Drupal、hook\u node\u视图和搜索创建无限循环_Php_Search_Drupal 7_Infinite Loop - Fatal编程技术网

Php Drupal、hook\u node\u视图和搜索创建无限循环

Php Drupal、hook\u node\u视图和搜索创建无限循环,php,search,drupal-7,infinite-loop,Php,Search,Drupal 7,Infinite Loop,我对drupal有一个非常奇怪的问题。我有一个自定义模块,如果您查看某一类型的节点,它会执行goto操作(请参阅下面的代码)。问题是,过了一段时间,我进入了一个无限循环,其中数据文件\流\节点\视图被无限调用(发生在每个页面上,也发生在不包含CT的页面上) 最有趣的部分是(尽管我没有在任何地方使用搜索)视图模式是search\u index。禁用搜索模块后,问题消失了。当我重新启动模块时,问题消失了一段时间,然后它又回来了(我不知道什么时候和为什么) 有人能解释一下为什么会发生这种情况吗 fun

我对drupal有一个非常奇怪的问题。我有一个自定义模块,如果您查看某一类型的节点,它会执行goto操作(请参阅下面的代码)。问题是,过了一段时间,我进入了一个无限循环,其中数据文件\流\节点\视图被无限调用(发生在每个页面上,也发生在不包含CT的页面上)

最有趣的部分是(尽管我没有在任何地方使用搜索)视图模式是search\u index。禁用搜索模块后,问题消失了。当我重新启动模块时,问题消失了一段时间,然后它又回来了(我不知道什么时候和为什么)

有人能解释一下为什么会发生这种情况吗

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

@显然,这是在运行cron时发生的。有没有办法避免在cron任务期间执行hook\u node\u视图?

没有办法避免在cron任务期间执行
hook\u user\u view()
,但是当调用
hook\u node\u view()
来构建用于填充搜索索引的节点内容时,可以避免将用户重定向到另一个URL

函数mymodule\u node\u view($node,$view\u mode,$langcode){
如果($view\u mode!=“search\u result”){
如果($node->type=='datafile'){
drupal_goto('node/'.$node->nid./edit');
}
}
}
一般来说,在
hook\u node\u view()内部调用
drupal\u goto()
是个坏主意;钩子应该更改
$node->content
,而不是重定向用户

结果是:

  • 在cron任务期间,搜索模块更新其索引
  • 节点模块更新搜索索引,为此调用
    Node\u view()
    ,它调用
    hook\u Node\u view()
    的任何实现,包括您显示的实现
  • 由于在cron任务期间调用了
    drupal_goto()
    ,drupal出现了问题
当用户查看节点时调用
hook\u node\u view()
的假设是不正确的。只有在调用node/%node的页面回调时,才能确保用户正在查看节点

您可以做的是实现类似于以下代码的代码。(我写简化代码只是为了展示正确的方法。)

代码被简化了,因为它假设页面回调是
节点\页面\视图()
(Drupal使用的默认值),并且没有模块更改它。可以编写不作任何假设的代码,以及从该页回调中使用的参数。(作为练习留给读者。
;)

工具书类

没有办法避免在cron任务期间执行
hook\u user\u view()
,但是当调用
hook\u node\u view()
来构建用于填充搜索索引的节点内容时,可以避免将用户重定向到另一个URL

函数mymodule\u node\u view($node,$view\u mode,$langcode){
如果($view\u mode!=“search\u result”){
如果($node->type=='datafile'){
drupal_goto('node/'.$node->nid./edit');
}
}
}
一般来说,在
hook\u node\u view()内部调用
drupal\u goto()
是个坏主意;钩子应该更改
$node->content
,而不是重定向用户

结果是:

  • 在cron任务期间,搜索模块更新其索引
  • 节点模块更新搜索索引,为此调用
    Node\u view()
    ,它调用
    hook\u Node\u view()
    的任何实现,包括您显示的实现
  • 由于在cron任务期间调用了
    drupal_goto()
    ,drupal出现了问题
当用户查看节点时调用
hook\u node\u view()
的假设是不正确的。只有在调用node/%node的页面回调时,才能确保用户正在查看节点

您可以做的是实现类似于以下代码的代码。(我写简化代码只是为了展示正确的方法。)

代码被简化了,因为它假设页面回调是
节点\页面\视图()
(Drupal使用的默认值),并且没有模块更改它。可以编写不作任何假设的代码,以及从该页回调中使用的参数。(作为练习留给读者。
;)

工具书类

$view\u mode!='“搜索结果”也是我做的,但你给出了很好的解释和选择。谢谢你,不客气。我总是乐于帮助解决Drupal问题<代码>:)
@kiamlaluno,我也有类似的问题。但是对于您的解决方案,我猜在正常页面调用中也会触发相同的hook数据文件\u flow\u node\u视图,而不是node/%node。如果我错了,请纠正我。$view\u mode!='“搜索结果”也是我做的,但你给出了很好的解释和选择。谢谢你,不客气。我总是乐于帮助解决Drupal问题<代码>:)
@kiamlaluno,我也有类似的问题。但是对于您的解决方案,我猜在正常页面调用中也会触发相同的hook数据文件\u flow\u node\u视图,而不是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);
}