Инструменты пользователя

Инструменты сайта


ru:plugin:multipoll

Плагин MultiPoll

Совместим с «Докувики»

  • 2018-04-22 "Greebo" да
  • 2017-02-19 "Frusterick Manners" неизвестно
  • 2016-06-26 "Elenor Of Tsort" неизвестно
  • 2015-08-10 "Detritus" неизвестно

plugin Поддерживает опросы (в т.ч. множественные) на страницах вики. (из плагина от Gina Häußge, Michael Klier и ранее Esther Brunner)

Последнее обновление:
2010-04-12
Предоставляет
Syntax

Похож на poll, userpoll

Теги: !experimental, extended, poll

Скачать multipoll.zip

Syntax

Используйте этот плагин для добавления опросов. Синтаксис следующий:

<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">&nbsp;</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 для перезагрузки страницы и автоматически проголосовать за первые варианты в каждом опросе. Будут сильные разрушения

1)
Если нет, это приведёт к смешиванию метаданных голосований и пользователь с тем же IP, голосовавший один раз, второй раз проголосовать не сможет
ru/plugin/multipoll.txt · Последние изменения: 2018-12-28 17:20 — Dr-Yukon