DokuWiki

It's better when it's simple

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

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


ru:plugin:multipoll

Плагин MultiPoll

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

>=2006-11-06, Greebo

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

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

Это расширение не обновлялось более двух лет. Возможно, оно больше не разрабатывается или не поддерживается; возможны проблемы совместимости.

This extension is not in the 'plugin' or 'template' namespace and is therefore ignored.

Похож на poll, quiz, userpoll

Теги: !experimental, extended, poll

Установка

  • По ссылке:
    • Скопируйте адрес из ссылки «Скачать» из формы вверху этой страницы. Вставьте его в Менеджере Плагинов вашего сайта во вкладке «Ручная установка» в первое поле. Нажмите кнопку «Установить».
  • Скачанный архив:
    • Предложите архив второму полю той же вкладки. Нажмите кнопку «Установить».
    • Распакуйте из архива папку плагина. Правильное наименование папки плагина - в файле 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">&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 · Последнее изменение: 2019-11-19 18:56 — Dr-Yukon

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki