[Tickets] 1.7.0 улучшения рейтингов и ускорение работы


Как вы, наверное, помните, на нашем ресурсе назрела нехорошая ситуация — когда каждый недовольный может пойти и заминусовать комментарии любого автора, понизив, тем самым, ему рейтинг.

Конечно, таких недоброжелателей можно отлавливать в ручном или автоматическом режиме, чтобы как-то наказывать и удалять их оценки, но ведь гораздо правильнее сразу запретить им это делать, так? Для этого нам нужно добавить новые настройки для секций тикетов, вот такие:

Таким образом, для каждой секции теперь можно указывать минимально необходимый рейтинг для создания тикетов и комментариев в ней, а также максимальный срок голосования за них.

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

То есть, после установки новой версии Tickets и указания новых настроек секции, вам нужно как-то почистить старые голоса, которые были отданы после окончания рока голосования за объекты.

Для этого я написал отдельный скрипт очистки — он лежит в core/components/tickets/cron/remove_votes.php. На modx.pro он отработал за ~190 сек, при этом был пересчитан рейтинг всех 54 210 комментариев (удалены лишние плюсы и минусы).

После этого обязательно нужно пересчитать весь рейтинг сайта. Это делает второй скрипт, лежащий в core/components/tickets/cron/rebuild_rating.php. Он полностью удаляет все действия пользователей и создаёт их заново, по новым правилам, после чего пересчитывает рейтинг каждого пользователя.

Это очень долгая операция (1856 сек на modx.pro), так что запускать файл нужно исключительно из консоли.

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

Объект TicketTotal

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

Например, в секции «Вопросы» у нас уже 6 983 заметок, 1 420 771 просмотров и 33 871 комментариев. И каждый раз, при вызове метода TicketsSection::toArray() эти цифры подсчитывались заново, запросами в БД. Чем больше цифры — тем больше их считать, и как следствие, открытие разделов на сайте с каждым днём становилось всё медленнее.

Решением стало создание нового объекта TicketTotal, в который теперь пишутся все итоговые значения тикетов и секций:
  • tickets — количество тикетов, актуально только для секций
  • comments — количество комментариев секции или тикета
  • views — количество просмотров тикета, для секций считается сумма просмотренных тикетов
  • stars — количество добавлений в избранное тикета, для секций считается сумма избранных тикетов
  • rating — рейтинг тикета, для секций считается сумма рейтинга её тикетов.
  • rating_plus — количество голосов «за»
  • rating_minus — количество голосов «против»

У комментариев рейтинг хранится в их таблице, так что дублировать это в TicketTotal я пока не стал.

Теперь сниппеты getTickets и getTicketsSection присоединяют и выводят значения из TicketTotal. А раз есть получение данных, значит есть и сортировка!
[[!pdoPage?
	&element=`getTicketsSections`
	&sortby=`Total.rating`
	&sortdir=`desc`
	&showLog=`1`
	&limit=`20`
]]
[[!+page.nav]]
Таким образом, к нам вернулся функционал, отключенный в ранних версиях Tickets из-за проблем со скоростью.

Другие изменения

— Весь код отформатирован по стандарту PSR-2.

— Требуется MODX 2.3+, всё лишнее от 2.2 выброшено на свалку.

— Сниппеты научились понимать параметры-массивы, теперь их проще использовать с Fenom.

— Системная настройка section_content_default теперь пустая, по аналогии с новой версией miniShop2.4

— Добавлены новые системные события: OnBeforeTicketVote, OnBeforeCommentVote, OnBeforeTicketStar, OnBeforeTicketUnStar, OnBeforeCommentStar и OnBeforeCommentUnStar. Можно использовать их, чтобы запрещать людям голосовать или добавлять что-то в избранное.

— [#139] При сохранении тикета возвращается его id.

Краудфандинг

А вот теперь самая интересная новость — новая версия полностью готова и уже установлена на modx.pro; рейтинги пересчитаны, за старые комменты голосовать нельзя — полёт нормальный.

Но в репозитории новой версии пока нет, потому что я потратил очень много времени на её разработку и мне хочется его как-то компенсировать.

Поэтому, давайте попробуем новую идею: все заинтересованные пользователи Tickets перечисляют сколько не жалко денег у меня на сайте, и как только мы набираем 30 000 рублей, я активирую новую версию в репозитории и выкладываю исходники изменений на GitHub.

Мне кажется, это гораздо интереснее, чем сначала собирать деньги, а потом ждать, с неизвестным результатом. Тут уже всё готово, вы видите итоги работы, осталось только компенсировать издержки автору.

Если сумма не наберётся, я вышлю пакет только тем, кто задонатил, а в репозитории и на GitHub новая версия появится, может быть, в следующем году.

Всем спасибо за внимание!

Обновлено 10.10.2016

Владимир — 1000 руб.
Павел Гвоздь — 1500 руб.
Алексей К — 2000 руб.
Виталий Серый — 748 руб.
modstore.pro — 5000 руб.
Дмитрий — 1000 руб.
Павел — 1000 руб.
Сергей — 1000 руб.
Максим Степанов — 1000 руб.
Руслан Кундиус — 600 руб.
Виталий Батушев — 1000 руб.
Юрий Татаркин — 500 руб.
Roman — 1000 руб.
Слава Яркий — 500 руб.
Воеводский Михаил — 2152 руб.

Сбор окончен, новая версия доступна в репозитории.
31 июля 2016, 11:38    Василий Наумкин   G+  
5    1530 +7

Комментарии (53)

  1. Владимир 31 июля 2016, 12:27 # +4
    Спасибо, Василий!
    внес (отправил) свои 5 копеек
    1. Владимир 31 июля 2016, 13:02 # +1
      И еще 5 копеек отправил, что бы было веселей :)
      1. Василий Наумкин 31 июля 2016, 13:08 # 0
        Ха-ха, продолжай в том же духе =)
        1. Владимир 31 июля 2016, 13:10 # 0
          ))) ага, как на бирже
      2. Павел Гвоздь 31 июля 2016, 15:53 # +6
        Очень круто. Спасибо, Василий! Справедливость, восторжествовала! :)
        Идея интересная! Я поддержал, как смог.
        1. Алексей К 31 июля 2016, 18:42 # +2
          Тоже задонатил, надеюсь народ поддержит почин. Надо ещё обратный отсчёт прикрутить, типа «До выкладывания Tickets 1.7.0 осталось XXXX рублей»
          1. Василий Наумкин 31 июля 2016, 18:47 # +1
            Спасибо! Буду просто писать периодически под заметкой, сколько осталось.
          2. Василий Столейков 31 июля 2016, 21:44 # +2
            Теперь нельзя пройти и заминусовать все старые комментарии, только те, за которые еще можно вообще голосовать согласно настроек секции. У нас, например, во всех разделах это одна неделя.
            Немножко печально как-то...

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

            Я не люблю минусовать, только плюсую конструктивные комментарии, поэтому меня это как-то и опечалило…
            1. Василий Наумкин 31 июля 2016, 23:30 # +1
              Будем надеяться, что хорошие комментарии заплюсуют те, кто заходит на ресурс чаще раза в неделю.

              Я не люблю минусовать
              Посмотри на скриншоты авторов «до» и «после» в заметке. Кое-кто очень любит.
              1. @ndrew 01 августа 2016, 01:16 # 0
                Не у всех получается часто заходить на ресурс и причин может быть много — отпуск, командировка и тд

                А почему бы просто не делать огранечение по времени на повышение рейтинга?

                У людей психология такая заминусить — это как плюнуть, а плюс ставят только когда хотят искрени поблагодорить, как то так…
                1. Василий Столейков 01 августа 2016, 06:56 # +1
                  Вот если бы можно было сделать ограничение только на минусы по времени, тогда было бы логичнее.
                  @ndrew дело говорит, минусуют за компанию, а плюсуют искренне.
                  Почему бы не оставить возможность плюсовать в любое время?
                  1. Василий Наумкин 01 августа 2016, 09:11 # +1
                    Потому что это тоже самое, что вообще отключить минусы и оставить одни плюсики, чтобы как вконтактике, чтобы не обидно и слёзки не капали.

                    Детский сад, а не сообщество разработчиков.

                    Ограничено время голосования, отделять плюсики от минусиков я не буду — это неправильно. Проще вообще отключить к херам этот рейтинг и дело с концом, а то опять нытьё начинается.
              2. Роман Садоян 31 июля 2016, 23:06 # +1
                Эмпирическим путём выяснил, что при добавлении поста в избранное, дата публикования которого старше недели, плюса к рейтингу не будет и это плохо.
                Можно ли добавить исключение хотя бы на добавление комментов и постов в избранное?
                1. Василий Наумкин 31 июля 2016, 23:28 # 0
                  Это ошибка, поправил.
                2. Дмитрий Иванов 31 июля 2016, 23:40 # 0
                  Как вариант защиты от минусования всех постов — ограничение кол-ва оценок юзера в сутки, можно в зависимости от рейтинга менять кол-во доступных оценок в день. Это несложно реализуется плагином, и можно оставить возможность голосовать за старые публикации
                  1. Василий Наумкин 31 июля 2016, 23:43 # 0
                    Ну раз несложно — ты всегда сможешь это реализовать на своём сайте.
                    1. Дмитрий Иванов 01 августа 2016, 01:30 # 0
                      Уже реализовано. Просто идея для тех, кому не нравится ограничивать голосование за старые посты.
                      1. Василий Наумкин 01 августа 2016, 09:14 # 0
                        Гениальная идея!

                        А теперь объясни, пожалуйста, как она поможет вычистить уже проставленные оценки, когда один человек уже прошёл и проставил Паше Гвоздю 500 минусов, а другой Ване Климчуку еще 200?

                        Верно, никак.
                    2. @ndrew 01 августа 2016, 01:40 # +2
                      Тоесть гуру с большим рейтингом будут иметь больше лимита, так? Тогда новички остаются в пролете даже на плюсы? Когда они большему счету в них и нуждаются…
                      Не знаю с чего такой вообще переполох по стате. Если разработчик профи то ему как бы должно быть по фигу на минусы. А новичков всегда будут тыкать носом гуры ;)

                      Или кто то испугался минусов? )
                      1. Иван Климчук 01 августа 2016, 11:02 # +2
                        Гуру на этом сайте, как правило, носом не тыкают, только если совсем уж обнаглевших. Все же большинство адекатные взрослые люди. А вот обнаглевшие любят, наложив в штанишки, пройти и поминусовать за то, что их по головке не погладили за их идиотизм. Моя б воля, я бы им мозги лопатой вправлял бы.
                    3. Виталий Дощенко 01 августа 2016, 18:19 # +4
                      + 5000 от Modstore
                      1. Василий Наумкин 01 августа 2016, 18:32 # 0
                        Вы, парни, всегда поддерживаете.

                        Спасибо!
                      2. Дмитрий 02 августа 2016, 10:38 # +1
                        +1000
                        1. Максим Степанов 03 августа 2016, 09:01 # 0
                          +1000
                          1. Владимир 03 августа 2016, 22:01 # 0
                            Василий, я заметил, что если я хочу поставить плюс за топик- результат ноль. За комментарий- нормально, но ни один топик не плюсанулся. Хоть видео снимай), а то не поверишь)) Т.е. это так, как если бы я кликал не по стрелке, а посредине, я так и подумал, что криворукость моя, но нет, вот сейчас еще раз подтвердилось — не плюсуется. (Firefox 47.0 Win8.1)
                            1. Роман Садоян 04 августа 2016, 00:31 # +1
                              Плюсанул этот пост, как было у Василия 4 166.8 рейтинга так и осталось. Видимо где-то ошибка есть.
                              1. Василий Наумкин 04 августа 2016, 07:29 # +1
                                Вышло, что не плюсанул, а воздержался из-за ошибки, которая уже исправлена.
                              2. Василий Наумкин 04 августа 2016, 07:28 # +1
                                Верю, ошибка была если голосовать со страницы тикета — просто опечатка в чанке. Исправил, теперь всё ок.
                                1. Владимир 04 августа 2016, 11:11 # 0
                                  Заплюсую всех теперь)))
                                  1. Марат Марабар 09 августа 2016, 22:20 # +2
                                    Если кликнуть по середине "-", чтобы посмотреть рейтинг — топик минусуется.
                                    1. Василий Наумкин 10 августа 2016, 04:56 # 0
                                      У меня, почему-то, работает как положено.
                                      1. Марат Марабар 10 августа 2016, 08:34 # 0
                                        Я это уже некоторое время назад заметил. Вот вчера зашёл к вновь зарегистрированному человеку — был рейтинг по нулям, вернулся на стр. тикета, кликнул по середине, вернулся в профиль — "-1". Хотя в рейтинге самого тикета это не отображается — видно только на стр. профиля.
                                        1. Василий Наумкин 10 августа 2016, 09:31 # +1
                                          За тикет-то голосуется верно, это уже в подсчёте голосов профиля ошибка. Исправлю, спасибо.
                                          1. Василий Наумкин 14 августа 2016, 13:50 # +1
                                            Это оказался древний баг еще старых версий, который никто не замечал.

                                            Исправил.
                                  2. Konstantin 10 августа 2016, 17:17 # 0
                                    Автор сего замечательного дополнения Тикеты

                                    прошу решить конфликт скриптов. В чем конкретно ошибка не понимаю.
                                    Как исправить не понимаю. Надеюсь на ваше реагирование. Тикеты не работают при установке визуального редактора
                                    Собственно суть со скринами по данному url — modx.pro/help/9513/
                                    1. Илья Уткин 10 августа 2016, 18:02 # +1
                                      А автор за это денежек получит? Или как всегда — только «спасибо»?
                                    2. Roman 16 августа 2016, 00:24 # +1
                                      Большое спасибо, Василий!
                                      внес (отправил) 1000
                                      Надеюсь на скорое появление Tickets 1.7
                                      1. Yar 20 августа 2016, 01:42 # +1
                                        Закинул
                                        1. Алексей 18 сентября 2016, 14:46 # 0
                                          А новая версия высылается заинтересованным и участвующих в краундфандинге?
                                          1. Андрей П 18 сентября 2016, 22:39 # 0
                                            Если сумма не наберётся, я вышлю пакет только тем, кто задонатил, а в репозитории и на GitHub новая версия появится, может быть, в следующем году.
                                          2. Сергей Шлоков 01 октября 2016, 08:57 # 0
                                            Василий, добавь пожалуйста тег kbd в Jevix для более красивого оформления статей на этом сайте.
                                            1. Владимир 15 октября 2016, 20:32 # 0
                                              Мысль вслух.
                                              Василий, если сочтешь уместным:
                                              Хорошо бы еще свежезарегестрированным назначить период карантина, что бы ни каких голосований, ни плюс ни минус поставить не могли в течении NNN дней, опять же, продлевать этот период мертвым аккаунтам, с которых нет ни комментариев ни иной активности, а только голосование. Это тоже явно заметно — любители голосовать создают только для голосования по несколько аккаунтов и используют только для такого удовлетворения своих комплексов.
                                              И да, внести такую опцию в Tickets.
                                              1. Сергей Лим 24 октября 2016, 08:01 # 0
                                                Подскажите по tpl.Tickets.sections.wrapper — в getTicketsSections нету шаблона такого, а чанк существует, в документации про него тоже ничего не сказано
                                                1. Сергей Шлоков 12 ноября 2016, 12:09 # +1
                                                  Василий, а так должно быть?
                                                  После обновления не мог понять, почему у меня при просмотре любой статьи показывает одни и те же данные о просмотре (только первой).
                                                  1. Сергей Шлоков 12 ноября 2016, 12:37 # 0
                                                    В общем, у меня на сайте, если открыть любую статью получаю количество просмотров для первой статьи. Данные формирует сниппет TicketMeta.
                                                    1. Василий Наумкин 12 ноября 2016, 12:41 # 0
                                                      А это, похоже, из-за нашего исправления xPDO — позже подебажу, что там происходит.
                                                      1. Сергей Шлоков 12 ноября 2016, 12:45 # 0
                                                        Точно. Вернул всё взад, теперь работает как надо.
                                                        1. Василий Наумкин 12 ноября 2016, 13:03 # 0
                                                          Обновил функцию, буду тестировать дальше.
                                                    2. Василий Наумкин 12 ноября 2016, 12:38 # 0
                                                      Этому сто лет в обед — работа TicketMeta с любыми ресурсами.

                                                      А для тикетов после обновления нужно позаходить в ресурсы, чтобы создались объекты TicketTotal, или запустить вручную скрипт пересчёта рейтинга из заметки про обновление.
                                                      1. Дмитрий Иванов 12 ноября 2016, 13:18 # 0
                                                        Василий, обрати внимание и на это modx.pro/help/10328/
                                                        1. Василий Наумкин 12 ноября 2016, 13:33 # 0
                                                          Не хочу, у меня своих дел завались.
                                                          1. Wassi Wassinen 20 ноября 2016, 00:19 # 0
                                                            Василий, скажи, для чего убрана кнопка «Удалить» joxi.ru/BA00z0XfJleL7A при редактировании тикета? Это для чего-то сделано или только у меня так?
                                                            1. Wassi Wassinen 20 ноября 2016, 00:43 # 0
                                                              Еще один момент: когда редактирую тикет на бэкэнде, используя редактор TinyMCE, страница не видна полностью (нет скролла) и редактор не отображается. Возможно, так только у меня.
                                                      Вы должны авторизоваться, чтобы оставлять комментарии.