web-dev-qa-db-ja.com

ノードの下のコメントを非表示にするが、閉じない方法は?

А自分で(たとえば、ビューによって)ノードのコメントを自分で一覧表示したいので、コアコメントモジュールから標準のコメント一覧を非表示にする必要があります。私はそのようにすることができます:

_  unset($node['comments']['comments']);
_

しかし、それはコメントのDBクエリを妨げません。
それで、コメントモジュールをだますいくつかのクレイジーな方法を見つけました。たとえば、偽の_$node->preview_プロパティを設定したり、新しいビューモードを作成して標準の_node/%node_コールバックを上書きしたりします。

ノードの下にコメントを非表示にして、それでも新しいコメントを追加できるようにするのは本当に難しいですか、それとも何かを見逃しましたか?

「非表示」オプションに関する更新

コンテンツタイプの「非表示」値についてはどうですか。
コメントを閉じる/開く動作が必要です。しかし、コンテンツタイプに「非表示」を設定すると、新しいコンテンツは非表示ではなく「コメントクローズ」に設定されます( ここにコードがあります ) 。別の問題は、コメントが非表示の場合、「コメントを投稿」する権限を持つユーザーがコメントを追加できないことです( ここにコードがあります )。
そのため、アイデアがわかりません。

回答

hook_module_implements_alter() で解決策が見つかりました。どうもありがとう!

8
kalabro

Modules/comment/comment.moduleで、hook_node_view()(comment_node_view())が614行目で実行されていることがわかります。ここで、すべてのコメントをロードしてノードにアタッチするために関数が起動されます。最初の2セットのif(){...}は、コメントの追加フォームとアクションリンクを処理しているようです。次に、コードの最後のブロックで最終的にコメントが追加されます。これは、実際に非表示にすることについて最も懸念していることだと思います。パフォーマンス上の理由から、これをスキップしたいと思います。

// Only append comments when we are building a node on its own node detail
// page. We compare $node and $page_node to ensure that comments are not
// appended to other nodes shown on the page, for example a node_reference
// displayed in 'full' view mode within another node.
if ($node->comment && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
  $node->content['comments'] = comment_node_page_additions($node);
}

コメントモジュールは特定のハードコードされたビューモードに依存するべきではないため、このコードはばかげていると思います。うまくいけば、これが変更され、UIの設定になります。

とにかく、私はあなたに興味があるかもしれない同様の投稿を見つけました: comment_node_viewの実行を停止する方法はありますか?

基本的には、hook_module_implements_alter()を使用して、コメントモジュールがhook_node_view()を起動できないようにする必要があります。カスタムモジュールに追加する必要があるものは次のとおりです。

function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'node_view') {
    unset($implementations['comment']);
  }
}
9

テンプレートファイルでhide()を使用するか、hook_preprocess_node()を使用してください。

hide($content['comments']);
0
mrded