drupal';s hook_预处理_页面未按预期工作

drupal';s hook_预处理_页面未按预期工作,drupal,drupal-6,drupal-modules,preprocessor,Drupal,Drupal 6,Drupal Modules,Preprocessor,我遇到一个问题,hook_preprocess_页面对&$variables的更改没有被呈现,即使它是$theme_注册表['page']['preprocess functions']下的最后一项。将$variables的内容记录到文件中会显示内容已更改,但网站上的内容显示为不变。刷新drupal上的所有缓存,刷新所有浏览器缓存,结果仍然相同 /** * Implementation of hook_preprocess_page(). */ function grinchlist_pre

我遇到一个问题,hook_preprocess_页面对&$variables的更改没有被呈现,即使它是$theme_注册表['page']['preprocess functions']下的最后一项。将$variables的内容记录到文件中会显示内容已更改,但网站上的内容显示为不变。刷新drupal上的所有缓存,刷新所有浏览器缓存,结果仍然相同

/**
 * Implementation of hook_preprocess_page().
 */
function grinchlist_preprocess_page(&$variables) {

  if (grinchlist_usercheck($variables['user']['uid'])) {
    $variables['scripts'] = preg_replace('/<script[^>]*christmas_snow.*<\/script>/','',$variables['scripts']);
  }
  file_put_contents('/tmp/vars.txt',print_r($variables,true));
}
/**
*hook_preprocess_page()的实现。
*/
函数grinclist_预处理_页面(&$variables){
if(grinclist_usercheck($variables['user']['uid'])){
$variables['scripts']=preg_replace('/]*christmas_snow.*/','',$variables['scripts']);
}
文件内容('/tmp/vars.txt',打印($variables,true));
}
/tmp/vars.txt正确显示变量,但浏览器仍显示正在加载的脚本

这可能是一个愚蠢的例子,但在其他情况下,我在hook_preprocess_页面上遇到了这个问题,了解这里发生了什么真的很有帮助


谢谢。

我认为您可能(假设这与CSS包含的方式相同)需要在函数末尾调用,比如:
$variables['scripts']=drupal\u get\u js()

报告的代码包含错误。IF语句应该从

if (grinchlist_usercheck($variables['user']['uid'])) {
  // ...
}

我在中使用了
hook\u preprocess\u page()
,调用的函数确实会更改变量的内容


然后,正如Richard M所报告的,函数应该从
drupal\u get\u js()
获取包含的JavaScript文件列表

我知道这是一个老问题,但我刚刚提出,我想我知道答案

我认为jquery\u更新导致了这种情况

jquery\u update实现hook\u theme\u registry\u alter,它更改$theme\u注册表,以便jquery\u update\u preprocess\u页面最后运行。这与Peter在$theme_注册表中看到的情况无关,因为更改是在他查看之后发生的

jquery_update从drupal_add_js()获取$scripts,摆弄数组,然后重置$variables['scripts'],这将覆盖先前所做的任何更改


我不确定什么是完美的解决方案。我不认为我们真的应该直接处理脚本字符串。我有一个特殊的单页案例,所以我可能会做一些不好的事情,从jquery\u update\u preprocess\u页面调用我的代码。Drupal 6的jquery_更新现在不太可能更新。这似乎比参加谁最后一名的决斗要好。

richard,谢谢你的回复。。。该行由模板预处理页面运行,它发生在我的代码之前。。。查看$theme\u注册表['page']['preprocesses functions'],我得到以下信息:[0]=>模板预处理[1]=>模板预处理[3]=>jquery\u更新预处理[4]=>oumoodle\u预处理[5]=>phptemplate\u预处理[6]=>内容配置文件\u模板预处理[7]=>grinchlist_preprocess_页面,当它到达我的函数时,脚本索引正在填充。。。这就是令人费解的…:(我不确定我是否明白你的意思。我的理解是,在对scripts变量进行更改后,你必须重新运行
drupal\u get\u js()
函数。这篇博文可能会有所帮助:richard,这个链接对于hook\u preprocess\u页面总体来说非常有价值(谢谢,我以前没有发现过!)但我在这里试图做的是相反的,如果我添加了另一个javascript,我必须通过调用drupal_get_js来重置['scripts']索引,我试图做的是在满足某些条件的情况下删除一个javascript。因为$javascript变量是静态的,所以我不能在函数外部访问它。当我转到d6.13时,我遇到了同样的问题,查询更新模块停止工作(它也使用了预处理页面挂钩)。我也遇到了同样的问题&vars不起作用。它在本地服务器上工作,但在服务器上有问题。我认为这个问题与服务器上安装的php有关。很好!适用于您的php版本是什么?那一个没有?我会检查我的,也许我们能找到一个模式。另一方面,在本周测试Lucid的更新(随PHP5.3一起发布)时,我发现drupal有很大的缺陷,因为它还不支持PHP5.3。。。
if (grinchlist_usercheck($variables['user']->uid)) {
  // ...
}