[VoteForms] Система голосования и опросов

Возможности:
— конструктор форм для голосования в 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 )
Антон Мамрашев
04 мая 2015, 21:52
modx.pro
19
11 428
+13

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

Николай
05 мая 2015, 04:50
-6
Честно говоря, xPoller кажется более интересным и продуманным.
    Василий Наумкин
    05 мая 2015, 07:07
    +9
    Ты не представляешь, как радуют такие отзывы к новым дополнениям.

    Хоть бы написал чем именно он кажется тебе более интересным и продуманным.

      Максим Кузнецов
      05 мая 2015, 08:10
      +3
      Разве xPoller — не просто опросник? Здесь же, насколько я понял, возможно реализовать систему рейтингов. Имхо, очень полезная штука, учитывая весьма устаревшие аналогичные модули.
      Андрей Копп
      05 мая 2015, 08:58
      0
      Добавил в избранное. Вечером буду разбираться, радует, что модикс не стоит на месте)))
        Максим
        05 мая 2015, 09:29
        0
        Скажите можно ли вывести звезды для голосования в msProduct?
          Антон Мамрашев
          05 мая 2015, 10:24
          0
          Да, можно привязать продуктам, можно и к чему-то более экзотичному. Результаты привязываются к thread -> по умолчанию имя треда resource-[[*id]], но можно указать свое значение.
            Максим Кузнецов
            16 мая 2015, 15:16
            0
            Подскажите, пожалуйста, можно ли привязать рейтинг к 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"
            	}`
            	]]
              Антон Мамрашев
              16 мая 2015, 19:30
              0
              Должно работать как и с любой другой таблицей modx, так что нужно пробывать
                Максим Кузнецов
                16 мая 2015, 22:00
                0
                Выдает [2015-05-16 21:58:47] (ERROR @ /index.php) Could not load class: VoteFormThread from mysql.voteformthread. ..(
                  Антон Мамрашев
                  17 мая 2015, 09:15
                  0
                  а почему у тебя два параметра select в вызове сниппета?
                    Aleksandr
                    04 августа 2015, 23:23
                    0
                    Получилось ли? Тоже появилась такая необходимость объединить с mFilter2. Никак не выходит…
                      Максим Кузнецов
                      04 августа 2015, 23:37
                      1
                      +1
                      Получилось.) Вот рабочий код:

                      [[!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]].
                        Aleksandr
                        05 августа 2015, 00:08
                        0
                        Фильтр работает, а плейсхолдер [[+rating]] нет..., пустой
                          Максим Кузнецов
                          05 августа 2015, 00:11
                          +1
                          Количество голосов у товара больше 0? Если нет, то дописать [[+rating:default=`0`]].

                          Если форм для голосований больше, чем одна — заменить вот тут «VoteFormThread.form = 1» единицу на id формы.

                          Можете еще проверить параметр [[+totalVoted]] — он в этом запросе тоже присутствует (сколько всего голосов за товар) — если он выводится, то с запросом все в порядке.

                          Ну и, как всегда, не лишним будет обновить кэш..)
                            Aleksandr
                            05 августа 2015, 00:19
                            0
                            спасибо, все заработало! Еще один вопрос: один и тот же человек может много раз переголосовывать? Это можно как-то запретить?
                            Максим Кузнецов
                            05 августа 2015, 01:03
                            0
                            Может переголосовывать бесконечное число раз.

                            Запретить… ну, на текущий момент, разве что только костылями или правками ядра. Вообще, с этим вопросом вам лучше обратиться к разработчику.
                            Aleksandr
                            05 августа 2015, 16:25
                            0
                            Спасибо. А можно как-нибудь выводить не число, а те же звездочки? Вы как делали?)
                            Максим Кузнецов
                            05 августа 2015, 19:28
                            +1
                            Я делал при помощи вот такой конструкции в чанке:
                            <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"] {}
                            ...
                            Aleksandr
                            05 августа 2015, 19:46
                            0
                            Спасибо! И последний вопрос пожалуйста: можно ли сделать так, чтобы звездочки не дублировались, то есть чтобы одни и те же звездочки являлись и голосовалкой и выводом общей оценки, ну то есть как это было сделано в starRating когда-то?
                            Максим Кузнецов
                            05 августа 2015, 20:03
                            0
                            Мм… на мой взгляд, с этим пока у данного дополнения трудновато — не все куски выводимых элементов сейчас можно редактировать, т.к. они вшиты в ядро.

                            Могу предложить вам на правах самого простого варианта вот такую логику для решения данной задачи:
                            — размещаем оба сниппета (отображения рейтинга и голосования) в один контейнер с уникальным классом (допустим, 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. Но тут уже дело вкуса.)
        Владимир
        05 мая 2015, 09:36
        0
        Спасибо. Очень нужный компонент!
          Виктор
          05 мая 2015, 12:24
          +1
          1) Несколько раз подключается скрипт


          2) Хранить значение звездочки в атрибуте как-то плохо наверное
          Александр
          06 июля 2015, 07:21
          0
          Спасибо за модуль! Отличная вещь.
          Вот тока вопрос с вызовом на конкретный ресурс… А если ресурсов в ветке штук 30 к каждому из них я могу привязать голосование каждого ресурса… И могу ли я сортировать наибольшее количество голосов ..?
            Александр
            06 июля 2015, 07:22
            0
            И как реализовать голосование с авторизацией? Можно примеров накидать вывода
              Сергей Скат
              08 июля 2015, 17:15
              0
              что то сделал все как в доках но не выводится список полей почему то
                Борис И
                24 июля 2015, 12:06
                0
                Здравствуйте. Помогите пожалуйста, не могу разобраться. В voteforms возможность голосовать только для авторизированных пользователей. Гостям голосовать никак не получится?
                "Вы должны авторизоваться, чтобы проголосовать."
                  Володя
                  25 июля 2015, 10:53
                  1
                  0
                  изменить стандартный сниппет и убрать проверку на авторизацию
                    rrrro
                    25 июля 2015, 23:46
                    0
                    Удалил это
                    if (!$VoteForms->authenticated) {
                      return $modx->lexicon('voteforms_form_err_no_auth');
                    }
                    из VoteForm. Всё равно требует залогиниться.
                      Борис И
                      26 июля 2015, 13:33
                      0
                      Удалил
                      if (!$VoteForms->authenticated) {
                        die($modx->lexicon('voteforms_form_err_no_auth'));
                      }
                      еще из
                      assets/components/voteforms/action.php
                      и авторизацию больше не запрашивает, проголосовал один раз не авторизованным все успешно.
                      Для проверки открыл туже страницу другим браузером и пытаюсь еще голосовать, но число голосов не увеличивается.
                        Антон Мамрашев
                        26 июля 2015, 15:07
                        0
                        Это не будет работать, результаты голосования привязываются к id пользователя.
                        Насчет варианта сделать голосование без авторизации сомневаюсь, нет способа избежать накрутки голосования любым школьником.
                          Борис И
                          26 июля 2015, 15:20
                          0
                          Очень жаль. Есть много проектов где нужна возможность голосовать без авторизации, где накручивать рейтинг статье просто нет смысла и не кто не будет регистрироваться и авторизовываться чтобы проголосовать.
                          Без авторизации есть css rating stars но у него есть ОГРОМНЫЕ минусы: 1. работает с перезагрузкой страницы 2. появляется огромное число дублей страницы, за счет формирования звездочек ссылками siteurl?vote=5&star_id=… (а именно по 5 штук к каждой)

                          В общем voteforms идеально бы подошел на многих сайтах, если бы была возможность голосовать без авторизации.
                            Антон Мамрашев
                            26 июля 2015, 15:27
                            0
                            Вообще мне логика непонятна, если человек не хочет сделать пару кликов и авторизоваться через соц сети, значит ему это в принципе не особо нужно. Я когда вернусь компоненту еще подумаю над этим, но не обещаю
                              Борис И
                              26 июля 2015, 16:05
                              0
                              Вот пример на вскидку otzovik.com можно проголосовать за обзор не регистрируясь и таких примеров много.
                              Еще пример, это сайт где вообще нет авторизации, потому что пользователям это не нужно, они пришли за информацией и никто не будет регистрироваться для оценки статьи (даже через соц сеть), а если регистрироваться не нужно то запросто кликнут для оценки. Для сообществ я с вами полностью согласен нужна авторизация, а для «информационников» она в большинстве случаев бесполезна.
                              А вот рейтинг это очень нужное дополнение, по нему можно сортировать статьи для пользователей, а значит повысить удобство сайта.
                              Личный пример на основе Tickets. Были комментарии только для авторизованных (через соц. сеть), вроде нажми кнопочку и оставь отзыв не заполняя доп. поля — комментариев «кот наплакал». Сделали возможность комментировать для анонимов и люди стали оставлять комментарии, при это им приходится заполнять имя, email… где логика? Но это факт.
                              На мой взгляд у вас хороший компонент, а добавление возможности голосовать не авторизованным, сделало бы его еще лучше.
                              Спасибо.
                            rrrro
                            04 августа 2015, 23:55
                            0
                            Нет хорошего способа защититься от накрутки. Это точно. Достаточно простейших защит типа куки или возможности голосовать с одного ip раз в сутки.

                            Полно ресурсов где никто ничего не накручивает, хотя ресурс существует годами с открытым голосованием. Просто это никому особо не нужно. Ну проголосует особо недовольный 2 раза из разных браузеров — ерунда. Если вдруг начинаются накрутки, ничто не мешает поставить авторизацию. Так что вариант без авторизации точно нужен и имеет смысл.

                            P.S.: за компонент в любом случае спасибо. Донейт с меня. Надеюсь будет развиваться и дальше.
                              Антон Мамрашев
                              06 августа 2015, 13:19
                              0
                              Спасибо, я займусь компонентом, уже есть бета версия с улучшением админ. панели и возможностью сортировать результаты по отдельным полям. Добавится новый алгоритм подсчета результатов, про голосование без авторизации тоже подумаю. Но все это где-то через месяц будет, я думаю, со временем пока не очень.
                                Василий Столейков
                                27 ноября 2017, 11:02
                                1
                                0
                                Компонент всё ещё работает только строго для авторизованных пользователей? Для гостей нет возможности голосовать, даже с накруткой?
                                Например можно сделать так, как в Tickets — Василий предупреждает о накрутке и даёт возможность в системных настройках включить подсчёт просмотров гостей на свой страх и риск.
                                  Василий Столейков
                                  27 ноября 2017, 11:09
                                  1
                                  0
                                  Например в modstore.pro/packages/ecommerce/xlike работает голосование гостями, можно по тому же принципу сделать?
                      rrrro
                      25 июля 2015, 23:47
                      0
                      Кстати, может быть стоит добавить проверку подключения JQuery? Или хотя бы в доки добавить строчку про это.
                        Aleksandr
                        02 августа 2015, 13:06
                        0
                        Рейтинг выводится, а проголосовать не могу, звездочки не активные, в чем проблема?
                          Денис Богдановский
                          03 августа 2015, 00:55
                          0
                          Надо создать поле в настройках формы. Я тоже не сразу догадался.
                            Aleksandr
                            03 августа 2015, 22:26
                            0
                            Спасибо. А мануале этого нету. Еще один вопросик — голосовать можно несколько раз? Нельзя ли сделать так, чтобы можно было проголосовать только один раз у одного ресурса?
                          Сергей
                          03 сентября 2015, 19:45
                          0
                          Может вам будет интересна следующая работа?
                          modx.pro/work/6413-the-survey-module/
                            Evgeny Epifanov
                            07 сентября 2015, 14:21
                            0
                            Не совсем видимо разобрался. Подскажите пожалуйста.
                            Не работает Ajax, т.е. результат вижу только после перезагрузки. Возможно какие-то дополнительные модули/плагины нужны?
                            Как вывести результат голосования конкретного юзера?
                              nekto
                              11 ноября 2015, 14:08
                              0
                              Здравствуйте!
                              А можно сделать так, чтобы рейтинг появлялся сразу, а не после того, как кто-нибудь из авторизированных пользователей его активирует?
                                Роман
                                20 декабря 2015, 20:03
                                0
                                Не устанавливается…
                                Зависает на этапе Trying to install pdoTools. Please wait…
                                  Павел
                                  26 сентября 2016, 19:27
                                  0
                                  А можно как-нибудь, если 0 человек проголосовало, показывать 5 пустых звёзд, вместо пустоты, при вызове результатов опроса?
                                    Sergey (Sentinel)
                                    05 июня 2018, 08:26
                                    0
                                    Я авторизован и вывожу
                                    [[!VoteForm?
                                    &id=`1`
                                    ]]
                                    но сайт пишет «Вы должны авторизоваться, чтобы проголосовать»
                                    Что не так?
                                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                      51