Плагин MultiPoll
Установка
- По ссылке:
- Скопируйте адрес из ссылки «Скачать» из формы вверху этой страницы. Вставьте его в Менеджере Плагинов вашего сайта во вкладке «Ручная установка» в первое поле. Нажмите кнопку «Установить».
- Скачанный архив:
- Предложите архив второму полю той же вкладки. Нажмите кнопку «Установить».
- Распакуйте из архива папку плагина. Правильное наименование папки плагина - в файле
plugin.info.txt
после указателя base. Переименуйте папку и загрузите на сервер вашего сайта, если понимаете, как это сделать.
Синтаксис
Используйте этот плагин для добавления опросов. Синтаксис следующий:
<multipoll [hideresults] [hideifvoted] [showresultsto]=user,@grp,... | [id]> Вопрос 1 * Вариант ответа ИЛИ * Вариант ответа ИЛИ * ... Вопрос 2 * Вариант ответа ИЛИ * Вариант ответа Многовариантный вопрос + Вариант ответа + Вариант ответа + Вариант ответа + ... </multipoll>
hideresults | скрывает результаты опроса от тех, кто не имеет на странице права на запись, показывает сообщение «Вы уже проголосовали» | опционально |
---|---|---|
hideifvoted | полностью скрывает опрос от тех, кто проголосовал, только пользователь с правом записи видит результаты | опционально |
showresultsto | пользователи и @группы (через запятую), имеющие право на просмотр результатов без обязанности голосовать или прав редактирования | опционально |
id | идентификатор голосования; должен быть уникальным1); показывается как титул | обязательно |
Вопросы, разумеется, опциональны; если они есть, то ответы на них обязательны
Титул голосования конвертируется в сумму MD5 и используется как имя в файлах и метаданных: md5sum.multipoll - так что все голосования в вики должны быть уникальны в названии. В результате вы можете передвигать голосование и его результаты останутся корректными. Удаляя голосование, удаляйте и его метаданные
Заметки об установке
Если установлен плагин blog, нужно выключить опцию $conf['plugin']['blog']['useifmodifiedsince']
. Я пытаюсь убрать эту несовместимость
Обсуждение
1
Предоставляются следующие улучшения:
- Исправление - проценты результатов корректны, даже когда пользователь проголосовал за часть вопросов
- Дополнение - IP может голосовать снова через час
- Дополнение - после голосования страница отматывается к якорной метке голосования, чтобы показать его результаты
- Дополнение - больше пространства между вопросами, чтобы не путаться между ними
- syntax.diff
--- syntax.orig.php 2010-04-12 18:08:48.000000000 +0200 +++ syntax.php 2010-06-06 21:48:50.000000000 +0200 @@ -151,6 +151,8 @@ if($save) { $poll['votes']++; $poll['ips'][] = $ip; + // CHANGE + $poll['time'] = time(); if($_SERVER['REMOTE_USER']) $poll['users'][] = $_SERVER['REMOTE_USER']; if($fh = fopen($pfile, 'w')) { fwrite($fh, serialize($poll)); @@ -158,7 +160,7 @@ } $voted = true; } - }elseif(in_array($ip, $poll['ips']) || ($_SERVER['REMOTE_USER'] && in_array($_SERVER['REMOTE_USER'], $poll['users']))) { + }elseif( (in_array($ip, $poll['ips']) /*CHANGE - one hour limit*/ && time()-$poll['time'] <= 60*60) || ($_SERVER['REMOTE_USER'] && in_array($_SERVER['REMOTE_USER'], $poll['users']))) { $voted = true; } @@ -188,11 +190,20 @@ foreach($questions as $question) { $ret .= ' <div class="multipoll_question" id="poll_question_'.$q.'">'.$renderer->_xmlEntities($question['q']).'</div>'."\n"; $ret .= ' <table class="blind">'."\n"; + // CHANGE - Find total number of votes for this question; note this might be different from $poll['votes'], + // since user might vote only for some questions and not for others + $total = 0; + foreach($question['a'] as $a) { + $s = isset($poll['results'][$q]) ? (isset($poll['results'][$q][$a]) ? $poll['results'][$q][$a] : 0) : 0; + $total += $s; + } foreach($question['a'] as $a) { $ret .= ' <tr>'."\n"; $a = $renderer->_xmlEntities($a); $s = isset($poll['results'][$q]) ? (isset($poll['results'][$q][$a]) ? $poll['results'][$q][$a] : 0) : 0; - $pct = sprintf('%3.1f', 100 * $s / $poll['votes']); + // CHANGE + // $pct = sprintf('%3.1f', 100 * $s / $poll['votes']); + $pct = sprintf('%3.1f', 100 * $s / $total); $ret .= ' <td>'.$a.'</td>'."\n"; $ret .= ' <td><div class="multipoll_bar">'.($s ? '<div class="multipoll_full" style="width:'.($pct * 2).'px"> </div>' : '').'</div></td>'."\n"; $ret .= ' <td class="rightalign">'.$pct.'% ('.$s.')</td>'."\n"; @@ -209,7 +220,9 @@ global $lang; global $ID; - $ret = '<form id="multipoll__form" method="post" action="'.script().'" accept-charset="'.$lang['encoding'].'">'."\n"; + // CHANGE + // $ret = '<form id="multipoll__form" method="post" action="'.script().'" accept-charset="'.$lang['encoding'].'">'."\n"; + $ret = '<form id="multipoll__form" method="post" action="'.$ID.'#anketa" accept-charset="'.$lang['encoding'].'">'."\n"; $ret .= ' <div class="no">'."\n"; $ret .= ' <input type="hidden" name="do" value="show" />'."\n"; $ret .= ' <input type="hidden" name="id" value="'.$ID.'" />'."\n"; @@ -225,7 +238,8 @@ $ret .= ' <input type="checkbox" name="multipoll_question_'.$q.'[]" value="'.$a.'" /> <span>'.$a.'</span><br />'."\n"; }else $ret .= ' <input type="radio" name="multipoll_question_'.$q.'" value="'.$a.'" /> <span>'.$a.'</span><br />'."\n"; } - $ret .= ' <hr />'."\n"; + // CHANGE + $ret .= ' <br><hr><br>'."\n"; $q++; } $ret .= ' <input class="button" type="submit" name="multipoll_vote" value="'.$this->getLang('btn_vote').'" />'."\n";
2
Анимированную версию, адаптированную с cssdeck.com можно скачать здесь (MD5 сумма 392d7a5075aaf36c6f49feecdb67bd15)
Анимированную версию с conf[ширина полосок голосования] можно скачать здесь (MD5 сумма 4cbf093a456e6414cb9960e626f06f70)
Все три версии имеют ошибку (как минимум в Binky) - незарегистрированный пользователь может нажать F5 для перезагрузки страницы и автоматически проголосовать за первые варианты в каждом опросе. Будут сильные разрушения