drupal的hook_preprocess_page没有按预期工作

时间:2009-12-23 20:01:37

标签: drupal drupal-6 drupal-modules preprocessor

我遇到的问题是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这个问题,这真的有助于理解这里发生了什么......

感谢。

3 个答案:

答案 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现在不太可能更新。这似乎比进入最后一场决斗的战斗要好。