Как скрыть комментарии под узлом, но не закрывать их?
На самом деле я сам хочу перечислять комментарии для узлов (например, по представлениям), поэтому мне нужно скрыть стандартный список комментариев из основного модуля комментариев. Я могу сделать это так:
unset($node['comments']['comments']);
Но это не помешает запрашивать комментарии в БД.
Поэтому я нашел несколько сумасшедших способов обмануть модуль комментариев. Например, чтобы установить поддельное свойство $node->preview
или создать новый режим просмотра и перезаписать стандартный обратный вызов node/%node
.
Действительно ли так сложно скрыть комментарии под узел, но все еще разрешающий добавлять новый комментарий, или я что-то пропустил?
Обновление о "скрытой" опции
Как насчет "скрытого" значения для типа контента:
Мне нужно закрыть/открыть поведение для моих комментариев. Но если я установлю "Скрытый" для своего типа контента, мои новые фрагменты контента будут иметь значение "Комментарии закрыты" вместо "скрытый" ( вот код ).
Другая проблема заключается в том, что пользователь с разрешением "публиковать комментарии" не может добавить комментарий, если комментарии скрыты ( вот код).
Так что я не могу понять эту идею.
Ответ
Решение найдено с помощью hook_module_implements_alter()
. Большое спасибо!
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']);
}
}
Просто попробуйте использовать hide() в файле шаблона или hook_preprocess_node():
hide($content['comments']);