エンドユーザーが表示できるように特定のリビジョンをロードしようとしています。 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 ']!=表示されるもの。)
編集# 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'];
}
}
Mongolito404の言う通りです。 hook_node_load()
およびhook_node_view()
は、ノードオブジェクトのすでにロードされているフィールドを変更するために使用されるとは考えられていません。
ドキュメンテーションが報告するように、それらは追加情報を追加するために使用されるべきです。
これらのフックのドキュメントには、次の文が含まれています。
このフックは、ノードまたはノードリビジョンテーブルにない情報を追加するためにのみ使用してください。これらのテーブルにある情報を置き換えることはできません[…]。 [hook_node_load()]
モジュールは、レンダリングの前に$ node-> contentに要素を追加できます。 [hook_node_view()]
ある条件に基づいてノードの別のリビジョンを本当に表示したい場合は、 hook_menu_alter() を実装して、node/%node
を処理するメニューコールバックを変更し、独自のメニューに置き換えることができます。表示するノードのリビジョンを確認して表示するコールバック。
_hook_node_load
_ の使い方と意図を誤解していると思います。ノードが完全に読み込まれた後、リビジョンID(vid)を変更します。 hook_node_view()
についても同じですが、ここで_$node
_を置き換えることは想定されていませんが、レンダリングするコンテンツを_$node->content
_に追加する必要があります。