Новости Joomla

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!Файловый менеджер Quantum — одно...

Файловый менеджер Quantum — одно из самых популярных решений для Joomla, созданное разработчиком из сообщества Joomla, Дмитрием Цымбалом (@tsymbalmitia). Он делает Quantum удобным, безопасным и современным, обновляет его, исправляет уязвимости и отвечает пользователям — всё это в свободное от основной работы время.

Теперь настал момент для следующего шага: развитие проекта требует больше времени и ресурсов.

0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 7158 Просмотров
*

ak1976

  • Новичок
  • 3
  • 0 / 0
Не знаю будет ли в новой версии поддержка разбиения на страницы при древовидной структуре отображения комментариев, а т.к. у меня JComments используется в т.ч. и для гостевой, то понадобилась эта функция.

Может еще кому пригодится.
Настройки (количество сообщений на страницу, количество вкладок с номерами) берутся из аналогичных настроек при постраничной структуре отображения. За количество сообщений берется количество сообщений верхнего уровня.

Для этого понадобились следующие исправления. В указанных файлах нужно заменить фукнции которые приведены под спойлерами.

Файл components\com_jcomments\model\jcomments.php
Спойлер
[свернуть]

Файл components\com_jcomments\jcomments.ajax.php
Спойлер
[свернуть]

Файл components\com_jcomments\jcomments.php
Спойлер
[свернуть]

и файл components\com_jcomments\tpl\default\tpl_tree.php
Спойлер
[свернуть]

Все исправленные файлы во вложении. Архив нужно распаковать в каталоге componetns. JComents версии 2.2.0.2

P.S. Исправления и архив обновлены до последней актуальной версии 24.11.2011

[вложение удалено Администратором]
« Последнее редактирование: 24.11.2011, 04:09:00 от ak1976 »
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Во-первых, вы испортили функцию подсчета количества комментариев для объекта, и она будет "врать", считая только комментарии первого уровня. Это мягко говоря неправильно. Да и зачем, там есть параметр $filter, через который можно легко и быстро добавить нужное условие (только там, где это требуется - при вычислении номера страницы).

Во-вторых, есть сомнения в производительности при более-менее "ветвистом" обсуждении (т.е. допустим когда речь идет о 5-7 уровнях комментариев) - поле path и было заведено для разбивки на страницы, но производительность я не измерял. Изначально планировалась динамическая загрузка дерева, по частям.

В-третьих надо проверить, будет ли работать функция навигации к комментарию по ссылке. Т.е. при оригинальной постраничной навигации если в URL присутствует идентификатор комментария, то будет активизирована нужная страница и будет осуществлен переход к комментарию. Сходу не уверен, сработает ли это в описанной модификации.

А в целом, да, интересно. А посмотрю что в результате получилось более детально вечером.
« Последнее редактирование: 22.11.2011, 17:29:51 от smart »
*

ak1976

  • Новичок
  • 3
  • 0 / 0
Во-первых, вы испортили функцию подсчета количества комментариев для объекта, и она будет "врать", считая только комментарии первого уровня. Это мягко говоря неправильно. Да и зачем, там есть параметр $filter, через который можно легко и быстро добавить нужное условие (только там, где это требуется - при вычислении номера страницы).
Спасибо за подсказку, вернул getCommentsCount в первоначальный вид и поправил соответствующим образом getCommentsTree
кстати там пришлось закомментировать блок
Код: php
		#if ($canComment == 0) {
# $total = JCommentsModel::getCommentsCount($object_id, $object_group);
# if ($total == 0) {
# return '';
# }
#}

Иначе, для зарегистрированных пользователей (только они у меня могут писать комментарии) не показывался блок навигации. Вместо закомментированного кода вставил
Код: php
		$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 заполнена. Попробуйте файл меньшего размера или свяжитесь с Администратором. 
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Спасибо за подсказку, вернул getCommentsCount в первоначальный вид и поправил соответствующим образом getCommentsTree
кстати там пришлось закомментировать блок
не совсем понятно, почему не работало... внесенные  изменения не должны влиять на тот кусок кода. Проверьте на всякий случай еще раз... Бывают конечно исключения, но вообще у меня лишние куски кода редко встречаются.

Тут я согласен, не совсем красивое решение с "like", но лучшего я в данном случае не придумал. Была мысль добавить в таблицу #__jcomments поле topparent в которое для всех дочерних элементов заносить id предка 0 уровня (т.е. это второй элемент в поле path), тогда по этому полю можно было построить индекс и вопросов с производительностью бы точно не возникло. Но это потребовало бы еще правки файлов jcomments.ajax.php и jcomments.class.php, в части сохранения комментария или написания плагина. Я правильно понимаю, что можно написать плагин на событие onAfterCommentChanged и вставить в него обновление указанного поля?
ну это можно обновить по сути одним SQL-запросом, в принципе, действительно, введение некоего поля thread_id, которое бы у всех вложенных комментариев вело на корневой комментарий ветки решило бы проблему с LIKE, и сделало бы ненужным поле path (разве что оставить его для динамической загрузки ветки). Я подумаю, может быть действительно добавлю такое поле.

Была еще мысль поправить сортировку по убыванию дат. Текущий вариант с исправлением getCommentsList (сортировка по c.parent, c.date DESC) не совсем корректен, т.к. сортирует по дате комментария первого уровня, а хотелось бы чтобы при ответе на комментарий вся ветка "всплывала" на верх. Для этого нужно в таблице #__jcomments нужно поле update_time - обновления ветки. При сохранении комментария будет обновляться update_time у записи начала ветки (ее id мы можем взять из path)
если добавить thread_id, то это будет очень просто и быстро

В данной модификации это не работало
P.S. хотел добавить вложение с последней версией измененных файлов, но выдалась ошибка, файл с архивом 22 кБ
Обновите первое сообщение темы, разместив в нем актуальные изменения во всех файлах, и замените приаттаченный файл на более свежий.
*

ak1976

  • Новичок
  • 3
  • 0 / 0
не совсем понятно, почему не работало... внесенные  изменения не должны влиять на тот кусок кода. Проверьте на всякий случай еще раз... Бывают конечно исключения, но вообще у меня лишние куски кода редко встречаются.
Судя по всему, это для оптимизации производительности. Если пользователь не может писать комментарии, вычисляется количество комментариев и если оно равно 0 сразу возвращается пустая строка, без дополнительных запросов. Больше число комментариев (переменная $total) в данной функции нигде не использовалась. А мне она понадобилась, но при наличии прав на написание комментариев переменная $total не вычислялась.
Поправил данный кусок так.
Код: php
$total = JCommentsModel::getCommentsCount($object_id, $object_group, $config->get('template_view') == 'tree' ? "\nAND level = 0" : "");
if ($canComment == 0 && $total == 0) {
return '';
}
это ближе всего к логике оригинала.

ну это можно обновить по сути одним SQL-запросом, в принципе, действительно, введение некоего поля thread_id, которое бы у всех вложенных комментариев вело на корневой комментарий ветки решило бы проблему с LIKE, и сделало бы ненужным поле path (разве что оставить его для динамической загрузки ветки). Я подумаю, может быть действительно добавлю такое поле.
...
если добавить thread_id, то это будет очень просто и быстро
Было бы замечательно внести эти дополнения в компонент. Если нужно, могу сделать все необходимые правки, включая интерфейс админки (дабы сэкономить ваше время, для более актуальных дел). Только наверное, лучше это сделать уже после выхода новой версии.


Обновите первое сообщение темы, разместив в нем актуальные изменения во всех файлах, и замените приаттаченный файл на более свежий.
обновил.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
А мне она понадобилась, но при наличии прав на написание комментариев переменная $total не вычислялась.
да, ведь если не делать разбивку на страницы, общее количество не требуется...

Было бы замечательно внести эти дополнения в компонент. Если нужно, могу сделать все необходимые правки, включая интерфейс админки (дабы сэкономить ваше время, для более актуальных дел). Только наверное, лучше это сделать уже после выхода новой версии.
Вполне возможно, что это включим и в текущую версию. Если у меня сегодня появится окошко свободного времени, попробуем реализовать идею с thread_id и посмотрим на производительность. А что касается идеального оттачивания кода - в этом смысла особого нет, ибо я очень сильно переработал компонент и код (в том числе и модели) весьма прилично изменился.

обновил.
угу, спасибо, я посмотрю
*

pasha4ur

  • Захожу иногда
  • 79
  • 0 / 1
Как сделать, чтобы последние комментарии выводились вначале?


Сорри. Обновил. Все работает.
 Пошел делать автору памятник  *DRINK*
« Последнее редактирование: 07.01.2012, 12:10:51 от pasha4ur »
*

Cheb

  • Осваиваюсь на форуме
  • 13
  • 0 / 0
Вот если бы такая доработка была к версии 2.3.0 - цены бы вам не было!
*

jiva242

  • Осваиваюсь на форуме
  • 14
  • 2 / 0
Приветствую.

Столкнулся с идентичной задачей - разбивка на страницы в древовидном шаблоне. Буду рад отблагодарить материально за изготовление такого патча для версии 2.3.0 (Joomla 1.5). Единственное отличие - это сделать ограничение уровня вложенности до пяти ответов, после чего комментарии переставали бы сдвигаться вправо, но отвечать можно было бы.

Можно в личку или в скайп (odin-v-pole-voin)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как убрать элемент со страницы?

Автор SpaceRabbit

Ответов: 6
Просмотров: 6022
Последний ответ 01.08.2011, 22:43:27
от Arrovil
Как использовать суффикс класса страницы?

Автор vdenu

Ответов: 2
Просмотров: 2793
Последний ответ 17.02.2011, 00:25:32
от vdenu