[VoteForms] Система голосования и опросов
Возможности:
— конструктор форм для голосования в modx manager
— вывод результатов голосования с сортировкой и поиском в modx manager
— вывод форм и результатов для голосования на сайте, обновление на лету через ajax
— возможность привязать результаты голосования к ресурсу или любому другому объекту создав новый thread
Скачать можно здесь, документация
Скоро опубликуется в modstore
Посмотреть на работу можно здесь
user: voteforms
pass: ByBBNSTe
Как видите, можно вызывать сразу несколько форм на одной странице, а результаты голосования обновляются на лету.
Результаты голосования привязываются к thread «ветвям» -> по умолчанию имя thread resource-[[*id]], но можно указать свое значение. Это позволяет использовать одну форму для голосования несколько раз на одной странице или привязать голосования к чему-то кроме ресурса.
Также можно использовать вместе с pdoResources.
Например сортировка ресурсов по рейтингу из формы c id 1:
Код на github, создавайте isuue
Спасибо Wassi Wassinen за идею и поддержку.
Компонент бесплатный, так что donation )
— конструктор форм для голосования в modx manager
— вывод результатов голосования с сортировкой и поиском в modx manager
— вывод форм и результатов для голосования на сайте, обновление на лету через ajax
— возможность привязать результаты голосования к ресурсу или любому другому объекту создав новый thread
Скачать можно здесь, документация
Скоро опубликуется в modstore
Посмотреть на работу можно здесь
user: voteforms
pass: ByBBNSTe
Как видите, можно вызывать сразу несколько форм на одной странице, а результаты голосования обновляются на лету.
Результаты голосования привязываются к thread «ветвям» -> по умолчанию имя thread resource-[[*id]], но можно указать свое значение. Это позволяет использовать одну форму для голосования несколько раз на одной странице или привязать голосования к чему-то кроме ресурса.
Также можно использовать вместе с pdoResources.
Например сортировка ресурсов по рейтингу из формы c id 1:
[[pdoResources?
&class=`modResource`
&parents=`0`
&tpl=`@INLINE <li>[[+pagetitle]] - <span class="badge">[[+rating]]</span> </li>`
&leftJoin=`{
"VoteFormThread": {
"class": "VoteFormThread",
"on": "modResource.id = VoteFormThread.resource AND VoteFormThread.form = 1"
}
}`
&select=`{
"modResource": "*",
"VoteFormThread": "rating"
}`
&sortby=`VoteFormThread.rating`
&sortdir=`DESC`
]]
Код на github, создавайте isuue
Спасибо Wassi Wassinen за идею и поддержку.
Компонент бесплатный, так что donation )
Комментарии: 51
Честно говоря, xPoller кажется более интересным и продуманным.
Ты не представляешь, как радуют такие отзывы к новым дополнениям.
Хоть бы написал чем именно он кажется тебе более интересным и продуманным.
Хоть бы написал чем именно он кажется тебе более интересным и продуманным.
Разве xPoller — не просто опросник? Здесь же, насколько я понял, возможно реализовать систему рейтингов. Имхо, очень полезная штука, учитывая весьма устаревшие аналогичные модули.
Добавил в избранное. Вечером буду разбираться, радует, что модикс не стоит на месте)))
Скажите можно ли вывести звезды для голосования в msProduct?
Да, можно привязать продуктам, можно и к чему-то более экзотичному. Результаты привязываются к thread -> по умолчанию имя треда resource-[[*id]], но можно указать свое значение.
Подскажите, пожалуйста, можно ли привязать рейтинг к mFilter2, вызывающий товары minishop2 посредством Join'ов?
[[!mFilter2? &suggestions=`0` &showLog=`1` &limit=`25` &select=`{"Data":"[[!getProductDataFields]]"}` &paginator=`pdoPage@Pagination` &class=`msProduct` &element=`msProducts` &depth=`0` &toPlaceholders=`mse2_` &includeThumbs=`70x70` &showEmptyFilters=`0`
&filters=`[[*category_filters]]`
&sort=`price:asc`
&where=`{"class_key":"msProduct"}`
&leftJoin=`{
"VoteFormThread": {
"class": "VoteFormThread",
"on": "msProduct.id = VoteFormThread.resource AND VoteFormThread.form = 1"
}
}`
&select=`{
"msProduct": "*",
"Vendor": "*",
"70x70": "*",
"VoteFormThread": "rating"
}`
]]
Должно работать как и с любой другой таблицей modx, так что нужно пробывать
Выдает [2015-05-16 21:58:47] (ERROR @ /index.php) Could not load class: VoteFormThread from mysql.voteformthread. ..(
а почему у тебя два параметра select в вызове сниппета?
Получилось ли? Тоже появилась такая необходимость объединить с mFilter2. Никак не выходит…
Получилось.) Вот рабочий код:
[[!mFilter2? &limit=`25` &loadModels=`voteforms` &paginator=`pdoPage` &class=`msProduct` &element=`msProducts` &depth=`0` &sort=`price:asc, rating:desc`
&where=`{"class_key":"msProduct"}`
&leftJoin=`{
"VoteFormThread": {
"class": "VoteFormThread",
"on": "msProduct.id = VoteFormThread.resource AND VoteFormThread.form = 1"
}
}`
&select=`{"Data": "*", "VoteFormThread": "VoteFormThread.rating AS rating, VoteFormThread.users_count AS totalVoted"}`
&tpls=`item.list.table`
]]
— рейтинг в чанке выводится плейсхолдером [[+rating]].
Фильтр работает, а плейсхолдер [[+rating]] нет..., пустой
Количество голосов у товара больше 0? Если нет, то дописать [[+rating:default=`0`]].
Если форм для голосований больше, чем одна — заменить вот тут «VoteFormThread.form = 1» единицу на id формы.
Можете еще проверить параметр [[+totalVoted]] — он в этом запросе тоже присутствует (сколько всего голосов за товар) — если он выводится, то с запросом все в порядке.
Ну и, как всегда, не лишним будет обновить кэш..)
Если форм для голосований больше, чем одна — заменить вот тут «VoteFormThread.form = 1» единицу на id формы.
Можете еще проверить параметр [[+totalVoted]] — он в этом запросе тоже присутствует (сколько всего голосов за товар) — если он выводится, то с запросом все в порядке.
Ну и, как всегда, не лишним будет обновить кэш..)
спасибо, все заработало! Еще один вопрос: один и тот же человек может много раз переголосовывать? Это можно как-то запретить?
Может переголосовывать бесконечное число раз.
Запретить… ну, на текущий момент, разве что только костылями или правками ядра. Вообще, с этим вопросом вам лучше обратиться к разработчику.
Запретить… ну, на текущий момент, разве что только костылями или правками ядра. Вообще, с этим вопросом вам лучше обратиться к разработчику.
Спасибо. А можно как-нибудь выводить не число, а те же звездочки? Вы как делали?)
Я делал при помощи вот такой конструкции в чанке:
<div [[+rating:isequalto=`0`:or:isequalto=``:then=`style="display: none;"`]] date-rate="[[+rating:limit=`1`:isequalto=`0`:then=``:else=`[[+rating:limit=`1`]]`]]" class="rating" title="Голосов: [[+totalVoted]]"></div>
И дальше уже оформлял визуализацию при помощи css:.rating[date-rate="5"] {стили}
.rating[date-rate="4"] {}
...
Спасибо! И последний вопрос пожалуйста: можно ли сделать так, чтобы звездочки не дублировались, то есть чтобы одни и те же звездочки являлись и голосовалкой и выводом общей оценки, ну то есть как это было сделано в starRating когда-то?
Мм… на мой взгляд, с этим пока у данного дополнения трудновато — не все куски выводимых элементов сейчас можно редактировать, т.к. они вшиты в ядро.
Могу предложить вам на правах самого простого варианта вот такую логику для решения данной задачи:
— размещаем оба сниппета (отображения рейтинга и голосования) в один контейнер с уникальным классом (допустим, ratingDiv)
— добавляем по уникальному классу для контейнера с отображением рейтинга и для контейнера, содержащий элементы для голосования (допустим, ratingTotal и letsRate соответственно)
— при помощи css вешаем на форму голосования следующие стили:
Если коротко, то мы вешаем форму с голосованием точно поверх дива с результатами голосования и прячем ее. А при наведении мы визуально скрываем результаты и проявляем форму для голосования, достигая нужного эффекта.
Единственный минус такой задачи в целом — при последующих заходах на страницу пользователь будет видеть итоговый рейтинг товара, но не будет видеть свою оценку.
Для решения этого могу предложить прятать форму для голосования в принципе, а при нажатии на кол-во голосов выводить форму для голосования во всплывающем окне аля fancybox. Но тут уже дело вкуса.)
Могу предложить вам на правах самого простого варианта вот такую логику для решения данной задачи:
— размещаем оба сниппета (отображения рейтинга и голосования) в один контейнер с уникальным классом (допустим, ratingDiv)
— добавляем по уникальному классу для контейнера с отображением рейтинга и для контейнера, содержащий элементы для голосования (допустим, ratingTotal и letsRate соответственно)
— при помощи css вешаем на форму голосования следующие стили:
.ratingDiv {position: relative;}
.ratingDiv > .ratingTotal {position: relative; opacity: 1; z-index: 1;}
.ratingDiv > .letsRate {position: absolute; top: 0; left: 0; opacity: 0; text-indent: -9999px; z-index: 2;}
.ratingDiv:hover > .ratingTotal {opacity: 0;}
.ratingDiv:hover > .letsRate {opacity: 1;}
Если коротко, то мы вешаем форму с голосованием точно поверх дива с результатами голосования и прячем ее. А при наведении мы визуально скрываем результаты и проявляем форму для голосования, достигая нужного эффекта.
Единственный минус такой задачи в целом — при последующих заходах на страницу пользователь будет видеть итоговый рейтинг товара, но не будет видеть свою оценку.
Для решения этого могу предложить прятать форму для голосования в принципе, а при нажатии на кол-во голосов выводить форму для голосования во всплывающем окне аля fancybox. Но тут уже дело вкуса.)
Спасибо. Очень нужный компонент!
Вижу, насчет скриптов спасибо, про атрибут посмотрю, должна быть проверка на стороне modx
У меня вообще он работать отказывается. Хоть бы доки были нормальные.
так вот жеж docs.modx.pro/components/voteforms
Спасибо за модуль! Отличная вещь.
Вот тока вопрос с вызовом на конкретный ресурс… А если ресурсов в ветке штук 30 к каждому из них я могу привязать голосование каждого ресурса… И могу ли я сортировать наибольшее количество голосов ..?
Вот тока вопрос с вызовом на конкретный ресурс… А если ресурсов в ветке штук 30 к каждому из них я могу привязать голосование каждого ресурса… И могу ли я сортировать наибольшее количество голосов ..?
И как реализовать голосование с авторизацией? Можно примеров накидать вывода
что то сделал все как в доках но не выводится список полей почему то
Здравствуйте. Помогите пожалуйста, не могу разобраться. В voteforms возможность голосовать только для авторизированных пользователей. Гостям голосовать никак не получится?
"Вы должны авторизоваться, чтобы проголосовать."
изменить стандартный сниппет и убрать проверку на авторизацию
Удалил это
if (!$VoteForms->authenticated) {
return $modx->lexicon('voteforms_form_err_no_auth');
}
из VoteForm. Всё равно требует залогиниться.
Удалил
Для проверки открыл туже страницу другим браузером и пытаюсь еще голосовать, но число голосов не увеличивается.
if (!$VoteForms->authenticated) {
die($modx->lexicon('voteforms_form_err_no_auth'));
}
еще изassets/components/voteforms/action.php
и авторизацию больше не запрашивает, проголосовал один раз не авторизованным все успешно. Для проверки открыл туже страницу другим браузером и пытаюсь еще голосовать, но число голосов не увеличивается.
Это не будет работать, результаты голосования привязываются к id пользователя.
Насчет варианта сделать голосование без авторизации сомневаюсь, нет способа избежать накрутки голосования любым школьником.
Насчет варианта сделать голосование без авторизации сомневаюсь, нет способа избежать накрутки голосования любым школьником.
Очень жаль. Есть много проектов где нужна возможность голосовать без авторизации, где накручивать рейтинг статье просто нет смысла и не кто не будет регистрироваться и авторизовываться чтобы проголосовать.
Без авторизации есть css rating stars но у него есть ОГРОМНЫЕ минусы: 1. работает с перезагрузкой страницы 2. появляется огромное число дублей страницы, за счет формирования звездочек ссылками siteurl?vote=5&star_id=… (а именно по 5 штук к каждой)
В общем voteforms идеально бы подошел на многих сайтах, если бы была возможность голосовать без авторизации.
Без авторизации есть css rating stars но у него есть ОГРОМНЫЕ минусы: 1. работает с перезагрузкой страницы 2. появляется огромное число дублей страницы, за счет формирования звездочек ссылками siteurl?vote=5&star_id=… (а именно по 5 штук к каждой)
В общем voteforms идеально бы подошел на многих сайтах, если бы была возможность голосовать без авторизации.
Вообще мне логика непонятна, если человек не хочет сделать пару кликов и авторизоваться через соц сети, значит ему это в принципе не особо нужно. Я когда вернусь компоненту еще подумаю над этим, но не обещаю
Вот пример на вскидку otzovik.com можно проголосовать за обзор не регистрируясь и таких примеров много.
Еще пример, это сайт где вообще нет авторизации, потому что пользователям это не нужно, они пришли за информацией и никто не будет регистрироваться для оценки статьи (даже через соц сеть), а если регистрироваться не нужно то запросто кликнут для оценки. Для сообществ я с вами полностью согласен нужна авторизация, а для «информационников» она в большинстве случаев бесполезна.
А вот рейтинг это очень нужное дополнение, по нему можно сортировать статьи для пользователей, а значит повысить удобство сайта.
Личный пример на основе Tickets. Были комментарии только для авторизованных (через соц. сеть), вроде нажми кнопочку и оставь отзыв не заполняя доп. поля — комментариев «кот наплакал». Сделали возможность комментировать для анонимов и люди стали оставлять комментарии, при это им приходится заполнять имя, email… где логика? Но это факт.
На мой взгляд у вас хороший компонент, а добавление возможности голосовать не авторизованным, сделало бы его еще лучше.
Спасибо.
Еще пример, это сайт где вообще нет авторизации, потому что пользователям это не нужно, они пришли за информацией и никто не будет регистрироваться для оценки статьи (даже через соц сеть), а если регистрироваться не нужно то запросто кликнут для оценки. Для сообществ я с вами полностью согласен нужна авторизация, а для «информационников» она в большинстве случаев бесполезна.
А вот рейтинг это очень нужное дополнение, по нему можно сортировать статьи для пользователей, а значит повысить удобство сайта.
Личный пример на основе Tickets. Были комментарии только для авторизованных (через соц. сеть), вроде нажми кнопочку и оставь отзыв не заполняя доп. поля — комментариев «кот наплакал». Сделали возможность комментировать для анонимов и люди стали оставлять комментарии, при это им приходится заполнять имя, email… где логика? Но это факт.
На мой взгляд у вас хороший компонент, а добавление возможности голосовать не авторизованным, сделало бы его еще лучше.
Спасибо.
Нет хорошего способа защититься от накрутки. Это точно. Достаточно простейших защит типа куки или возможности голосовать с одного ip раз в сутки.
Полно ресурсов где никто ничего не накручивает, хотя ресурс существует годами с открытым голосованием. Просто это никому особо не нужно. Ну проголосует особо недовольный 2 раза из разных браузеров — ерунда. Если вдруг начинаются накрутки, ничто не мешает поставить авторизацию. Так что вариант без авторизации точно нужен и имеет смысл.
P.S.: за компонент в любом случае спасибо. Донейт с меня. Надеюсь будет развиваться и дальше.
Полно ресурсов где никто ничего не накручивает, хотя ресурс существует годами с открытым голосованием. Просто это никому особо не нужно. Ну проголосует особо недовольный 2 раза из разных браузеров — ерунда. Если вдруг начинаются накрутки, ничто не мешает поставить авторизацию. Так что вариант без авторизации точно нужен и имеет смысл.
P.S.: за компонент в любом случае спасибо. Донейт с меня. Надеюсь будет развиваться и дальше.
Спасибо, я займусь компонентом, уже есть бета версия с улучшением админ. панели и возможностью сортировать результаты по отдельным полям. Добавится новый алгоритм подсчета результатов, про голосование без авторизации тоже подумаю. Но все это где-то через месяц будет, я думаю, со временем пока не очень.
Компонент всё ещё работает только строго для авторизованных пользователей? Для гостей нет возможности голосовать, даже с накруткой?
Например можно сделать так, как в Tickets — Василий предупреждает о накрутке и даёт возможность в системных настройках включить подсчёт просмотров гостей на свой страх и риск.
Например в modstore.pro/packages/ecommerce/xlike работает голосование гостями, можно по тому же принципу сделать?
Кстати, может быть стоит добавить проверку подключения JQuery? Или хотя бы в доки добавить строчку про это.
Рейтинг выводится, а проголосовать не могу, звездочки не активные, в чем проблема?
Надо создать поле в настройках формы. Я тоже не сразу догадался.
Спасибо. А мануале этого нету. Еще один вопросик — голосовать можно несколько раз? Нельзя ли сделать так, чтобы можно было проголосовать только один раз у одного ресурса?
Может вам будет интересна следующая работа?
modx.pro/work/6413-the-survey-module/
modx.pro/work/6413-the-survey-module/
Не совсем видимо разобрался. Подскажите пожалуйста.
Не работает Ajax, т.е. результат вижу только после перезагрузки. Возможно какие-то дополнительные модули/плагины нужны?
Как вывести результат голосования конкретного юзера?
Не работает Ajax, т.е. результат вижу только после перезагрузки. Возможно какие-то дополнительные модули/плагины нужны?
Как вывести результат голосования конкретного юзера?
Здравствуйте!
А можно сделать так, чтобы рейтинг появлялся сразу, а не после того, как кто-нибудь из авторизированных пользователей его активирует?
А можно сделать так, чтобы рейтинг появлялся сразу, а не после того, как кто-нибудь из авторизированных пользователей его активирует?
Не устанавливается…
Зависает на этапе Trying to install pdoTools. Please wait…
Зависает на этапе Trying to install pdoTools. Please wait…
А можно как-нибудь, если 0 человек проголосовало, показывать 5 пустых звёзд, вместо пустоты, при вызове результатов опроса?
Я авторизован и вывожу
Что не так?
[[!VoteForm?
&id=`1`
]]
но сайт пишет «Вы должны авторизоваться, чтобы проголосовать»Что не так?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.