web-dev-qa-db-ja.com

ビューの特定のノードリビジョンをロードする

エンドユーザーが表示できるように特定のリビジョンをロードしようとしています。 Drupal 7。

私の.moduleには次のものが含まれています。

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すると、完全で正しいリビジョンですが、レンダリングに関しては、ページは古いリビジョンを選択します。したがって、これらの関数とページのレンダリングの間で何かが起こっています。それは何ですか?そして、どうすればそれを止めることができますか?

よろしくお願いします。

[〜#〜] edit [〜#〜]どこかにフックロードオーダーチャートがあるかどうか誰かが知っていますか?それは超便利です。

EDIT#2 node.tpl.phpにも正しいリビジョンがあるようですが、表示されているものは正しいリビジョンではありません...画像を参照してください(body ['und'] [0] [' value ']!=表示されるもの。) enter image description here

編集# OK、それを行う方法を考え出しました(以下のコード)そのひどい解決策とそのため、Workbenchモジュールを見てみることにします。必要なことをしてください。助けてくれてありがとう!

/**
 * 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'];
  }
}
3
Christian

Mongolito404の言う通りです。 hook_node_load()およびhook_node_view()は、ノードオブジェクトのすでにロードされているフィールドを変更するために使用されるとは考えられていません。

ドキュメンテーションが報告するように、それらは追加情報を追加するために使用されるべきです。
これらのフックのドキュメントには、次の文が含まれています。

このフックは、ノードまたはノードリビジョンテーブルにない情報を追加するためにのみ使用してください。これらのテーブルにある情報を置き換えることはできません[…]。 [hook_node_load()]

モジュールは、レンダリングの前に$ node-> contentに要素を追加できます。 [hook_node_view()]

ある条件に基づいてノードの別のリビジョンを本当に表示したい場合は、 hook_menu_alter() を実装して、node/%nodeを処理するメニューコールバックを変更し、独自のメニューに置き換えることができます。表示するノードのリビジョンを確認して表示するコールバック。

1
kiamlaluno

_hook_node_load_ の使い方と意図を誤解していると思います。ノードが完全に読み込まれた後、リビジョンID(vid)を変更します。 hook_node_view() についても同じですが、ここで_$node_を置き換えることは想定されていませんが、レンダリングするコンテンツを_$node->content_に追加する必要があります。

1
Pierre Buyle