easyComm 1.0.4-beta2 - Оценки и Рейтинг
Для компонента easyComm доступно важное обновление (точнее скоро будет доступно, когда пакет опубликуют в магазине).
В этой версии 2 нововведения:
1. Добавлено поле IP адрес к сообщениям, думаю что сильно лишним это не будет, а только наоборот, полезным кому-то.
2. Добавлена Оценка к сообщениям. Про это подробнее ниже.
Отзывы, комментарии это конечно хорошо, но еще лучше, если можно оценить что-либо, например поставив оценку от 1 до 5 или от 1 до 10. При этом «0» означает что пользователь не поставил никакую оценку (а вовсе не то, что это означает «хуже некуда»).
Понимая это я изначально хотел реализовать подобный функционал в easyComm, вот и сделал.
У каждого сообщения появилось новое поле rating (tinyint), по умолчанию от 1 до 5, но в принципе возможность менять его в большую сторону заложена (для этого потребуется указать новое значение в системной настройке ec_rating_max и немного поменять пару чанков и css файл).
Для того, что бы это симпатично выглядело — небольшая комбинация html + css + js — и вуаля:

«Звездочки» весьма интерактивны: при наведении на них мышкой они показывают новый рейтинг, текст рядом так же меняется.

Можно запретить отправлять форму с непроставленной оценкой путем задания параметра requiredFields сниппета ecForm.
Сообщения (уже отзывы получается?) в списке выглядят так:

Когда у нас есть оценка от каждого пользователя — грех не посчитать общий рейтинг.
Соответственно считается рейтинг отдельно взятой цепочки.
Выбирая по какому алгоритму его считать я решил остановиться на 2-х вариантах, кому как удобнее: среднее арифметическое и Вильсона.
Про первый все понятно: сумму оценок делим на количество голосовавших.
Про второй все сложнее. В общем очень подробная статья habrahabr.ru/company/darudar/blog/143188/, почитайте, если есть минут 15.
Если нет, кратко объясню. При подсчете рейтинга, как среднего всех голосов, есть проблема: 2 голоса с оценкой «5» дадут средний рейтинг «5», а 1000 голосов, из которых 999 — «5», а 1 — «4», дадут рейтинг «4,999», таким образом этот результат будет хуже, что не очень то верно, правда ведь?
Алгоритм Вильсона позволяет это исправить, рейтинг считается с учетом некоего «доверительного уровня», когда мы говорим, что с вероятностью, например, 95% этот рейтинг верный. Про это подробно в статье =)
Чем больше вероятность (т.е. чем точнее результат мы хотим получить), тем больше голосов нужно, а пока голосов мало — рейтинг будет крутиться где-то посередине. Т.е. даже 10 оценок «5» не дадут вам общую «5», а что-нибудь около «3,5».
В общем результат на скриншоте снизу:

Здесь рейтинг рассчитан по 4-м оценкам: 3, 5, 5, 5, можно увидеть, какая разница в рейтинге при использовании обоих алгоритмов.
Кстати, тот самый «доверительный уровень» вынесен в настройки системы, что бы вы смогли его поменять, если будет нужно.
Для отображения рейтинга добавлен новый сниппет ecThreadRating, а сам рейтинг хранится в базе и рассчитывается в момент добавления/удаления/изменения сообщения с оценкой.
В админке добавлены все поля, связанные с Оценками, правда не так симпатично, как на фронтэнде, а просто числами:

У конкретного сообщения администратор может поменять Оценку, общий рейтинг будет перерасчитан.
Если есть вопросы — задавайте, отвечу.
Если компонент заинтересовал — милости прошу: modstore.pro/packages/utilities/easycomm
Что нового?
В этой версии 2 нововведения:
1. Добавлено поле IP адрес к сообщениям, думаю что сильно лишним это не будет, а только наоборот, полезным кому-то.
2. Добавлена Оценка к сообщениям. Про это подробнее ниже.
Отзывы, комментарии это конечно хорошо, но еще лучше, если можно оценить что-либо, например поставив оценку от 1 до 5 или от 1 до 10. При этом «0» означает что пользователь не поставил никакую оценку (а вовсе не то, что это означает «хуже некуда»).
Понимая это я изначально хотел реализовать подобный функционал в easyComm, вот и сделал.
Форма добавления сообщения и список сообщений
У каждого сообщения появилось новое поле rating (tinyint), по умолчанию от 1 до 5, но в принципе возможность менять его в большую сторону заложена (для этого потребуется указать новое значение в системной настройке ec_rating_max и немного поменять пару чанков и css файл).
Для того, что бы это симпатично выглядело — небольшая комбинация html + css + js — и вуаля:

«Звездочки» весьма интерактивны: при наведении на них мышкой они показывают новый рейтинг, текст рядом так же меняется.

Можно запретить отправлять форму с непроставленной оценкой путем задания параметра requiredFields сниппета ecForm.
Сообщения (уже отзывы получается?) в списке выглядят так:

Общий рейтинг
Когда у нас есть оценка от каждого пользователя — грех не посчитать общий рейтинг.
Соответственно считается рейтинг отдельно взятой цепочки.
Выбирая по какому алгоритму его считать я решил остановиться на 2-х вариантах, кому как удобнее: среднее арифметическое и Вильсона.
Про первый все понятно: сумму оценок делим на количество голосовавших.
Про второй все сложнее. В общем очень подробная статья habrahabr.ru/company/darudar/blog/143188/, почитайте, если есть минут 15.
Если нет, кратко объясню. При подсчете рейтинга, как среднего всех голосов, есть проблема: 2 голоса с оценкой «5» дадут средний рейтинг «5», а 1000 голосов, из которых 999 — «5», а 1 — «4», дадут рейтинг «4,999», таким образом этот результат будет хуже, что не очень то верно, правда ведь?
Алгоритм Вильсона позволяет это исправить, рейтинг считается с учетом некоего «доверительного уровня», когда мы говорим, что с вероятностью, например, 95% этот рейтинг верный. Про это подробно в статье =)
Чем больше вероятность (т.е. чем точнее результат мы хотим получить), тем больше голосов нужно, а пока голосов мало — рейтинг будет крутиться где-то посередине. Т.е. даже 10 оценок «5» не дадут вам общую «5», а что-нибудь около «3,5».
В общем результат на скриншоте снизу:

Здесь рейтинг рассчитан по 4-м оценкам: 3, 5, 5, 5, можно увидеть, какая разница в рейтинге при использовании обоих алгоритмов.
Кстати, тот самый «доверительный уровень» вынесен в настройки системы, что бы вы смогли его поменять, если будет нужно.
Для отображения рейтинга добавлен новый сниппет ecThreadRating, а сам рейтинг хранится в базе и рассчитывается в момент добавления/удаления/изменения сообщения с оценкой.
Что в админке
В админке добавлены все поля, связанные с Оценками, правда не так симпатично, как на фронтэнде, а просто числами:

У конкретного сообщения администратор может поменять Оценку, общий рейтинг будет перерасчитан.
Если есть вопросы — задавайте, отвечу.
Если компонент заинтересовал — милости прошу: modstore.pro/packages/utilities/easycomm
Комментарии: 16
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Вы можете мне навскидку предложить сценарии, в которых потребуются дополнительные поля?
Мысль сделать это была, просто пока не добрался! Но теперь точно придется сделать)))
Я хочу использовать компонент в качестве «вопроса-ответа» и в комментариях к товару.
В первом случае рейтинг не нужен, во втором необходим.
На фронтенде вы вольны сделать как вам хочется, т.е. убрать ненужные поля из чанков. Вам нужно будет просто сделать 2 набора разных чанков, один для отзывов, другой для вопросов и ответов.
Так же необходимо указать разные наборы полей allowedFields и requiredFields для вызовов сниппета ecForm, см. документацию docs.modx.pro/components/easycomm/snippets
Посмотрите в видео в самом начале так и сделано: www.youtube.com/watch?v=yXH09MKwxyw
А вот в админке у вас единый набор полей (правда настраиваемый), поэтому если вам нужен рейтинг в отзывах, то и в комментариях он будет, пусть и нулевой. Как скрыть ненужные поля в админке описано здесь docs.modx.pro/components/easycomm/plugins-and-customization
Компонент очень хороший!
Я так понимаю, что через плагины возможно?
Можно ли фильтровать и сортировать через mFilter2?
Из коробки нельзя, с помощью плагинов в принципе можно попробовать, но все равно не будет полноценной поддержки, к примеру сейчас идет проверка на сервере, что оценка в диапазоне 1-5, что бы пользователь лишнего не проставил.
Плюс средняя оценка храниться в thread и ее можно использовать…
В общем много нюансов.
Если есть потребность — можно сделать fork на основе компонента с поддержкой нужного вам количества рейтингов или попробовать реализовать поддержку N количества рейтингов прям из коробки, но пока что у меня на это нет времени.
Конечно хотелось бы из коробки.
Вопрос не срочный, возможно и дождусь. А не дождусь, куплю как есть с надеждой на будущее.
В любом случае спасибо за компонент.
Антон Левиц*прошу прощения, разобрался — через rating_simple