Модуль Голосование (Аякс)

Аякс голосование

#1 23 февраля 2012 в 15:40
Здравствуйте!

Долго искал готовый модуль голосования, который бы работал через аякс — не нашел. Если такой все-таки уже есть — не ругайтесь сильно, я тут человек новый smile

За основу взят модуль "Голосование"(mod_polls), входящий в состав InstantCMS, компонент "Голосование"(polls) и урок по созданию динамического голосования (http://ruseller.com/lessons.php?rub=32&id=832).

Возможности:

— создание голосований через настройки модуля.
— просмотр результатов в админке
— выбор активного голосования (которое отображается в данный момент), если не выбрано — показывается рандомное.

Результаты подгружаются с сервера через аякс в формате json.

Контроль уникальности осуществляется через кукис и ip.

Парочка скринов:



Установка:
1. Распаковать архив с файлами.
2. Зайти в админку и установить модуль

По умолчанию создается одно голосование.

Пример можно посмотреть тут

PS Это мой первый модуль, который выставляю на всеобщее обсуждение — буду рад любым замечаниям.
Прикрепленный файл
ajaxpoll_9926d.zip 11 Кб
#2 23 февраля 2012 в 16:13
СУДЯ ПО ДЕМО- ОЧЕНЬ ХОРОШАЯ РАБОТА laugh
#3 23 февраля 2012 в 16:17


СУДЯ ПО ДЕМО- ОЧЕНЬ ХОРОШАЯ РАБОТА laugh

Nikitka

Всем желающим в личку могу кинуть ссылку на живой сайт на InstantCMS с работающим голосованием. В топике не стал "светить", во избежание zst
#4 23 февраля 2012 в 17:05
Хороший модуль получился ) Интересно а можно сделать так чтоб подобного рода опросы можно было пользователю на стене своей ставить(например через bb код)?
#5 25 февраля 2012 в 10:59

Контроль уникальности осуществляется через кукис и ip.

SJen

Подскажите, как можно будет сделать, чтобы голосовать могли только зарегистрированные пользователи?(какой код необходимо подправить) А то у нас провайдеры выходят под 1 ip, проголосовать сможет первый юзер с данной компании. Ну и просто куки не спасут от накруток.
#6 25 февраля 2012 в 12:10


Контроль уникальности осуществляется через кукис и ip.

SJen

Подскажите, как можно будет сделать, чтобы голосовать могли только зарегистрированные пользователи?(какой код необходимо подправить) А то у нас провайдеры выходят под 1 ip, проголосовать сможет первый юзер с данной компании. Ну и просто куки не спасут от накруток.

Strateg

Чтобы голосовать могли только зарегистрированные — проще всего не показывать его гостям. Тогда незарегистрированные вообще не увидят голосования. А вот про IP — замените в файле poll.php строки
  1.  
  2. if (isset($_COOKIE['vote_id'.$poll_id])
  3. or $inDB->rows_count("cms_ajaxpolls_log","ip='".GetRealIp()."' and poll_id ='$poll_id'",1))
  4. {$answer = 'none';} //если посетитель голосовал, то выводим результат
  5.  
на

  1.  
  2. if (isset($_COOKIE['vote_id'.$poll_id])
  3. or $inDB->rows_count("cms_ajaxpolls_log","user_id='$inUser->id' and poll_id ='$poll_id'",1))
  4. {$answer = 'none';} //если посетитель голосовал, то выводим результат
  5.  
Вместо проверки на уникальность IP, будет проверка на уникальность посетителя.
#7 28 февраля 2012 в 15:36
Скажите, а где человек может посмотреть результаты предыдущих голосований?

И еще — ошибка — несколько голосований не крутятся. Нужно, если посетитель уже голосовал (внесли правку с предыдущего поста) то показать ему следующий опрос
#8 28 февраля 2012 в 16:15


Скажите, а где человек может посмотреть результаты предыдущих голосований?

И еще — ошибка — несколько голосований не крутятся. Нужно, если посетитель уже голосовал (внесли правку с предыдущего поста) то показать ему следующий опрос

Минона

Результаты предыдущих сейчас нигде не получится увидеть, это тоже попробую добавить. И несколько голосований в модуле не работают… но это можно исправить, выложу на днях новую версию (я уже поборол этот недочет в голосованиях для стены). Чтобы показывать другой опрос если человек уже голосовал — надо дорабатывать, сейчас в модуль такой возможности не заложено.

Если у кого-нибудь есть еще пожелания (особенно у тех, кто скачал и установил себе) — пишите! — постараюсь учесть все в новой версии.
#9 28 февраля 2012 в 22:54
наверно стоит переработать сразу в компонент, чтобы голосование было "накопительным".
Модуль выводит голосования рандомно, из активных.
Модуль содержит ссылку на компонент
Компонент содержит список голосовалок и комментарии к ним.
Голосовалки можно закрывать, но комментарии можно добавлять все равно. Закрытие голосовалки — просто исключение ее из оборота в модуле голосований.

Простой пример — вопрос ответ, или любой другой
#10 28 февраля 2012 в 22:55
Это самый первый шаг.
Далее — в версии 2 НУЖНО будет добавить возможность создавать голосования пользователям системы и вставлять их прямо в блог, на стену и т.п.
#11 28 февраля 2012 в 22:56
Что то не то с этим модулем, стоит 20 голосов при установке и никуда не двигается, хотя голосов намного больше.При создании другого голосования (и даже при удалении старого), голосование остается то что было.Шрифт вопроса не большой а огромный.Вот вроде все…
#12 28 февраля 2012 в 23:43


Что то не то с этим модулем, стоит 20 голосов при установке и никуда не двигается, хотя голосов намного больше.При создании другого голосования (и даже при удалении старого), голосование остается то что было.Шрифт вопроса не большой а огромный.Вот вроде все..

GarikKR

Может быть движком неверно определяется IP пользователя и из-за контроля уникальности не засчитываются голоса? — попробуйте поменять код файла poll.php на
  1.  
  2. <?php
  3. function GetRealIp()
  4. {
  5. if (!empty($_SERVER['HTTP_CLIENT_IP']))
  6. {
  7. $ip=$_SERVER['HTTP_CLIENT_IP'];
  8. }
  9. elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
  10. {
  11. $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  12. }
  13. else
  14. {
  15. $ip=$_SERVER['REMOTE_ADDR'];
  16. }
  17. return $ip;
  18. }
  19.  
  20.  
  21. define("VALID_CMS", 1);
  22. header('Content-type: text/html; charset=cp1251');
  23. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  24. include(PATH.'/core/cms.php');
  25. include(PATH.'/includes/config.inc.php');
  26. $inCore = cmsCore::getInstance();
  27. define('HOST', 'http://' . $inCore->getHost());
  28. $inCore->loadClass('db'); //база данных
  29. $inCore->loadClass('config'); //конфигурация
  30. $inCore->loadClass('user'); //база данных
  31. $inDB = cmsDatabase::getInstance();
  32. $inUser = cmsUser::getInstance();
  33. $inUser->update();
  34.  
  35. //читаем номер ответа и номер опроса
  36. $answer = $_GET['vote'];
  37. $poll_id = $_GET['poll_id'];
  38.  
  39. $answer = str_replace('"', '&quot;', $answer);
  40.  
  41. if (isset($_COOKIE['vote_id'.$poll_id])
  42. or $inDB->rows_count("cms_ajaxpolls_log","((user_id='$inUser->id')оr(ip='".GetRealIp()."')) and poll_id ='$poll_id'",1))
  43. {$answer = 'none';} //если посетитель голосовал, то выводим результат
  44.  
  45.  
  46.  
  47. // находим нужный опрос
  48. $sql = "SELECT * FROM cms_ajaxpolls WHERE id = $poll_id";
  49. $result = $inDB->query($sql);
  50. if ($inDB->num_rows($result)){
  51. $poll = $inDB->fetch_assoc($result);
  52.  
  53. // получаем результаты в виде массива
  54. $answers = unserialize($poll['answers']);
  55. $i = 0;
  56. $rr = array();
  57. $r = array();
  58. foreach($answers as $key=>$value){
  59. $i++;
  60.  
  61. if ($answer != 'none') { // если none - значит посетитель уже голосовал, нужно просто показать результат
  62. if ($i==$answer){
  63. // увеличиваем нужный вариант ответа на единицу
  64. $answers[$key] += 1;
  65. }
  66. }
  67. $r[0] = $i;
  68. //перекодировка необходима для функции json_encode
  69. $r[1] = iconv('cp1251','utf-8', $key);
  70. $r[2] = $answers[$key];
  71. //временный массив $rr нужен для преобразования в формат json
  72. $rr[] = $r;
  73. }
  74. if ($answer != 'none') { // если посетитель проголосовал, обновляем результаты опроса
  75. $sql = "UPDATE cms_ajaxpolls SET answers = '".serialize($answers)."' WHERE id = $poll_id";
  76. $inDB->query($sql);
  77. setcookie("vote_id".$poll_id, $poll_id, time()+31556926);
  78. $user_id = $inUser->id;
  79. $ip = GetRealIp();
  80. $sql = "INSERT cms_ajaxpolls_log (poll_id, answer_id, user_id, ip)
  81. VALUES ('$poll_id', '$answer', '$user_id', '$ip')";
  82. $inDB->query($sql);
  83. }
  84. print json_encode($rr);
  85. }
  86.  
  87.  
  88.  
  89. if (!function_exists('json_encode')) {
  90. function json_encode($a=false) {
  91. if (is_null($a)) return 'null';
  92. if ($a === false) return 'false';
  93. if ($a === true) return 'true';
  94. if (is_scalar($a)) {
  95. if (is_float($a)) {
  96. return floatval(str_replace(",", ".", strval($a)));
  97. }
  98.  
  99. if (is_string($a)) {
  100. static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
  101. return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
  102. }
  103. else
  104. return $a;
  105. }
  106. $isList = true;
  107. for ($i = 0, reset($a); $i < count($a); $i++, next($a)) {
  108. if (key($a) !== $i) {
  109. $isList = false;
  110. break;
  111. }
  112. }
  113. $result = array();
  114. if ($isList) {
  115. foreach ($a as $v) $result[] = json_encode($v);
  116. return '[' . join(',', $result) . ']';
  117. }
  118. else {
  119. foreach ($a as $k => $v) $result[] = json_encode($k).':'.json_encode($v);
  120. return '{' . join(',', $result) . '}';
  121. }
  122. }
  123. }
  124.  
  125.  
А по поводу шрифта — я же делал под свой дизайн, но вы вполне можете менять css файл(mod_ajaxpolls\css\style.css) под ваш шаблон (я этого не могу сделать, не видя вашего сайта). Голосование меняется в админке — там можно выбрать "Активное голосование". Если не получается, пишите в личку — помогу.
#13 28 февраля 2012 в 23:49


наверно стоит переработать сразу в компонент, чтобы голосование было "накопительным".
Модуль выводит голосования рандомно, из активных.
Модуль содержит ссылку на компонент
Компонент содержит список голосовалок и комментарии к ним.
Голосовалки можно закрывать, но комментарии можно добавлять все равно. Закрытие голосовалки — просто исключение ее из оборота в модуле голосований.

Простой пример — вопрос ответ, или любой другой

Это самый первый шаг.
Далее — в версии 2 НУЖНО будет добавить возможность создавать голосования пользователям системы и вставлять их прямо в блог, на стену и т.п.

Минона

Много написали smileС пунктами согласен, это будет шикарная система опросов для любого социально направленного сайта. Все реализуемо. Другое дело, что не обещаю это все скоро — все-таки в основном я занят своим проектом, а там приоритеты не всегда совпадают с моими желаниями (хотя признаюсь, разработка такой системы голосований — это интересно).
#14 29 февраля 2012 в 00:55
На счет шрифта, это понятно что можно самому подправить.Активное голосование не ставилось, потому как оно не появлялось в списке.Код поменяю отпишусь.
#15 29 февраля 2012 в 01:41
Код поменял, сейчас вроде работает.Но когда проголосовал результат не выводится, белый модуль.Только перезагрузка страницы решает, дальше вроде нормально работает.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.