Как скрыть комментарии под узлом, но не закрывать их?


На самом деле я сам хочу перечислять комментарии для узлов (например, по представлениям), поэтому мне нужно скрыть стандартный список комментариев из основного модуля комментариев. Я могу сделать это так:

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

Но это не помешает запрашивать комментарии в БД.
Поэтому я нашел несколько сумасшедших способов обмануть модуль комментариев. Например, чтобы установить поддельное свойство $node->preview или создать новый режим просмотра и перезаписать стандартный обратный вызов node/%node.

Действительно ли так сложно скрыть комментарии под узел, но все еще разрешающий добавлять новый комментарий, или я что-то пропустил?

Обновление о "скрытой" опции

Как насчет "скрытого" значения для типа контента:
Мне нужно закрыть/открыть поведение для моих комментариев. Но если я установлю "Скрытый" для своего типа контента, мои новые фрагменты контента будут иметь значение "Комментарии закрыты" вместо "скрытый" ( вот код ). Другая проблема заключается в том, что пользователь с разрешением "публиковать комментарии" не может добавить комментарий, если комментарии скрыты ( вот код).
Так что я не могу понять эту идею.

Ответ

Решение найдено с помощью hook_module_implements_alter(). Большое спасибо!

 8
Author: kalabro, 2012-04-16

2 answers

В модулях/комментарий/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);
}

Я думаю, что этот код глуп, потому что модуль комментариев не должен зависеть от какого-либо конкретного жестко заданного режима просмотра. Надеюсь, это изменится и станет настройкой в пользовательском интерфейсе.

Несмотря на это, я нашел похожий пост, который может вас заинтересовать: Есть ли способ остановить запуск 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
Author: Charlie Schliesser, 2017-04-13 12:47:05

Просто попробуйте использовать hide() в файле шаблона или hook_preprocess_node():

hide($content['comments']);
 0
Author: mrded, 2012-11-21 16:51:09