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

8

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

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

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

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

Обновление о «Скрытой» опции

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

Ответ

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

kalabro
источник
Легко ... отредактируйте тип контента, в настройках комментария выберите «Скрытый». это скроет ваши комментарии
subhojit777
@ subhojit777 ОП хочу предотвратить запрос БД, я думаю.
Никсмак

Ответы:

9

В модуле / 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);
}

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

Несмотря на это, я нашел похожий пост, который может вас заинтересовать: есть ли способ остановить запуск comment_node_view?

По сути, вы хотите использовать hook_module_implements_alter (), чтобы запретить модулю комментариев отключить hook_node_view (). Вот что вам нужно добавить в свой пользовательский модуль:

function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'node_view') {
    unset($implementations['comment']);
  }
}
Чарли Шлиссер
источник
1
Большое спасибо! Специально для hook_module_implements_alter!
Калабро