страница hook_preprocess_page от drupal не работает должным образом - PullRequest
4 голосов
/ 23 декабря 2009

У меня проблема с тем, что изменения hook_preprocess_page в & $ variable не отображаются, хотя это последний элемент в $ theme_registry ['page'] ['preprocess functions']. запись содержимого переменных $ в файл показывает, что содержимое изменилось, но содержимое на сайте остается неизменным. сбросил весь кеш на 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 ]

3 голосов
/ 17 июня 2010

В сообщенном коде содержится ошибка. IF-заявление должно быть исправлено с

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

до

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

Я использую hook_preprocess_page() в одном из моих модулей , и вызываемая функция действительно изменяет содержимое переменных.

Затем, как сообщил также Ричард М, функция должна получить список включенных файлов JavaScript из drupal_get_js().

2 голосов
/ 24 декабря 2009

Я думаю, что вы, вероятно, (предполагая, что это работает так же, как CSS) должны вызвать drupal_get_js в конце вашей функции, например так: $variables['scripts'] = drupal_get_js();.

0 голосов
/ 19 марта 2012

Я знаю, что это старый вопрос, но я только что ответил на него и думаю, что знаю ответ.

Я думаю, что jquery_update вызывает это.

jquery_update реализует hook_theme_registry_alter, который изменяет $ theme_registry, так что jquery_update_preprocess_page запускается последним. Это несмотря на то, что Питер видит в $ theme_registry, потому что изменение происходит после того, как он на это смотрит.

jquery_update получает $ scripts от drupal_add_js (), возится с массивом и затем сбрасывает $ variable ['scripts'], который перезаписывает любые изменения, сделанные ранее.

Я не уверен, что такое идеальное решение. Я не думаю, что мы действительно должны связываться со строкой сценариев напрямую. У меня есть специальный случай на одну страницу, поэтому я, вероятно, собираюсь сделать несколько плохую вещь, вызывая мой код из jquery_update_preprocess_page. jquery_update для Drupal 6 вряд ли будет обновляться сейчас. Это кажется лучше, чем вступать в дуэль в битве за то, кто последним.

...