К содержанию

[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, 08:38
modx.pro
6 003
Реклама

Комментарии: 55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                                  А то, на мой взгляд, тут эксплойт на лицо.
                                                    Василий Наумкин
                                                    Василий Наумкин Администратор
                                                    06 апреля 2018, 16:37
                                                    Забавно!

                                                    В новой версии сообщества всё будет пересчитано заново, так что не страшно.
                                                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                    55