現在、Drupal 7サイトにノード参照の画像フィールドを実装しようとしています。これにより、レンダリングの直前のプログラムロジックに応じて「表示モード」が変更されます。フィールドは現在、表示モード設定を介していくつかのコンテンツタイプでレンダリングされており、それぞれがフィールドフォーマッター「レンダリングされたノード」を使用しています。
最初の試み
私の最初のアイデアは以下を実装することでした、フックはフックであると考えるとフックです:
function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
switch ($display['type']) {
case 'node_reference_node':
/* Programatical logic here to modfy field render settings */
break;
}
}
明らかに、HOOKを私のモジュール名と交換します。
上記は、元の関数の前または後に発射するならば、それは本当に問題ではありませんでしたnode_reference_field_formatter_view
でnode_reference.module
、私はどちらか完全にそれの出力を上書きしたり、うまくいけば、レンダリングの前にその値を変更してしまうため。唯一の問題は、上記のフックがモジュールごとにのみ機能するように見えることです。つまり、サイト全体ではないので、基本的には私のモジュールでは起動しません。
これで、レンダリングされたノードを出力するための独自のフィールドフォーマッターを作成できるようになりました。しかし、すでに存在するものがあることを考えると、それは少し無駄のようです。
他のアプローチ
私の他のアプローチは以前からHOOK_preprocess_node
ありましたHOOK_preprocess_field
が、前者にはview_mode
情報が含まれておらず、後者には少なくとも5つの異なる複雑な構造が含まれており、それらはすべてview_mode
異なるレベルのプロパティへの参照を持っています。それぞれを変更するのはかなりハッキーな感じです値。特定のview_mode
プロパティを変更しても、結果の画像は変更されません。
質問
(contribモジュールの)フィールドフォーマッタがレンダリングされる前に介入し、ページリクエストごとにその設定を変更するためのクリーンな方法を知っている人はいますか?つまり、実際のコンテンツタイプの永続的な表示モード設定を変更する必要はありませんか?
view_mode
でhook_preprocess_node
、愚かな私を!hook_field_formatter_view_alter()
このようなものがD8に存在するのだろうか...
hook_field_formatter_view_alter()
おそらく1年以上前から似たようなものを探していましたが、残念ながら存在しません。FYIhook_preprocess_node()
間違いない持っているview_mode
、それが利用可能な、それは中だ$vars['view_mode']
、ではない$vars['node']->view_mode
あなたが試すように誘惑されている可能性があります。