[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), так что запускать файл нужно исключительно из консоли.
Вот как изменился рейтинг у нас:
А вот, что произошло с незаслуженно заминусованными авторами:
За каждыми репрессиями должна следовать оттепель, так что я решил больше не наказывать обидчиков. Достаточно осознания самого факта, что их козни устранены и больше так сделать не получится.
Второй проблемой Tickets уже довольно давно является производительность секций, свойства которых складываются из их дочерних документов и комментариев.
Например, в секции «Вопросы» у нас уже 6 983 заметок, 1 420 771 просмотров и 33 871 комментариев. И каждый раз, при вызове метода TicketsSection::toArray() эти цифры подсчитывались заново, запросами в БД. Чем больше цифры — тем больше их считать, и как следствие, открытие разделов на сайте с каждым днём становилось всё медленнее.
Решением стало создание нового объекта TicketTotal, в который теперь пишутся все итоговые значения тикетов и секций:
У комментариев рейтинг хранится в их таблице, так что дублировать это в TicketTotal я пока не стал.
Теперь сниппеты getTickets и getTicketsSection присоединяют и выводят значения из TicketTotal. А раз есть получение данных, значит есть и сортировка!
— Весь код отформатирован по стандарту 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 новая версия появится, может быть, в следующем году.
Всем спасибо за внимание!
Владимир — 1000 руб.
Павел Гвоздь — 1500 руб.
Алексей К — 2000 руб.
Виталий Серый — 748 руб.
modstore.pro — 5000 руб.
Дмитрий — 1000 руб.
Павел — 1000 руб.
Сергей — 1000 руб.
Максим Степанов — 1000 руб.
Руслан Кундиус — 600 руб.
Виталий Батушев — 1000 руб.
Юрий Татаркин — 500 руб.
Roman — 1000 руб.
Слава Яркий — 500 руб.
Воеводский Михаил — 2152 руб.
Сбор окончен, новая версия доступна в репозитории.
Конечно, таких недоброжелателей можно отлавливать в ручном или автоматическом режиме, чтобы как-то наказывать и удалять их оценки, но ведь гораздо правильнее сразу запретить им это делать, так? Для этого нам нужно добавить новые настройки для секций тикетов, вот такие:
Таким образом, для каждой секции теперь можно указывать минимально необходимый рейтинг для создания тикетов и комментариев в ней, а также максимальный срок голосования за них.
Теперь нельзя пройти и заминусовать все старые комментарии, только те, за которые еще можно вообще голосовать согласно настроек секции. У нас, например, во всех разделах это одна неделя.
То есть, после установки новой версии 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 руб.
Сбор окончен, новая версия доступна в репозитории.
Комментарии: 55
Спасибо, Василий!
внес (отправил) свои 5 копеек
внес (отправил) свои 5 копеек
И еще 5 копеек отправил, что бы было веселей :)
Ха-ха, продолжай в том же духе =)
))) ага, как на бирже
Очень круто. Спасибо, Василий! Справедливость, восторжествовала! :)
Идея интересная! Я поддержал, как смог.
Идея интересная! Я поддержал, как смог.
Тоже задонатил, надеюсь народ поддержит почин. Надо ещё обратный отсчёт прикрутить, типа «До выкладывания Tickets 1.7.0 осталось XXXX рублей»
Спасибо! Буду просто писать периодически под заметкой, сколько осталось.
Теперь нельзя пройти и заминусовать все старые комментарии, только те, за которые еще можно вообще голосовать согласно настроек секции. У нас, например, во всех разделах это одна неделя.Немножко печально как-то...
Очень часто набредаю на старые комментарии, которые очень хочется приплюсовать за полезность и хоть так отблагодарить автора за дельный совет…
Да и на ресурс иногда неделю не заходишь, и как зайдёш, то получается уже опоздал на большую часть комментов.
Я не люблю минусовать, только плюсую конструктивные комментарии, поэтому меня это как-то и опечалило…
Будем надеяться, что хорошие комментарии заплюсуют те, кто заходит на ресурс чаще раза в неделю.
Я не люблю минусоватьПосмотри на скриншоты авторов «до» и «после» в заметке. Кое-кто очень любит.
Не у всех получается часто заходить на ресурс и причин может быть много — отпуск, командировка и тд
А почему бы просто не делать огранечение по времени на повышение рейтинга?
У людей психология такая заминусить — это как плюнуть, а плюс ставят только когда хотят искрени поблагодорить, как то так…
А почему бы просто не делать огранечение по времени на повышение рейтинга?
У людей психология такая заминусить — это как плюнуть, а плюс ставят только когда хотят искрени поблагодорить, как то так…
Вот если бы можно было сделать ограничение только на минусы по времени, тогда было бы логичнее.
@ndrew дело говорит, минусуют за компанию, а плюсуют искренне.
Почему бы не оставить возможность плюсовать в любое время?
@ndrew дело говорит, минусуют за компанию, а плюсуют искренне.
Почему бы не оставить возможность плюсовать в любое время?
Потому что это тоже самое, что вообще отключить минусы и оставить одни плюсики, чтобы как вконтактике, чтобы не обидно и слёзки не капали.
Детский сад, а не сообщество разработчиков.
Ограничено время голосования, отделять плюсики от минусиков я не буду — это неправильно. Проще вообще отключить к херам этот рейтинг и дело с концом, а то опять нытьё начинается.
Детский сад, а не сообщество разработчиков.
Ограничено время голосования, отделять плюсики от минусиков я не буду — это неправильно. Проще вообще отключить к херам этот рейтинг и дело с концом, а то опять нытьё начинается.
Эмпирическим путём выяснил, что при добавлении поста в избранное, дата публикования которого старше недели, плюса к рейтингу не будет и это плохо.
Можно ли добавить исключение хотя бы на добавление комментов и постов в избранное?
Можно ли добавить исключение хотя бы на добавление комментов и постов в избранное?
Это ошибка, поправил.
Как вариант защиты от минусования всех постов — ограничение кол-ва оценок юзера в сутки, можно в зависимости от рейтинга менять кол-во доступных оценок в день. Это несложно реализуется плагином, и можно оставить возможность голосовать за старые публикации
Ну раз несложно — ты всегда сможешь это реализовать на своём сайте.
Уже реализовано. Просто идея для тех, кому не нравится ограничивать голосование за старые посты.
Гениальная идея!
А теперь объясни, пожалуйста, как она поможет вычистить уже проставленные оценки, когда один человек уже прошёл и проставил Паше Гвоздю 500 минусов, а другой Ване Климчуку еще 200?
Верно, никак.
А теперь объясни, пожалуйста, как она поможет вычистить уже проставленные оценки, когда один человек уже прошёл и проставил Паше Гвоздю 500 минусов, а другой Ване Климчуку еще 200?
Верно, никак.
Тоесть гуру с большим рейтингом будут иметь больше лимита, так? Тогда новички остаются в пролете даже на плюсы? Когда они большему счету в них и нуждаются…
Не знаю с чего такой вообще переполох по стате. Если разработчик профи то ему как бы должно быть по фигу на минусы. А новичков всегда будут тыкать носом гуры ;)
Или кто то испугался минусов? )
Не знаю с чего такой вообще переполох по стате. Если разработчик профи то ему как бы должно быть по фигу на минусы. А новичков всегда будут тыкать носом гуры ;)
Или кто то испугался минусов? )
Гуру на этом сайте, как правило, носом не тыкают, только если совсем уж обнаглевших. Все же большинство адекатные взрослые люди. А вот обнаглевшие любят, наложив в штанишки, пройти и поминусовать за то, что их по головке не погладили за их идиотизм. Моя б воля, я бы им мозги лопатой вправлял бы.
+ 5000 от Modstore
Вы, парни, всегда поддерживаете.
Спасибо!
Спасибо!
+1000
+1000
Василий, я заметил, что если я хочу поставить плюс за топик- результат ноль. За комментарий- нормально, но ни один топик не плюсанулся. Хоть видео снимай), а то не поверишь)) Т.е. это так, как если бы я кликал не по стрелке, а посредине, я так и подумал, что криворукость моя, но нет, вот сейчас еще раз подтвердилось — не плюсуется. (Firefox 47.0 Win8.1)
Плюсанул этот пост, как было у Василия 4 166.8 рейтинга так и осталось. Видимо где-то ошибка есть.
Вышло, что не плюсанул, а воздержался из-за ошибки, которая уже исправлена.
Верю, ошибка была если голосовать со страницы тикета — просто опечатка в чанке. Исправил, теперь всё ок.
Заплюсую всех теперь)))
Если кликнуть по середине "-", чтобы посмотреть рейтинг — топик минусуется.
У меня, почему-то, работает как положено.
Я это уже некоторое время назад заметил. Вот вчера зашёл к вновь зарегистрированному человеку — был рейтинг по нулям, вернулся на стр. тикета, кликнул по середине, вернулся в профиль — "-1". Хотя в рейтинге самого тикета это не отображается — видно только на стр. профиля.
За тикет-то голосуется верно, это уже в подсчёте голосов профиля ошибка. Исправлю, спасибо.
Это оказался древний баг еще старых версий, который никто не замечал.
Исправил.
Исправил.
Автор сего замечательного дополнения Тикеты
прошу решить конфликт скриптов. В чем конкретно ошибка не понимаю.
Как исправить не понимаю. Надеюсь на ваше реагирование. Тикеты не работают при установке визуального редактора
Собственно суть со скринами по данному url — modx.pro/help/9513/
прошу решить конфликт скриптов. В чем конкретно ошибка не понимаю.
Как исправить не понимаю. Надеюсь на ваше реагирование. Тикеты не работают при установке визуального редактора
Собственно суть со скринами по данному url — modx.pro/help/9513/
А автор за это денежек получит? Или как всегда — только «спасибо»?
Большое спасибо, Василий!
внес (отправил) 1000
Надеюсь на скорое появление Tickets 1.7
внес (отправил) 1000
Надеюсь на скорое появление Tickets 1.7
Закинул
А новая версия высылается заинтересованным и участвующих в краундфандинге?
Если сумма не наберётся, я вышлю пакет только тем, кто задонатил, а в репозитории и на GitHub новая версия появится, может быть, в следующем году.
Василий, добавь пожалуйста тег kbd в Jevix для более красивого оформления статей на этом сайте.
Мысль вслух.
Василий, если сочтешь уместным:
Хорошо бы еще свежезарегестрированным назначить период карантина, что бы ни каких голосований, ни плюс ни минус поставить не могли в течении NNN дней, опять же, продлевать этот период мертвым аккаунтам, с которых нет ни комментариев ни иной активности, а только голосование. Это тоже явно заметно — любители голосовать создают только для голосования по несколько аккаунтов и используют только для такого удовлетворения своих комплексов.
И да, внести такую опцию в Tickets.
Василий, если сочтешь уместным:
Хорошо бы еще свежезарегестрированным назначить период карантина, что бы ни каких голосований, ни плюс ни минус поставить не могли в течении NNN дней, опять же, продлевать этот период мертвым аккаунтам, с которых нет ни комментариев ни иной активности, а только голосование. Это тоже явно заметно — любители голосовать создают только для голосования по несколько аккаунтов и используют только для такого удовлетворения своих комплексов.
И да, внести такую опцию в Tickets.
Подскажите по tpl.Tickets.sections.wrapper — в getTicketsSections нету шаблона такого, а чанк существует, в документации про него тоже ничего не сказано
Василий, а так должно быть?
После обновления не мог понять, почему у меня при просмотре любой статьи показывает одни и те же данные о просмотре (только первой).
После обновления не мог понять, почему у меня при просмотре любой статьи показывает одни и те же данные о просмотре (только первой).
В общем, у меня на сайте, если открыть любую статью получаю количество просмотров для первой статьи. Данные формирует сниппет TicketMeta.
А это, похоже, из-за нашего исправления xPDO — позже подебажу, что там происходит.
Точно. Вернул всё взад, теперь работает как надо.
Обновил функцию, буду тестировать дальше.
Этому сто лет в обед — работа TicketMeta с любыми ресурсами.
А для тикетов после обновления нужно позаходить в ресурсы, чтобы создались объекты TicketTotal, или запустить вручную скрипт пересчёта рейтинга из заметки про обновление.
А для тикетов после обновления нужно позаходить в ресурсы, чтобы создались объекты TicketTotal, или запустить вручную скрипт пересчёта рейтинга из заметки про обновление.
Василий, обрати внимание и на это modx.pro/help/10328/
Не хочу, у меня своих дел завались.
Василий, скажи, для чего убрана кнопка «Удалить» joxi.ru/BA00z0XfJleL7A при редактировании тикета? Это для чего-то сделано или только у меня так?
Еще один момент: когда редактирую тикет на бэкэнде, используя редактор TinyMCE, страница не видна полностью (нет скролла) и редактор не отображается. Возможно, так только у меня.
Небольшая просьба по поводу улучшения алгоритма подсчета — отключить влияние на итоговый рейтинг добавление автором в избранное своих собственных комментариев и тикетов.
А то, на мой взгляд, тут эксплойт на лицо.
А то, на мой взгляд, тут эксплойт на лицо.
Забавно!
В новой версии сообщества всё будет пересчитано заново, так что не страшно.
В новой версии сообщества всё будет пересчитано заново, так что не страшно.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.