Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Drupal:如何在每个页面请求中调用自定义模块中的一个钩子出口?_Drupal - Fatal编程技术网

Drupal:如何在每个页面请求中调用自定义模块中的一个钩子出口?

Drupal:如何在每个页面请求中调用自定义模块中的一个钩子出口?,drupal,Drupal,如何在drupal网站的每个页面请求中调用自定义模块中的一个钩子出口 以下是自定义模块中的挂钩退出代码: <?php function cec_monitoring_exit() { if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') { // database inserts here } } ?> 是因为if条件还是其他原因?因为一些自定义

如何在drupal网站的每个页面请求中调用自定义模块中的一个钩子出口

以下是自定义模块中的挂钩退出代码:

<?php
function cec_monitoring_exit() {
    if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
        // database inserts here
    }
}
?>

是因为if条件还是其他原因?因为一些自定义模块正在调用钩子“cec_monitoring_exit()”,而其他一些自定义模块则没有

提前谢谢

干杯,
只要满足条件,就会调用Mark

钩子。这是通过使用。这意味着在每个页面请求上调用的钩子将在每个页面请求中调用。在上面的例子中,钩子在某些情况下不会做任何事情,但它仍然会被调用,因为Drupal不知道它何时真正会做一些事情


缓存页面时,这种资源浪费将受到限制,因为您只需要在创建页面缓存页面时运行挂钩。另一个例子是,无论何时加载一个节点,这都会导致触发很多钩子,因此成本相当高。因此,当您希望访问许多节点上的某些内容(如标题)时,通常希望尽可能避免使用此选项。

我不确定您所说的
是什么意思,在一些自定义模块中也没有调用它,因此在这里猜测您可能指的是其他模块提供的自定义页面:

正如Jeremy和Googletorp已经说过的,你的if块

if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
    // database inserts here
}
仅当用户请求完整的节点页面(例如“node/42”)时,才会计算为true。它将不匹配任何其他页面,如术语视图(例如“分类法/term/36”)或默认frontpage(“节点”)或视图模块提供的视图页面(可能/有/任何/路径)等

因此,您的数据库插入只会发生在节点页上,而不会发生其他任何事情

如果要记录每个页面请求,只需删除If块并直接插入数据库即可


在注释中澄清后编辑(
cec\u monitoring\u exit()
不会为其他模块创建的某些页面调用):

我只能看到两个可能的原因

第一个原因可能是在页面输出之后,但在调用
hook\u exit()
实现之前发生了一个错误(请检查服务器日志中关于失败页面请求的php错误)。如果您查看“index.php”(Drupal实例的顶级文件夹):

您可以看到,页面输出是通过打印
主题('page',$return)
的结果生成的。调用
hook\u exit()
就发生在中之后

因此,您应该检查(最好通过调试器,但也可以使用print语句)是否在有问题的页面上执行了
drupal\u page\u footer()。如果它被调用,错误可能发生在另一个模块的
hook\u exit()
实现中,该模块在您之前被调用,因此您需要检查这些模块

第二个原因是,如果其中一个模块通过调用主题('page',…)本身绕过标准Drupal执行流,然后停止执行。在这种情况下,
drupal\u page\u footer()
将不会被调用,因为在调用
菜单\u execute\u active\u handler()
的过程中,执行早就停止了。请注意,没有一个已建立的Drupal模块能够做到这一点,因此这是不太可能的


除了这些选项之外,我还不知道是什么原因导致了这种情况。

@marknt15我认为您在这里没有意识到的是它的全部基于名称,因此在您的情况下,当使用调用模块名称的前缀(例如cec_monitoring_exit())调用作为hook_exit()的hook时,将调用AKA_exit()将只在cec_监控模块中工作,但在另一个名为say marknt15_loves_drupal的自定义模块中,则需要像marknt15_loves_drupal_exit()一样使用hook_exit()

然后drupal将其和所有其他挂钩调用为。。。
调用_user\u func\u array('modulename''hookname')或类似的调用

条件将只匹配节点页面,但应在每个页面上调用挂钩request@jeremy:我明白了,它必须在每个页面请求中调用,但在某些自定义模块中没有调用。我想做的是识别一个登录用户当前月份的唯一页面视图。你能给出一个具体的例子说明这个钩子什么时候没有启动吗?我不知道你说的在某些自定义模块中没有调用它是什么意思。@安德鲁:当访问我创建的自定义模块时,它没有被调用。但是在一些自定义模块中,钩子出口被调用。所谓“访问自定义模块”,你是指“访问自定义模块创建的页面”吗?@googletorp:谢谢你的回答。在drupal 5手册中:“这个钩子在每个页面请求的末尾运行。”所以我认为在每个页面请求中,钩子cec_monitoring_出口()将始终无条件调用,因为挂钩出口没有条件要求?我说得对吗?“在上面的例子中,钩子在某些情况下不会做任何事情,但它仍然会被调用,因为Drupal不知道它何时真正会做一些事情。”-所以它仍然会被调用,但为什么在一些自定义模块中它不会被调用?值得注意的是,除非你重置node_load,否则它会在内存中保存每个节点的副本。重复加载内存中已有的节点并不昂贵。(因此,在hook_exit中加载节点以访问当前节点页面的信息是可以的。)你好,Henrick,感谢您的回复。即使我将cec_monitoring_exit()钩子中的整个代码替换为die(“
这里死了”);模具功能不会在某些自定义模块中运行。我创建的单钩子函数必须在每个drupal页面请求中调用,对吗?但是在一些自定义模块中,不会调用钩子出口。我想知道为什么。@marknt15:你需要解释一下“不在某些自定义模块中运行”是什么意思!为什么进来?您是否将相同的功能放在七个位置
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

$return = menu_execute_active_handler();

// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    case MENU_NOT_FOUND:
      drupal_not_found();
      break;
    case MENU_ACCESS_DENIED:
      drupal_access_denied();
      break;
    case MENU_SITE_OFFLINE:
      drupal_site_offline();
      break;
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}

drupal_page_footer();