Во-первых, вы испортили функцию подсчета количества комментариев для объекта, и она будет "врать", считая только комментарии первого уровня. Это мягко говоря неправильно. Да и зачем, там есть параметр $filter, через который можно легко и быстро добавить нужное условие (только там, где это требуется - при вычислении номера страницы).
Спасибо за подсказку, вернул getCommentsCount в первоначальный вид и поправил соответствующим образом getCommentsTree
кстати там пришлось закомментировать блок
#if ($canComment == 0) {
# $total = JCommentsModel::getCommentsCount($object_id, $object_group);
# if ($total == 0) {
# return '';
# }
#}
Иначе, для зарегистрированных пользователей (только они у меня могут писать комментарии) не показывался блок навигации. Вместо закомментированного кода вставил
$total = JCommentsModel::getCommentsCount($object_id, $object_group, $config->get('template_view') == 'tree' ? "\nAND level = 0" : "");
Во-вторых, есть сомнения в производительности при более-менее "ветвистом" обсуждении (т.е. допустим когда речь идет о 5-7 уровнях комментариев) - поле path и было заведено для разбивки на страницы, но производительность я не измерял. Изначально планировалась динамическая загрузка дерева, по частям.
Тут я согласен, не совсем красивое решение с "like", но лучшего я в данном случае не придумал. Была мысль добавить в таблицу #__jcomments поле topparent в которое для всех дочерних элементов заносить id предка 0 уровня (т.е. это второй элемент в поле path), тогда по этому полю можно было построить индекс и вопросов с производительностью бы точно не возникло. Но это потребовало бы еще правки файлов jcomments.ajax.php и jcomments.class.php, в части сохранения комментария или написания плагина. Я правильно понимаю, что можно написать плагин на событие onAfterCommentChanged и вставить в него обновление указанного поля?
Для уменьшения количества правок пошел пока по более легкому пути. Проблем пока нет, может быть по тому что комментариев меньше 1000.
Была еще мысль поправить сортировку по убыванию дат. Текущий вариант с исправлением getCommentsList (сортировка по c.parent, c.date DESC) не совсем корректен, т.к. сортирует по дате комментария первого уровня, а хотелось бы чтобы при ответе на комментарий вся ветка "всплывала" на верх. Для этого нужно в таблице #__jcomments нужно поле update_time - обновления ветки. При сохранении комментария будет обновляться update_time у записи начала ветки (ее id мы можем взять из path)
В-третьих надо проверить, будет ли работать функция навигации к комментарию по ссылке. Т.е. при оригинальной постраничной навигации если в URL присутствует идентификатор комментария, то будет активизирована нужная страница и будет осуществлен переход к комментарию. Сходу не уверен, сработает ли это в описанной модификации.
В данной модификации это не работало. Я не знал об этом функционале, спасибо за подсказку. Чтобы все заработало нужно поправить файл components\com_jcomments\jcomments.ajax.php
и файл components\com_jcomments\jcomments.php
P.S. хотел добавить вложение с последней версией измененных файлов, но выдалась ошибка, файл с архивом 22 кБ
Папка upload заполнена. Попробуйте файл меньшего размера или свяжитесь с Администратором.