Как правильно переопределить функцию модуля[Решено]

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

Аватар пользователя igorek igorek 2 июня 2010 в 19:41

Есть в модуле ubercart вот такая функция:

<?php/**
 * Implementation of hook_view().
 */
function uc_product_kit_view($node, $teaser = 0, $page = 0)?>

хочется её правильно переопределить в template.php своей темы, а не в самом стороннем модуле... Знаю что это правильно, а как правильно переопределить не знаю...?
Нашел вот что Тема реестра для особых случаев , только не знаю как применить и то ли это?

Комментарии

Аватар пользователя igorek igorek 2 июня 2010 в 21:22

"xxandeadxx" wrote:
http://api.drupal.ru/api/group/hooks/6[/quote]
удобная штука, но ответа прямого там нет...)))
То есть пишу модуль - вместо этого uc_product_kit_view в нём пишу что? названиемодуля_uc_product_kit_view(){}
Кажется как то просто, но чего-то не догоняю...

Аватар пользователя Sinkora Sinkora 4 июня 2010 в 0:58

"igorek" wrote:
То есть пишу модуль - вместо этого uc_product_kit_view в нём пишу что? названиемодуля_uc_product_kit_view(){}
Кажется как то просто, но чего-то не догоняю...

Не... Так нельзя. Или я чего-то не знаю?..

Короче, uc_product_kit_view - это hook_view, т.е. друпаловский хук.

Используйте хук hook_nodeapi - он срабатывает после выполнения hook_view.

Т.е. в своем модуле пишем:

function имя_модуля_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      // Тут пишете свои модификации хука
      break;
  }
}

Если это можно сделать по-другому, то подправьте меня кто-нибудь...

Аватар пользователя Sinkora Sinkora 2 июня 2010 в 22:08

"vgoodvin" wrote:
На api.drupal.ru есть примеры модулей для изучения Drupal API. Изучайте.

Это Вы кому?

Меня интересует только один вопрос: тот вариант насчет хука hook_nodeapi, который я написал выше - он единственный, или есть более оптимальное решение?

Аватар пользователя vgoodvin vgoodvin 2 июня 2010 в 23:05

"Sinkora" wrote:
Это Вы кому?

Не вам. Это ТС.

"Sinkora" wrote:
Меня интересует только один вопрос: тот вариант насчет хука hook_nodeapi, который я написал выше - он единственный, или есть более оптимальное решение?

Еще можно в hook_preprocess_node, этот хук кажись даже не документирован. И в template.php через ENGINE_preprocess_node или THEME_preprocess_node. Как удобно.

Для ТС: переопределить указанную вами функцию не получится, можно только подправить переменные в функциях препроцессинга чего обычно хватает. Учите API одним словом, без этого тяжело.

Аватар пользователя Sinkora Sinkora 2 июня 2010 в 23:23

"vgoodvin" wrote:
Еще можно в hook_preprocess_node, этот хук кажись даже не документирован. И в template.php через ENGINE_preprocess_node или THEME_preprocess_node. Как удобно.

Эти варианты я не рассматривал, ибо они не являются более оптимальным решением, чем hook_nodeapi...

Аватар пользователя rbogdan@drupal.org rbogdan@drupal.org 2 июня 2010 в 23:27

Sinkora тот вариант, который вы описали с nodeapi самый кашерный. Что-то другое тоже в голову не приходит, ибо зачем делать по другому если для этого есть специальный хук.

Аватар пользователя Sinkora Sinkora 3 июня 2010 в 0:08

"vgoodvin" wrote:
А можно ли в hook_nodeapi поменять какую-либо переменную шаблона node.tpl.php, как это делается в препроцессинге?

Ну, в хук hook_nodeapi объект $node передается по ссылке - т.е все изменения на уровне объекта ноды. А переменные шаблона в нем не поменяешь.

Сигнатура hook_nodeapi это подтверждает:

hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL);
Аватар пользователя vgoodvin vgoodvin 3 июня 2010 в 1:00

Ну получается что кому как удобнее. Да и от случая зависит, вероятно иногда приходится импользовать оба хука.

Аватар пользователя igorek igorek 3 июня 2010 в 21:43

"Sinkora" wrote:
Используйте хук hook_nodeapi

"vgoodvin" wrote:
в template.php через ENGINE_preprocess_node или THEME_preprocess_node. Как удобно.

Огромное спасибо Всем!