Загрузка определенной редакции узла для просмотра


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

У меня в .модуле есть следующее;

function mymodule_node_load($nodes, $types) {
  if ($nodes[821]->vid != 5928) {
    $nodes[821] = node_load(821, 5928);
  }
}

function mymodule_node_view($node, $view_mode, $langcode) {
   $node = node_load(821, 5928);
}

Если я dpm/var_dump узел после этого, он идеален и является правильной редакцией, но когда дело доходит до рендеринга, страница выбирает более старую редакцию. Таким образом, что-то происходит между этими функциями и отображением страницы. Что это? И как я могу это остановить?

Заранее большое спасибо оцененный.

РЕДАКТИРОВАТЬ Кто-нибудь знает, есть ли где-нибудь диаграмма порядка загрузки крючков? Это было бы очень удобно.

РЕДАКТИРОВАТЬ #2 Кажется, что даже node.tpl.php имеет правильную редакцию, но то, что отображается, не является правильной редакцией... См. Изображение (тело ['und'][0]['значение']!= то, что отображается.) enter image description here

РЕДАКТИРОВАТЬ #3 Хорошо, поэтому я понял, как это сделать (код ниже), это ужасное решение, и из-за этого я собираюсь взглянуть на модуль верстака, потому что я думаю, что он может просто сделать то, что мне нужно. Спасибо за всю помощь!

/**
 * Implements hook_node_view_alter().
 */
function mymodule_node_view_alter(&$build) {
  $latest_revision = _get_latest_published_revision($build['#node']);

  if ($latest_revision) {
    $build['#node'] = node_load($build['#node']->nid, $latest_revision);
    node_build_content($build['#node']);

    $build['body'] = $build['#node']->content['body'];
  }
}
Author: Christian, 2011-03-11

2 answers

То, что говорит mongolito404, верно; hook_node_load() и hook_node_view() не считаются используемыми для изменения полей, уже загруженных объектом узла.

Как сообщается в документации, их следует использовать для добавления дополнительной информации.
Документация по этим крючкам содержит следующие предложения:

Этот крючок следует использовать только для добавления информации, которой нет в таблице изменений узла или узла, а не для замены информации, содержащейся в этих таблицах [...]. [hook_node_load_загрузка()]

Модуль может добавлять элементы в $node->содержимое перед визуализацией. [просмотр_нода крюка()]

Если вы действительно хотите показать другую версию узла на основе некоторых условий, вы можете реализовать hook_menu_alter(), чтобы изменить обратный вызов меню, который обрабатывает node/%node, и заменить его своим собственным обратным вызовом меню, который проверяет, какая версия узла должна быть показана, и показывает ее.

 1
Author: kiamlaluno, 2011-03-11 15:24:38

Я думаю, что вы неправильно поняли использование и намерение hook_node_load. Что вы делаете, так это меняете идентификатор редакции (vid) после полной загрузки узла. То же самое для hook_node_view(), вы не должны заменять $node там, но добавлять дополнительный контент для визуализации в $node->content.

 1
Author: Pierre Buyle, 2011-03-18 09:30:54