我遇到的问题是hook_preprocess_page对& $变量的更改没有呈现,即使它是$ theme_registry ['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));
}
/tmp/vars.txt正确显示变量,但浏览器仍显示正在加载的脚本。
这可能是一个愚蠢的例子,但我在其他实例中遇到了hook_preprocess_page这个问题,这真的有助于理解这里发生了什么......
感谢。
答案 0 :(得分:3)
报告的代码包含错误。 IF语句应该从
更正if (grinchlist_usercheck($variables['user']['uid'])) {
// ...
}
到
if (grinchlist_usercheck($variables['user']->uid)) {
// ...
}
我在one of my modules中使用hook_preprocess_page()
,调用的函数确实会更改变量的内容。
然后,正如Richard M报道的那样,该函数应该从drupal_get_js()
获取包含的JavaScript文件的列表。
答案 1 :(得分:2)
我认为你可能(假设它的工作方式与CSS相同)需要在函数末尾调用drupal_get_js
,如下所示:$variables['scripts'] = drupal_get_js();
。
答案 2 :(得分:0)
我知道这是一个古老的问题,但我只是打了它,我想我知道答案。
我认为jquery_update导致了这一点。
jquery_update实现了hook_theme_registry_alter,它更改了$ theme_registry,以便jquery_update_preprocess_page最后运行。尽管Peter在$ theme_registry中看到了这一点,因为在他看到它之后发生了改变。
jquery_update从drupal_add_js()获取$脚本,与数组混合,然后重置$ variables ['scripts'],这会覆盖之前所做的任何更改。
我不确定完美的解决方案是什么。我认为我们不应该直接搞乱脚本字符串。我有一个特殊的单页案例,所以我可能会做一些从jquery_update_preprocess_page调用我的代码的坏事。 Drupal 6的jquery_update现在不太可能更新。这似乎比进入最后一场决斗的战斗要好。