Как переопределять функции препроцесса template_preprocess_calendar_datebox?

Главные вкладки

Аватар пользователя Y.Vladimir Y.Vladimir 26 мая 2010 в 10:23

Добрый день.

Мне необходимо сделать некоторые изменения в функции template_preprocess_calendar_datebox().
Это функция модуля calendar.

Для этого:
1. Я копирую функция template_preprocess_calendar_datebox в в каталог текущей темы, файл template.php.
2. Переименовую функцию template_reprocess_calendar_datebox в phptemplate_preprocess_calendar_datebox.
3. Делаю необходимые изменения во вновь созданной копии функции.

Ничего не работает.

Как правильно изменить функцию?

Комментарии

Аватар пользователя Y.Vladimir Y.Vladimir 26 мая 2010 в 11:37

хм.

Очистил кеш в Performance не заработало.
Нужно ли кроме того, что я поместил тело функции phptemplate_preprocess_calendar_datebox в template.php, дополнительно где-то определять данную функцию?

Аватар пользователя Vladimir_VVV Vladimir_VVV 26 мая 2010 в 20:31

Как вариант выключить тему, а потом включить.
Кеш с админки это кеш, а здесь нужно выполнить drupal_rebuild_theme_registry(), например добавить в начало template.php и после однократного открытия сайта - убрать. Или как я написал выше, выключить тему, включив гарланд и вновь включить.

Аватар пользователя Sinkora Sinkora 26 мая 2010 в 21:15

"glu2006" wrote:
Никак, ...

hook_theme_registry_alter позволит отключить нужную preprocess функцию.

Т.е., по-моему, если мы хотим добавить новую переменную, то используем phptemplate_preprocess_...

А если хотим отключить переменные, то поможет только hook_theme_registry_alter, что избавит нас от лишнего шага в формировании переменных. Кстати, я сам только недавно узнал про этот хук (знающие люди недавно подсказали на форуме).

Аватар пользователя Sinkora Sinkora 26 мая 2010 в 21:21

"Vladimir_VVV" wrote:
Человеку переопределить функцию нужно, а не отклюсчить переменную.

Что вы понимаете под переопределнием функции?

Если пользоваться такой схемой как template_preprocess_calendar_datebox, phptemplate_preprocess_calendar_datebox... то в итоге мы не переопределим функцию, а только добавим вычисления, т.е. в итоге Друпал будет каждый раз гонять две функции. И тут могут быть проблемы, когда на первом этапе (template_preprocess_calendar_datebox) будут происходить ненужные нам действия, которые мы никак не сможем избежать, так вызов phptemplate_preprocess_calendar_datebox ничего не изменит, а только пополнит функционалом.

А hook_theme_registry_alter как раз позволяет отключить любой ненужный шаг, что как раз и позволяет переопределять функционал...

Аватар пользователя glu2006 glu2006 27 мая 2010 в 9:05

Sinkora wrote:
Если пользоваться такой схемой как template_preprocess_calendar_datebox, phptemplate_preprocess_calendar_datebox... то в итоге мы не переопределим функцию, а только добавим вычисления

Не согласен, phptemplate_preprocess_calendar_datebox как раз переопределяет функцию, т.е. если есть phptemplate то template_preprocess не будет вызываться, вот если в своем модуле написать маймодуль_preprocess то тогда эта функция вызовется вслед за template_preprocess, а так четкое переопределение поскольку надо полностью скопировать код исходной функции в template.php

Аватар пользователя Sinkora Sinkora 27 мая 2010 в 15:24

"glu2006" wrote:
Не согласен, phptemplate_preprocess_calendar_datebox как раз переопределяет функцию, т.е. если есть phptemplate то template_preprocess не будет вызываться, вот если в своем модуле написать маймодуль_preprocess то тогда эта функция вызовется вслед за template_preprocess, а так четкое переопределение поскольку надо полностью скопировать код исходной функции в template.php

Нет, не совсем так.

"glu2006" wrote:
phptemplate_preprocess_calendar_datebox как раз переопределяет функцию, т.е. если есть phptemplate то template_preprocess не будет вызываться

template_preprocess_hook вызовется в первую очередь:) А потом вызовется функция phptemplate_preprocess_hook...

Как доказательство, пример можно увидеть в template.php того же Гарланда. Там есть такой код:

function phptemplate_preprocess_page(&$vars) {
  $vars['tabs2'] = menu_secondary_local_tasks();

  // Hook into color.module
  if (module_exists('color')) {
    _color_page_alter($vars);
  }
}

Но ведь это не значит, что не будет вызываться template_preprocess_page, где определены все переменные страницы...