Наверх

xPoller — опросы для MODX

xPoller - это дополнение для MODX, позволяющее организовать у вас на сайте AJAX-опросы для пользователей.

Интерфейс довольно простой:
На странице вызывается так:
[[!xPoller? &id=`1`]]


Опрос выглядит как-то так:

Как вы относитесь к MODX 2.3.x?

Очень нравится. Наконец-то воплотили мою мечту

9

Нормально. Логичное продолжение политики разработчиков

12

Можно было сделать и получше

2

Не нравится. Жаль, что придется обновляться

2

Сделали какую-то фигню. Дуров! Верни стену!!!

1

Голосовать могут только зарегистрированные и авторизованные пользователи.


55 комментариев

  1. Михаил 20 августа 2014, 07:38 # +1
    Классно! А пакет где можно скачать? Желательно что бы самому собрать
    1. Илья Уткин 20 августа 2014, 07:41 # 0
      В официальном репозитории: xPoller
      1. Михаил 20 августа 2014, 07:42 # 0
        Github??
        1. Илья Уткин 20 августа 2014, 07:52 # +1
          1. Михаил 20 августа 2014, 07:54 # 0
            Спасибо! Буду изучать. Почему уроки не пишешь а? ))
            1. Илья Уткин 20 августа 2014, 07:55 # 0
              Я в отпуске был. Думаю, осенью вернусь на прежний уровень активности
              1. Михаил 20 августа 2014, 08:00 # 0
                т.е. уроки будешь писать?
                1. Илья Уткин 20 августа 2014, 08:11 # 0
                  Наверное. Только пока не знаю, про что))
                  1. Михаил 20 августа 2014, 08:20 # 0
                    Структуру. Ну с простого взаимодействия админки с базой ну и так далее, CRC
    2. Krolicboy 20 августа 2014, 11:23 # 0
      Здорово, Илья. А ты курс по MODX не думал сделать?
      1. Илья Уткин 20 августа 2014, 11:54 # 0
        А чем не устраивает курс Василия Наумкина?
      2. Krolikboy 20 августа 2014, 14:16 # 0
        Спасибо, Илья. Буду разбираться.
        1. Krolikboy 21 августа 2014, 06:18 # 0
          Здорово, Илюха! С Днем Варения тебя!
          Счастья, здоровья, творческих успеков!!! :))
          1. Илья Уткин 21 августа 2014, 06:29 # 0
            Спасибо)
          2. Андрей 19 сентября 2014, 09:07 # 0
            Здравствуйте, а подскажите, где поправить сниппет, чтоб могли голосовать неавторизованные?
            1. Илья Уткин 19 сентября 2014, 09:10(Комментарий был изменён) # 0
              Я не знаю… Это надо всю логику переделывать. Для неавторизованных пользователей пользуйтесь сниппетом Quip, сорри, — Polls
              1. Андрей 19 сентября 2014, 11:03 # 0
                Сделал так, не знаю насколько корректно, но вроде работает:
                <?php
                $xPoller = $modx->getService('xpoller','xPoller',$modx->getOption('xpoller_core_path',null,$modx->getOption('core_path').'components/xpoller/').'model/xpoller/',$scriptProperties);
                if (!($xPoller instanceof xPoller)) return '';
                $modx->regClientScript($modx->getOption('assets_url').'components/xpoller/js/web/default.js');
                if (empty($formOuterTpl)) {$formOuterTpl = "tpl.xPoller.form.outer";}
                if (empty($resultOuterTpl)) {$resultOuterTpl = "tpl.xPoller.result.outer";}
                if (empty($optionTpl)) {$optionTpl = "tpl.xPoller.option";}
                if (empty($resultTpl)) {$resultTpl = "tpl.xPoller.result";}
                if (empty($outputSeparator)) {$resultTpl = "\n";}
                if (empty($id)) {return $modx->lexicon("xpoller_question_err_ns");}
                if ($_REQUEST['qid'] && $_REQUEST['qid'] != $id) return '';
                $params = $_GET;
                unset($params[$modx->getOption('request_param_alias')]);
                unset($params[$modx->getOption('request_param_id')]);
                # if (!empty($_REQUEST['xp_action']) && $_REQUEST['qid'] && $modx->user->isAuthenticated($modx->context->key)) {
                # Выше закоментировано то, что заменил на следующую стороку:
                if (!empty($_REQUEST['xp_action']) && $_REQUEST['qid']) {
                $isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
                if ($_REQUEST['xp_action'] == 'abstain') {
                $_REQUEST['oid'] = 0;
                } else {
                if ($_REQUEST['oid']) {
                $tmp = array('uid' => $modx->user->id, 'qid' => $id);
                if (!$modx->getObject('xpAnswer', $tmp)) {
                $tmp['oid'] = $_REQUEST['oid'];
                $answer = $modx->newObject('xpAnswer', $tmp);
                $answer->save();
                unset($tmp);
                }
                }
                }
                unset($params['qid']);
                unset($params['oid']);
                unset($params['uid']);
                unset($params['xp_action']);
                if (!$isAjax && empty($placeholders['message'])) {
                $modx->sendRedirect($modx->makeUrl($modx->resource->id, $modx->context->key, $params, 'full'));
                }
                }
                #if (!$modx->user->isAuthenticated($modx->context->key)
                #|| $modx->getObject('xpAnswer', array('uid' => $modx->user->id, 'qid' => $id))) {
                # Выше закоментировано то, что заменил на следующую стороку:
                if (!$modx->getObject('xpAnswer', array('qid' => $id))) {
                $tpl = $optionTpl;
                $outerTpl = $formOuterTpl;
                } else {
                $tpl = $resultTpl;
                $outerTpl = $resultOuterTpl;
                }
                $q = $modx->newQuery('xpOption');
                $q->where(array('qid' => $id));
                $q->select('`xpOption`.`id`, `xpOption`.`qid`, `xpOption`.`option`, `xpOption`.`rank`,
                `xpOption`.`right`, `xpQuestion`.`text`, COUNT(DISTINCT `xpAnswer`.`uid`) as `votes`');
                $q->leftJoin('xpQuestion', 'xpQuestion', array('`xpOption`.`qid` = `xpQuestion`.`id`'));
                $q->leftJoin('xpAnswer', 'xpAnswer', array('`xpAnswer`.`oid` = `xpOption`.`id`'));
                $q->groupby('`xpOption`.`id`');
                $q->sortby('`xpOption`.`id`', 'ASC');
                $q->prepare();
                /*
                print "<pre>";
                print $q->toSQL();
                print "</pre>";*/
                $q->stmt->execute();
                $options = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
                if ($options) {
                $output = array();
                foreach ($options as $option) {
                if (empty($output['maxVotes'])) $output['maxVotes'] = $option['votes'];
                if ($output['maxVotes'] < $option['votes']) $output['maxVotes'] = $option['votes'];
                }
                if (empty($output['text'])) $output['text'] = $options[0]['text'];
                if (empty($output['id'])) $output['id'] = $options[0]['qid'];
                foreach ($options as $option) {
                $option['percentVotes'] = round($option['votes'] / $output['maxVotes'] * 100, 2);
                $output['options'][] = $xPoller->getChunk($tpl,$option);
                }
                $output['options'] = implode($outputSeparator, $output['options']);
                $output = $xPoller->getChunk($outerTpl, $output);
                } else {
                $output = $modx->lexicon("xpoller_question_err_ns");
                }
                if (!empty($toPlaceholder)) {
                $modx->setPlaceholder($toPlaceholder,$output);
                return '';
                }
                if (!empty($isAjax)) {
                header('Content-type: text/html; charset=utf-8');
                @session_write_close();
                exit($output);
                }
                else {
                return $output;
                }
                
                1. Андрей 19 сентября 2014, 11:24 # 0
                  НЕТ. Похоже поторопился отписаться.
                  При таком варианте вообще только один раз можно проголосовать — первому кто ответил :)
                  Теперь надо придумать как ограничить только повторное голосование.
                  1. Илья Уткин 19 сентября 2014, 11:26 # 0
                    Да, именно это всегда и является проблемой. ))
                2. Андрей 19 сентября 2014, 11:07 # 0
                  Было б не плохо через параметры выбирать. Но насколько я понял Вы забросили это дополнение?
                  1. Илья Уткин 19 сентября 2014, 11:28 # 0
                    Не забросил, просто пока не развиваю. Если будут какие-то интересные изменения, присылай pull-request'ы. Я уже описывал подробно, как помочь разработчикам.
                    1. Андрей 19 сентября 2014, 12:51 # 0
                      ОК. Спасибо за вашу работу.
              2. Антон 03 марта 2015, 13:11 # 0
                А можно варианты ответа не через админку прописывать, а вручную?
                1. Илья Уткин 03 марта 2015, 13:14 # 0
                  Я так и не сделал такого функционала, к сожалению.
                  1. Антон 03 марта 2015, 13:39 # 0
                    а за вознаграждение можете такую возможность сделать? через админку не получается, т.к нужно список ресурсов вариантами ответа делать со своими тв. полями, фото и прочим.
                    1. Илья Уткин 03 марта 2015, 13:42 # 0
                      Сейчас времени совсем нет на дополнительные проекты. Попробуйте разместить объявление на modx.pro
                      1. Антон 03 марта 2015, 13:58 # 0
                        разместил, спасибо!
                2. Никита 21 марта 2016, 17:12(Комментарий был изменён) # 0
                  Здравствуйте, установил ваше дополнение, но есть одино но. Почему то после проведения опроса результаты отображаются без «индекаторной полосы синего цвета» в чем может быть дело?ссылка на фото. Зарание спасибо за помощь!
                  1. Илья Уткин 22 марта 2016, 08:49 # 0
                    Её, видимо, надо просто оформить на CSS. Я сделал реализацию на bootstrap, как реализовать без него не могу подсказать, к сожалению, я не особо разбираюсь в верстке
                    1. Никита 22 марта 2016, 14:58 # 0
                      Спасибо. Попробую разобраться
                  2. Георгий Немашкалов 23 мая 2016, 12:19 # 0
                    Здравствуйте, установил ваше дополнение. Всё прекрасно работает, но мне мало того вывода, который сейчас есть. При выводе результатов опроса, хотелось бы чтобы выводился так же список пользователей которые проголосовали, это не так трудно, как я понимаю, так как таблица в которой описаны пользователи проголосовавшие за конкретный пункт вопроса уже есть. Думал написать свой сниппет, но встал вопрос как идентифицировать номер опроса, ну и у меня не хватает опыта в этом деле чтобы правильно составить запрос для выборки. Не могли бы вы мне помоч в этом?
                    1. Илья Уткин 23 мая 2016, 12:22 # 0
                      Нужно смотреть, как в базе данных хранятся соответствия. Насколько я помню, ответы привязаны к вариантам, а варианты привязаны к вопросу. Поэтому в своём сниппете надо выбирать нужный опрос, потом все варианты, а потом к каждому варианту свой ответ.
                      1. Георгий Немашкалов 23 мая 2016, 12:30(Комментарий был изменён) # 0
                        Значит сниппет я пытаюсь вызвать вот так, прямо в чанке tpl.xPoller.result(шаблон вывода результатов одного пункта голосования)
                        [[![[+modx.user.id:memberof=`Administrator`:then=`ResultVoteSnippet`]]]]
                        а вот как ему передать именно тот же ID опроса?
                        1. Илья Уткин 23 мая 2016, 12:34 # 0
                          Мне кажется, в сниппете будет доступен id опроса в плейсхолдере
                          $quest = $modx->getPlaceholder('id');
                          1. Георгий Немашкалов 23 мая 2016, 12:47(Комментарий был изменён) # 0
                            Нет так он выводит id опции. Проще наверное будет прямо в вашем снипете делать запрос… и выводить в необходимое место
                            1. Илья Уткин 23 мая 2016, 12:52 # 0
                              хм… тогда не знаю… давненько я в него заглядывал, уже не помню… может, просто переделать сам сниппет xPoller?
                              1. Георгий Немашкалов 23 мая 2016, 13:06 # 0
                                Да я тоже склоняюсь к этому варианту. просто тепереь поле с результатом выборки выводить с
                                +modx.user.id:memberof=`Administrator`:then=``
                                Немогли бы вы подсказать как вывести выборку в конкретное место щаблона, извините за нубство и назойливость, я впервые правлю чужие сниппеты, да и xPDO впервые вижу.
                                1. Георгий Немашкалов 26 мая 2016, 11:32(Комментарий был изменён) # 0
                                  Вобщем из-за того что сроки горят пришлось напрямую из базы делать запросы… Реализовал нужный мне функционал, но надо учить xPDO!
                                  1. Георгий Немашкалов 26 мая 2016, 11:37(Комментарий был изменён) # 0
                                    Что то типа:
                                    $db = mysql_connect("окружение бд","имя пользователя базы","пароль бд");
                                    mysql_select_db("название бд",$db);
                                    
                                    echo "<table class='mytable'>";
                                    echo "<thead>";
                                    echo "<tr>";
                                    echo "<th>id</th>";
                                    echo "<th>Название опроса</th>";
                                    echo "</tr>";
                                    echo "</thead>";
                                    echo "<tbody>";
                                    $resultat = mysql_query("SELECT * FROM modx_xpoller_questions",$db);
                                    while($array = mysql_fetch_array($resultat)){
                                    echo "<tr>";
                                    echo "<td>".$array['id']."</td><td><a href='/index.php?id=52&qid=".$array['id']."'>".$array['text']."</a></td>";
                                    echo "</tr>";
                                    }
                                    
                                    echo "</tbody>";
                                    echo "</table>";
                                    И таких 4 сниппета. Кому интересен данный говнокод, пишите скину на почту.
                                    1. fake 13 февраля 2017, 14:27 # 0
                                      Георгий, если есть возможность, скиньте на dmi17068126@yandex.ru. Буду очень вам благодарен.
                        2. Alexandr Ivanov 04 ноября 2016, 19:49 # 0
                          Приветствую!
                          Поставил ваш компонент дал опрос
                          Вывел на сайте и получаю выше опроса такое
                          Notice: Undefined index: qid in /home/......../public_html/core/cache/includes/elements/modsnippet/136.include.cache.php on line 12 Warning: Division by zero in /home/......./public_html/core/cache/includes/elements/modsnippet/136.include.cache.php on line 75 Warning: Division by zero in /home/....../public_html/core/cache/includes/elements/modsnippet/136.include.cache.php on line 75 Warning: Division by zero in /home/.......public_html/core/cache/includes/elements/modsnippet/136.include.cache.php on line 75 Warning: Division by zero in /home/...../public_html/core/cache/includes/elements/modsnippet/136.include.cache.php on line 75

                          Есть какое то решение данной проблемы?
                          1. Илья Уткин 07 ноября 2016, 07:42 # 0
                            Попробуйте в сниппете вот эту строчку заменить на:
                                    if ($output['maxVotes']) {
                                        $option['percentVotes'] = round($option['votes'] / $output['maxVotes'] * 100, 2);
                                    } else {
                                        $option['percentVotes'] = 0;
                                    }
                            1. Alexandr Ivanov 09 ноября 2016, 11:44 # 0
                              К сожалению не помогло.
                          2. fake 08 февраля 2017, 09:43 # 0
                            Есть ли возможность работать с дополнением на фронтенде? Если такого не предусмотрено, то подскажите, пожалуйста, в какую сторону хотя бы копать? :)
                            1. Илья Уткин 08 февраля 2017, 10:04 # 0
                              Именно создание опросов из фронтенда? Неа, не предусмотрено. Даже не думал над таким. Тут нужно изучать xPDO, изучить структуру базы данных компонента и писать свои сниппеты и интерфейсы для фронтенда
                              1. fake 08 февраля 2017, 10:38 # 0
                                Спасибо!
                            2. fake 17 февраля 2017, 07:43 # 0
                              Илья, есть вопрос:
                              Прикрутил xPoller к Tickets — работает нормально. При нажатии на кнопку «Голосовать» на странице тикета остаются только результаты голосования. Если обновить страницу, то текст тикета подгружается. Подробнее в скринах: 1, 2, 3. В чем может быть проблема? Подозреваю, что в assets/components/xpoller/js/web/default.js?
                              1. Илья Уткин 17 февраля 2017, 08:40 # 0
                                Попробуйте дополнительно обернуть вызов сниппета в div
                                <div class="xPoller">
                                  [[!xPoller?
                                   ...
                                  ]]
                                </div>
                                1. fake 17 февраля 2017, 08:55 # 0
                                  Спасибо! Теперь ОК.
                              2. fake 17 февраля 2017, 09:35 # 0
                                Еще вопрос. По неизвестной причине не удаляются опросы.
                                Появляется ошибка «xpOption_err_nfs».
                                1. Илья Уткин 17 февраля 2017, 09:41 # 0
                                  Тут не смогу помочь… Давненько я сам этим компонентом не пользовался) Можете попробовать xPoller2 — он новее, возможно, в нём не будет таких проблем.
                                2. Спартак Ян 23 февраля 2017, 17:35(Комментарий был изменён) # 0
                                  пользователи не могут проголосовать с iphone safari
                                  кто нибудь решил эту проблему?
                                  вроде как в xpoller2 этот баг был исправлен, но может кто знает, как заставить работать xpoller?
                                  1. Павел 05 мая 2017, 16:01 # 0
                                    Доброго дня. Подскажите пожалуйста как убрать загрузку jquery.min.js а то PageSpeed Insights ругается так (Удалите код JavaScript, препятствующий отображению) другая библиотека подключена. Спасибо.
                                    1. Илья Уткин 16 мая 2017, 09:37 # 0
                                      К сожалению, только правкой исходников. Компонент уже давно не поддерживается, развития не получил. Но сейчас есть xPoller2. Её автор, вроде, поддерживает.
                                    2. Леонид 25 июня 2019, 12:19 # 0
                                      Кстати граждане, есть такая штука с этим дополнением, при отправке голосования с пустым ответом появляется Сообщение

                                      Авторизация

                                      через сервис Loginza:


                                      Шаблоны MODX

                                      1 2 Дальше »

                                      Объектная
                                      модель
                                      MODX