drupal's hook_preprocess_page not working as expected
i am having an issue where hook_preprocess_page 's changes to &$variables is not being rendered, even though it is the last item under $theme_registry['page']['preprocess functions']. logging contents of $variables to a file show the contents changed, but contents appear unchanged on the site. flushed all cache on drupal, flushed all browser caches and still the same result.
/**
* Implementation of hook_preprocess_page().
*/
function grinchlist_preprocess_page(&$variables) {
if (grinchlist_usercheck($variables[开发者_如何学JAVA'user']['uid'])) {
$variables['scripts'] = preg_replace('/<script[^>]*christmas_snow.*<\/script>/','',$variables['scripts']);
}
file_put_contents('/tmp/vars.txt',print_r($variables,true));
}
the /tmp/vars.txt shows the variables properly, but the browser still show the script being loaded.
this may be a silly example, but i've had this issue with the hook_preprocess_page in other instances and it would really help out to understand what is going on here...
thanks.
The reported code contains an error. The IF-statement should be corrected from
if (grinchlist_usercheck($variables['user']['uid'])) {
// ...
}
to
if (grinchlist_usercheck($variables['user']->uid)) {
// ...
}
I am using hook_preprocess_page()
in one of my modules, and the invoked function does change the content of the variables.
Then, as also Richard M reported, the function should get the list of the included JavaScript files from drupal_get_js()
.
I think you probably (assuming this works in the same way as CSS includes) need to call drupal_get_js
at the end of your function, like so: $variables['scripts'] = drupal_get_js();
.
I know this is an old question but I just struck it and I think I know the answer.
I think jquery_update is causing this.
jquery_update implements hook_theme_registry_alter which changes $theme_registry so that jquery_update_preprocess_page runs last. This is despite what Peter sees in $theme_registry because the alter happens after he looks at it.
jquery_update gets $scripts from drupal_add_js(), fiddles with the array and then resets $variables['scripts'] which overwrites any changes made earlier.
I'm not sure what the perfect solution is. I don't think we're really supposed to mess with the scripts string directly. I have a special one page case so I'm probably going to do the somewhat bad thing of calling my code from jquery_update_preprocess_page. jquery_update for Drupal 6 is unlikely to updated now. That seems better than getting into a dueling battle of who comes last.
精彩评论