Интерфейс довольно простой:
На странице вызывается так:[[!xPoller? &id=`1`]]
Опрос выглядит как-то так:
Как вы относитесь к MODX 2.3.x?
Очень нравится. Наконец-то воплотили мою мечту
Нормально. Логичное продолжение политики разработчиков
Можно было сделать и получше
Не нравится. Жаль, что придется обновляться
Сделали какую-то фигню. Дуров! Верни стену!!!
Голосовать могут только зарегистрированные и авторизованные пользователи.
Объектная
Счастья, здоровья, творческих успеков!!! :))
Quip, сорри, — Polls<?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; }При таком варианте вообще только один раз можно проголосовать — первому кто ответил :)
Теперь надо придумать как ограничить только повторное голосование.
а вот как ему передать именно тот же ID опроса?
$quest = $modx->getPlaceholder('id');Немогли бы вы подсказать как вывести выборку в конкретное место щаблона, извините за нубство и назойливость, я впервые правлю чужие сниппеты, да и xPDO впервые вижу.
$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 сниппета. Кому интересен данный говнокод, пишите скину на почту.Поставил ваш компонент дал опрос
Вывел на сайте и получаю выше опроса такое
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
Есть какое то решение данной проблемы?
if ($output['maxVotes']) { $option['percentVotes'] = round($option['votes'] / $output['maxVotes'] * 100, 2); } else { $option['percentVotes'] = 0; }Прикрутил xPoller к Tickets — работает нормально. При нажатии на кнопку «Голосовать» на странице тикета остаются только результаты голосования. Если обновить страницу, то текст тикета подгружается. Подробнее в скринах: 1, 2, 3. В чем может быть проблема? Подозреваю, что в assets/components/xpoller/js/web/default.js?
Появляется ошибка «xpOption_err_nfs».
кто нибудь решил эту проблему?
вроде как в xpoller2 этот баг был исправлен, но может кто знает, как заставить работать xpoller?