Постраничное разбиение комментариев

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

Для включения постраничности в конфиге появились два параметра:
$config['module']['comment']['use_nested'] = true; 
$config['module']['comment']['nested_per_page'] = 50;
Первый переводит комментарии в режим дерева (nested set), второй задает число корневых элементов на одну страницу. Если значение nested_per_page = 0, то разбивки на страницы не будет, будет просто использоваться nested set для построения дерева.

Для перевода существующих комментариев в режим use_nested = true необходимо запустить конвертацию/восстановление структуры дерева по адресу — /admin/restorecomment/. Если комментариев много, то процесс конвертации может затянуться, поэтому не забудьте на время выставить в php.ini большой лимит выполнения php скриптов. После конвертации появится сообщение — restore ok.

Ссылка на изменения — trac.lsdev.ru/livestreet/changeset?new=1015%40trunk&old=1006%40trunk
Не забудьте выполнить SQL патч — trac.lsdev.ru/livestreet/browser/trunk/install/convert_0.4.2_to_0.4.3.sql

86 комментариев

avatar
отличная новость!

сегодня займусь экспериментом с установкой. Надеюсь все станет хорошо.
  • Yuta
  • +1
avatar
Спасибо большое, очень нужная вещь.
Наконец-то «горячие» темы с тремя сотнями комментариев под крылом перестанут выглядеть монстрами из старого ужастика.
avatar
Отлично!
А еще для полноты картины покажите, какой конструкцией выводится пагинация в tpl.
avatar
Хм… При переходе по /admin/restorecomment/ выскакивает 404 ошибка… Кому-нибудь удалось запустить постраничность для комментариев?
avatar
необходима авторизация под админом
avatar
еще как вариант, отключить на время плагин админ-панель, если он установлен
avatar
Спасибо, сейчас попробую…

PS Также возникает ошибка:
Notice: Undefined index: count in ...../classes/actions/ActionBlog.class.php on line 657
avatar
если проблема была при $config['module']['comment']['use_nested'] = false; то поможет этот фикс trac.lsdev.ru/livestreet/changeset?new=1013%40trunk&old=1011%40trunk
avatar
Спасибо, применил… Пока еще не проверял на предмет повторного возникновения ошибки при $config['module']['comment']['use_nested'] = false;. Надеюсь, что не повторится…
avatar
Супер.
Тестируя, на Денвере, получилось установить. Все отлично и все нравится! Спасибо макс, то что нужно :)

Нюанс,
Если комментариев много, то процесс конвертации может затянуться, поэтому не забудьте на время выставить в php.ini большой лимит выполнения php скриптов.


max_execution_time = 30; Maximum execution time of each script, in seconds
ставим 600
memory_limit = 128M; Maximum amount of memory a script may consume (128MB)
ставим больше, иначе, как у меня выдало ошибку в течении работы скрипта, пришлось запускать заново.

После, возвращаем показатели назад.

Сначала не понял как оно «дробит» на страницы по количеству комментов,
( $config['module']['comment']['nested_per_page'] = 50; )
оказывается, что функционал считает «ветви», точнее «корневые элементы».
  • Yuta
  • 0
avatar
Проблема.
Топик получается в разбивке, допустим, на 2 страницы (1, 2 страница):

Комментарии датированы, сверху-вниз,
1 страница: с 15 июля по 26 декабря
2 страница: с 10 мая по 15 июля

А д.б. наоборот. Это только у меня?
  • Yuta
  • 0
avatar
так и должно быть
на первой странице самые последние комменты
avatar
ort
на первой странице самые последние комменты
Хм… У меня обратная ситуация — на первой странице более старые комментарии, а на последующих — более новые.
avatar
какой адрес сайта?
avatar
Посмотрите на этой странице. Я установил лимит корневых элементов =10.
avatar
ort, к стати, забыл сообщить. При добавлении комментария возникает следующий баг: как правило, должно происходить обновление дерева комментариев с отображением нового комментария, но этого не происходит. При попытке добавить комментарий (нажатием на кнопку «добавить») браузер (к примеру Firefox) пытается загрузить файл, к примеру, SNSjPkWV.part, содержащий следующую информацию
{"sCommentId":72,"sMsgTitle":"","sMsg":"","bStateError":false}

При этом, комментарий так и находятся в «состоянии добавления» («затененный», с вращающимся «loader'ом»). Новый комментарий становится видимым только при обновлении страницы браузером.

Понимаю, что какая-то проблема с аякс, но «куда копать» не знаю. Можете что-то посоветовать?
avatar
Комментарии отображаются в верном порядке — на второй странице самые первые (старые) комменты, имеются ввиду только корневые.
По добавлению, что на этой строчке trac.lsdev.ru/livestreet/browser/tags/0.4.2/classes/actions/ActionBlog.class.php#L789? Такое чувство, что там прописан 'json' в результате не законченного ранее проведенного апдейта.
avatar
Да, действительно, так и было… Исправил.

Но, теперь при добавлении комментария выскакивает красное аякс'овское окошко об ошибке (англ. «пожалуйста, повторите еще раз»).

При «браузерном» обновлении страницы комментарий появляется…
avatar
теперь помочь не смогу, т.е. версия не дефолтная и не понятно какие изменения в коде
avatar
Я может чего-то придумываю… но пользователей так запутаешь на сайте

Принято последние комментарии переносить не на первую страницу, а на последнюю.

Макс, можно настроить, чтобы это выдавало вот так:
www.championat.ru/football/_euro/article-65267.html
  • Yuta
  • 0
avatar
теряется смысл от восприятия разбития на страницы.

тогда уже по этой логике, нужно выдачу комментариев(старые-новые) строить не "сверху-вниз", а "снизу-вверх"
:(
avatar
Действительно… Я тоже не совсем понимаю логику подобного разбития на страницы.
avatar
фот именно, поэтому избран вариант, при котором работает схема «сверху-вниз» как и в дефолтной версии, чтоб пользователей не переучивать
avatar
так так они и выводятся, только номера страниц по другому, у нас 1 страница — это всегда свежие комменты, как и с постраничным разбиением топиков
avatar
У меня, к примеру, на 1-й странице сверху идут комментарии от 23.08.2010 под ними идут комментарии от 19-20.09.2010, а на 2-й странице опять идут комментарии от 23.08.2010
avatar
а какие должны идти на второй странице? самые старые — 23.08.2010, 22.08.2010 и т.п.
avatar
Согласен, но это было бы логично, если бы на 1-й странице не остались комментарии от 23.08.2010.
avatar
почему? у них просто время разное, на первой страницы время больше
avatar
Наконец-то до меня дошло… :)

Логика следующая (схематически, для трех страниц): ↑\↑\↑ (стрелочками указано направление от новых к старым).

Т. е. — новый коммент помещается в самый низ 1-й страницы, при этом перемещая верхний коммент с самого верха 1-й страницы в самый низ 2-й страницы и т. д. по цепочке…
avatar
Хм… Довольно неудобное устройство комментариев. Я полминуты рисовал пальцем по столу и шевелил губами, пока не понял. Почему бы не сделать как в жж? На первой странице самые старые, на последней самые новые. Да, скучный вариант, но зато самый логичный и понятный народу. Так на форумах, так в ЖЖ, везде так.

ort, может, этим вариантом и сделать, как люди ниже в комментах просят? И область комментирования самого топика переместить снизу наверх. А после коммента топику кидать юзера на последнюю страницу. Да, будет без аякса, не однообразно, но зато удобно.

Держать на первой странице самые новые комментарии можно только в том случае, если комментарии идут снизу вверх. Иначе при переходе на другую страницу в мозгу у человека идет логический разрыв. Он и так мозг напрягает, чтобы понять, что такое лайвстрит, рейтинг и блоги, такими комментами его вообще добить можно и он уйдет с сайта навсегда.
avatar
Он и так мозг напрягает, чтобы понять, что такое лайвстрит, рейтинг и блоги, такими комментами его вообще добить можно и он уйдет с сайта навсегда.
либо влюбится окончательно и без поворотно :)
avatar
не без этого, но лучше, согласись, читать книгу отворачивая страницы с правой стороны, а не слевой.
иначе мозг не у всех но вынесет, и будуд долбать не тебя, а меня, думая что это я такое придумал :)
avatar
«нельзя заставлять пользователя думать» — первый и главный принцип построения популярных систем. :)
Навык чтения комментов у человека уже выработался, нельзя его ломать. У лайвстрита главная фишка — легкость, все на кончиках пальцев — дизайн, аяксовые комменты, общее юзабилити — все легко, все летает, приятно. А эти комменты в концепцию резко добавляют стресс.
avatar
Может быть имеет смысл навигацию по страницам продублировать и сверху, над комментариями, чтобы зашедший в топик человек сходу понимал что читает не все комментарии а лишь продолжения обсуждения?
avatar
И область комментирования самого топика переместить снизу наверх
вот это только не нужно, уже проверено. комментировать будут не в тему, а потом спохватываться, а удалить нельзя.
avatar
Ммм, не догоняю… Почему не в тему комментировать будут, если поле комментирования будет между телом топика и первым комментом? Они будут думать, что комментят первый коммент?
avatar
имел ввиду — сначала напишут, а потом дочитают до конца все события вокруг темы.
кнопка Комментировать д.б. после Комментариев, имхо
avatar
Да, действительно, логично. Ну тогда оставить её в самом низу, после пагинации.
avatar
Кстати, заметил, что пропала кнопка обновления комментариев, «прилепленная» к правому краю страницы.
avatar
логично, кнопка апдейта не совместима с постраничностью
avatar
Мда… Это огромный минус постраничности… Тогда теряется весь смысл обсуждения — будет очень сложно найти новые комментарии к топику. Если об ответах на свой комментарий ты получаешь уведомление, то с новыми комментариями (если они не являются корневыми) от других пользователей — проблема.

Здесь, имхо, единственным вариантом является отказ от древовидной структуры при использовании постраничности.

PS Или все-таки каким-то образом можно совместить кнопку апдейта с постраничностью? Возможно, вопрос и глупый, но я пока новичок в LS.
avatar
Или все-таки каким-то образом можно совместить кнопку апдейта с постраничностью? Возможно, вопрос и глупый, но я пока новичок в LS.
нельзя
не встречал ресурсов с таким функционалом
avatar
А в чем проблема? Когда количество новых комментов исчерпывается но первой странице, он прыгает на вторую и так далее.
avatar
Макс, если у тебя свое восприятие «велосипеда»

дай возможность, пользователю выбирать, сделай переменную в конфиге — чтобы можно было вывести и так и так

То что на сайте выдача комментов д.б. вот так — www.championat.ru/football/_euro/article-65267.html

это привычно для большинства, я понимаю — что можно заставить «переучиться», но мне кажется это лишнее. Ты видел моих дам.
  • Yuta
  • 0
avatar
То что на сайте выдача комментов д.б. вот так — www.championat.ru/football/_euro/article-65267.html
отличие в чем? я открываю эту страницы и попадаю на список последних комментов сверху-вниз, теперь открываю страницу на ЛС и попадаю на список последних комментов сверху-вниз.
То что номер страницы с последними комментами имеет номер «1», так это норма для ЛС — посмотри какой номер страницы у списка топиков с последними из них, верно, тоже «1»
avatar
1)
посмотри какой номер страницы у списка топиков
я не хочу и с тобой спорить, но уже писал, ты не читаешь:
тогда уже по этой логике, нужно выдачу комментариев(старые-новые) строить не «сверху-вниз», а «снизу-вверх»
ведь топики именно так и выводятся.

2) разбивка на страницы по устоявшемуся, привычному виду д.б.:

Форма вывода (только!) сверху-вниз
Старые комменты — 1 страница
Новые комменты — последующие страницы (2,3, т.д.)

При открытии именно Топика — выводится 1 страница с комментами
При клике на «Прямой эфир» — выводится страница та, на которой размещен коммент(исходя из ветви)
avatar
суммирую чего я хотел добиться:
1. прежнего вывода комментов — сверху-вниз
2. прежней нумерации страниц — самое свежее на первой странице

В итоге для пользователя ничего не меняется, всё как и раньше.
avatar
Макс, будешь мегаумницей, сделай, пожалуйста, альтернативой (если можно через конфиг для выбора) пункт 2.

2. прежней нумерации страниц — самое свежее на первой странице
чтобы самое свежее на последующих,

и все будет просто Замечательно! И хлопцы сыты и кони запряжоны :)
Очень-очень важно.
avatar
ort, если следовать логике вывода комментариев сверху-вниз, то нумерация страниц должна быть в обратном порядке, т. е. не 1, 2, 3, а 3, 2, 1. Тогда все должно стать на свои места. Имхо, естественно…
avatar
Я бы все-таки делал комментарии снизу вверх. А то какая-то временная чехарда получается.
Время комментариев по страницам — от конца к началу.
Время комментариев внутри страницы — от начала к концу.

Ведь в списке топиков так и есть: последний топик в самом верху.
avatar
Хотя тогда с ветвями реально мозг закипает.
avatar
Может быть все-таки начхать на заведенный порядок и все-таки сделать прямое время?
То есть когда последний комментарий оказывается на последней странице.
avatar
Я бы все-таки делал комментарии снизу вверх

издеваеетесь??! не нужно таких шуток! убить жизнь на сайте)?
avatar
Да уже сам понял.
Единственный способ не скакать во времени — делать последний коммент на последней странице. Пи по умолчанию именно последнюю страницу комментариев под постом открывать.
avatar
разбивка на странице в древесном виде это зубодробильный вынос мозга для юзера.
если в одну страницу смотреть, то достаточно нажимать на циферку справа, что бы увидеть все новые комментарии.
А в постраничном режиме? надо пройтись по всем страницам и увидеть что там новое? на каждой? а если страниц 30, и на каждой по 3 новых коммента? как мне их увидеть все?

Наверное есть смысл делать комментарии вообще без деревьев, просто по дате.
Или вытаскивать на первые места те ветки комментариев, в которых произошли изменения, но тогда очерёдность беседы превратится в еще больший ужас…

вообще не очень понятно, нафига нужна эта постраничность, когда можно просто сразу сворачивать ветки и грузить их аяксом например нажав на плюсик, как в жж. хотя там и постраничность есть /*чешет затылок*/
  • Vilz
  • 0
avatar
вообще не очень понятно, нафига нужна эта постраничность
комментов первого уровня может быть тысячи, здесь уже раскрытие по ajax не поможет
avatar
Ну пусть он перепрыгивает на следующую страницу, когда новые комменты на данной странице закончатся. Это так сложно?
avatar
насколько я понимаю обычно постраничность древовидных делается так:
еще новей комментарий

новый комментарий
— ответ
— ответ

и т.д. и по чуть чуть начинают уходить в архив на вторую и третью страницу. Кто ответил на второй странице там же и получает ответы, своего рода вынос мозга, но иначе никак, постепенно по мере поступления новых комментариев ветка будет смещаться еще глубже и искать ее еще сложней будет, остаётся надежда на почтовые уведомления, кстати при постраничности в почтовое уведомление урл передаст?
avatar
схема вывода комментариев «снизу-вверх» неудобна в восприятии!
avatar
В ЖЖ давно отработана эта схема. Когда комментов несколько тысяч — это значит, что народу столько, что никого не волнует, что написали другие. Народу важно отследить свои дискуссии. Если на почту будут приходить уведомлялки с правильным урлом, на нужную страницу и перематываться до нужного треда (а это кстати, возможно только тогда, когда на первой странице старое, а на последней новое, а не как сейчас) — народа это более чем устроит.
avatar
Поддерживаю, не стоит изобретать велосипедов. В жж ужа давно это реализовано и никто не жалуется.
avatar
Пофиксил уведомления о новых комментах, теперь ссылка на коммент будет верной
trac.lsdev.ru/livestreet/changeset/1014
  • ort
  • 0
avatar
Постраничная разбивка — это шаг назад. Было бы логично и разумно в топиках с большим количеством комментариев загружать ветки до определённого уровня. Для просмотра более глубокой иерархии можно предусмотреть ссылку «показать обсуждение», по клику на которую можно с использованием ajax подгружать и показывать содержимое.
avatar
avatar
Тысяча комментариев — не аргумент, да и сама проблема явно надуманная. Во-первых, в рунете сайты с такими массированными обсуждениями можно пересчитать по пальцам одной руки. Во-вторых, подобные ресурсы не хостятся на шаредах и даже на впс, так что аппаратных проблем у них нет.
avatar
если бы это было так, то этой модификации бы не было
я её сделал из-за одного крупного проекта на ЛС, где число комментов доходило до нескольких тысяч, что прямым образом отражалось на времени генерации страницы.
avatar
Ключевое слово — «из-за одного». Очень хорошо, что это было кому-то полезно.
avatar
onthefly, проектов на лс с 1000 комментов я лично не видел тоже, наверное текстовых.

Но видел, не раз, комментов под 400, через один забитых фотками, в некоторых по несколько штук.
Не буду говорить о времени загрузки этой страницы через диал-ап, но трафик пользователей кто не имеет анлима, можно пожалеть. Плюсы от этой фичи есть. Проблема в вашем понимании, что вы не видели сайты на лс с реально активным комментированием.
Кому нужна эта опция, тот включит, а процентов 99 — даже и не подумают, по причине ненужности. Зачем волноваться тогда?
avatar
почему волнуюсь я?
да вот, через неделю перехожу на 0,4,2 и там будет юркин «Поток» (который требовали усиленно пользователи и которым мне пришлось нагружать randomtoy'я)
сидел и дуумал, что будет с топиками, которые будут постоянно на виду. Этож придется постоянно «пасти» когда отключать комментирование, чтобы топик нормально загружался…
А тут Орт, вчера, мегачеловек. С функционалом разбивки. Мечты сбываются :)
avatar
Я не волнуюсь и у меня нет никаких проблем. Здесь я не выступаю против постраничной разбивки, но мне бы очень хотелось, чтобы ЛС был удобным и современным продуктом. Хорошо бы отложить дедовские методы в сторону и оставить их старпёрам и ретроградам.

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

Впрочем, в ЛС и так есть что покритиковать, некоторые вещи реализованы, мягко говоря, странно. Другое дело, что говорить об этом смысла нет — всё равно критика не будет услышана.

В этом движке самым поразительным образом сочетаются интересные элегантные решения и элементарный непрофессионализм. Чтобы не быть голословным и предупредить возможные вопросы, предложу обратить внимание на то, как реализованы комментарии и добавление в избранное.
avatar
Полностью согласен. Пагинация шаг назад. Еще во времена рождения LiveStreet АЯКС подгрузка веток была блестяще сделана на DIGG А сегодня мы видим TWITTER и подобную реализацию в плугине МИКРОБЛОГОВ. Выбирай не хочу.

Собственно пагинацию можно переделать по типу микроблогов/твиттера без больших усилий.

Не могу также сказать что мне нужен/ненужен такой функционал. Собственный сервер позволяет не думать о нагрузке в 500-700 комментариях, даже с видео роликами.
avatar
Вот и я столкнулся с этой проблемой. И блин, это первый раз когда я с тобой полностью согласен. Пагинации в соц. сети не место. =)
avatar
Посмотри любой пост Тёмы Лебедева. Даже если в ветке показывать полностью два сообщения, а остальное скрывать — все равно страница получится неподъёмной. Так что пагинация все-таки нужна.
avatar
Тогда, при использовании функции постраничности, нужно отключать древовидную структуру. Иначе будет очень сложно отслеживать новые комментарии. Имхо, естественно.
avatar
Я уже писал — не думаю, что в этом есть проблема. Во-первых, есть блок последних комментов. Во-вторых если комментов так много, что нужна пагинация, вряд ли кто-то будет читать ВСЕ комменты, потому что их качество с ростом посещаемости неизбежно падает — опять же посмотрите ЖЖ. Главное для людей — возможность отслеживать свои ветки дискуссий. ЛС тут вполне справляется.
avatar
В чем-то я с Вами согласен. Но, согласитесь, многое зависит и от самой темы обсуждения. Если тема, допустим, подобна этой (достаточно интересна), то я, к примеру, отслеживаю в ней практически все ответы, т. к. задается очень много схожих вопросов. Зачем мне задавать повторно вопрос, если он уже задан — мне важно получить на него ответ.

И представьте себе каким образом отслеживать эти ответы, если функция (та же кнопка апдейта) не поддерживается?
avatar
Хотя блок последних комментов не поможет, в данной ситуации, зря его привел.

PS ort, в следующем апдейте сделай, плиз, возможность редактирования комментов. Сильно не хватает этой фичи.
avatar
и желательно всё это в плагин, для малограмотных типа меня )))
avatar
Добавлен параметр
$config['module']['comment']['nested_page_reverse'] = false;
позволяет выводить страницы в обратном порядке, trac.lsdev.ru/livestreet/changeset/1015
  • ort
  • 0
avatar
Может так дело и до фильтра по рейтингу комментариев дойдет.
Все же будет удобно читать первыми самые лучшие комментарии…
avatar
Угу, очень удобно. Особенно вторые и третьи по уровню вложенности :)))
avatar
Можно где нибудь посмотреть, как это выглядит?
avatar
всё установил, всё настроил, вроде работает. НО!.. При попытке отправить комментарий выдает такое окно
pix.am/CSuvl.JPG
avatar
прошу прощения, нашел livestreet.ru/blog/dev_livestreet/5380.html#comment79310
avatar
в php.ini стоят настройки
max_execution_time = 300000;
memory_limit = 10280M;
на втором часу работы перестройки комментариев появляется ошибка

Fatal error: Out of memory (allocated 1772617728) (tried to allocate 6144 bytes) in Z:\home\ls\www\forum\engine\lib\internal\ConfigSimple\Config.class.php(179): runtime-created function on line 1

Подскажите как избежать этой ошибки. С учетом уже существующих настроек вряд ли действительно не хватает памяти.
avatar
Тоже столкнулся с подобной ошибкой. Даже при самых адских параметрах php-fastcgi и nginx, при мощном сервере… нет, не выходит.
БД сайта >200Mb, треды комментариев — от 300 до 2000, 500 в среднем.
Что делать? Может, есть standalone-решение, чтоб остановить все разделы сайта и отдать все ресурсы на перестройку?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.