Перейти к контенту

[2.3.x](SnS) AJAX Голосование в опросах


Рекомендуемые сообщения

Название: (SnS) AJAX Голосование в опросах

Добавил: Sannis

Добавлен: 13 Июн 2007

Обновлен: 01 Сен 2007

Категория: IP.Board 2.3.x

 

Эта модификация затрагивает систему голосования на форуме, после её установки все действия с опросами( голосование,

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

 

Навеяно vkontakte.ru :)

 

Адаптацию для модов множественного и публичного голосования к 2.1.x см. в первом ответе темы поддержки. Arhar, спасибо!

 

P.S. Для желающих отблагодарить автора - реквизиты в профиле.

 

Нажмите здесь, чтобы скачать файл

Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 61
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Загружено фотографий

Сделал адаптацию под мод МультиВыбор и Публичные Опросы

итак есть только один трабл, отменить решение нельзя

тоесть если ткнул галочку, то в яваскрипте уже добавилось

 

но это не большая проблема, думаю решаемо

 

как в яваскрипте убрать из массива элемент, если по такому индексу он уже присутствует?

 

все

решил

для мода Multiply Choise && Public Polls

xmlout.php

функция poll_vote

заменить текст функции целиком на

		$topic_id   = intval( $_REQUEST['t'] );
	$md5_check = substr( $this->ipsclass->parse_clean_value( rawurldecode( $_REQUEST['md5check'] ) ), 0, 32 );

	$_REQUEST['choice'] = unserialize($_REQUEST['choice']);


	require_once( ROOT_PATH."sources/action_public/topics.php" );

	$topics		   =  new topics();
	$topics->ipsclass =& $this->ipsclass;
	$topics->topic_init();
	$topics->build_permissions();
	$topics->topic['tid'] = $topic_id;

	//-----------------------------------------
	// Save members vote
	//-----------------------------------------

	if( $md5_check != $this->ipsclass->return_md5_check() )
	{
		$this->return_string('error1');
	}


	$vote_cast = array();

	$this->ipsclass->load_language('lang_topic');

	//-----------------------------------------
	// Permissions check
	//-----------------------------------------

	if ( !$topics->can_vote )
	{
		$this->return_string('error2');
	}

	//-----------------------------------------
	// Make sure we have a valid poll id
	//-----------------------------------------

	if ( !$topic_id )
	{
		$this->return_string('error3');
	}

	   //-----------------------------------------
	   // Load the topic and poll
	   //-----------------------------------------

	   $this->ipsclass->DB->cache_add_query( 'poll_get_poll_with_topic', array( 'tid' => $topic_id ) );
	$this->ipsclass->DB->cache_exec_query();

	   $topics->topic = $this->ipsclass->DB->fetch_row();

	   //-----------------------------------------
	   // No topic?
	   //-----------------------------------------

	   if ( !$topics->topic['tid'] )
	   {
		   $this->return_string('error4');
	   }

	//-----------------------------------------
	// Locked topic?
	//-----------------------------------------

	   if ( $topics->topic['state'] != 'open' )
	   {
		   $this->return_string('error5');
	   }

	   //-----------------------------------------
	   // Have we voted before?
	//-----------------------------------------

	$this->ipsclass->DB->simple_construct( array( 'select' => 'member_id', 'from' => 'voters', 'where' => "tid={$topics->topic['tid']} and member_id=".$this->ipsclass->member['id'] ) );
	$this->ipsclass->DB->simple_exec();

	if ( $this->ipsclass->DB->get_num_rows() )
	{
		$this->return_string('error6');
	}

	//-----------------------------------------
	// Sort out the new array
	//-----------------------------------------

	if ( !$this->ipsclass->input['nullvote'] )
	{
		//-----------------------------------------
		// First, which choices and ID did we choose?
		//-----------------------------------------

		if ( is_array( $_REQUEST['choice'] ) and count( $_REQUEST['choice'] ) )
		{
			foreach( $_REQUEST['choice'] as $question_id => $choice_id )
			{	
				if (strpos($question_id,'_')!==false)
				{
					$qarr = explode('_',$question_id);

					if ($choice_id==0) continue;

					$question_id = $qarr[0];
					$choise_id = array();
					$choise_id[] = $qarr[1];

					if (!is_array($_REQUEST['choice'][$question_id])) $_REQUEST['choice'][$question_id] = array($_REQUEST['choice'][$question_id]);
					if (!in_array($qarr[1],$_REQUEST['choice'][$question_id]))
					{
						$_REQUEST['choice'][$question_id] = array_merge($_REQUEST['choice'][$question_id],$choise_id);
					}
				}
			}
		}

		if ( is_array( $_REQUEST['choice'] ) and count( $_REQUEST['choice'] ) )
		{
			foreach( $_REQUEST['choice'] as $question_id => $choice_id )
			{
				if ( !strlen($question_id) or !isset($choice_id) or (strpos($question_id,'_')!==false))
				{
					continue;
				}

				$vote_cast[ $question_id ] = $choice_id;
			}
		}

		//-----------------------------------------
		// Unparse the choices
		//-----------------------------------------

		$poll_answers = unserialize( stripslashes( $topics->topic['choices'] ) );
		reset($poll_answers);

		//-----------------------------------------
		// Got enough votes?
		//-----------------------------------------

		if ( count( $vote_cast ) < count( $poll_answers ) )
		{
			$this->return_string('error7');
		}

		//-----------------------------------------
		// Add voter
		//-----------------------------------------

		$this->ipsclass->DB->do_insert( 'voters', array( 'member_id'  => $this->ipsclass->member['id'],
														 'ip_address' => $this->ipsclass->ip_address,
														 'tid'		=> $topics->topic['tid'],
														 'forum_id'   => $topics->topic['forum_id'],
														 'vote_date'  => time(),
														) );

		//-----------------------------------------
		// Loop
		//-----------------------------------------

		foreach ( $vote_cast as $question_id => $choice_id )
		{
			if(is_array($choice_id))
			{
				$choice_id_array = $choice_id;
			}
			else
			{
				$choice_id_array = array($choice_id);
			}
			foreach( $choice_id_array as $choice_id_vote )
			{
				$poll_answers[ $question_id ]['votes'][ $choice_id_vote ]++;

				if ( $poll_answers[ $question_id ]['votes'][ $choice_id_vote ] < 1 )
				{
					$poll_answers[ $question_id ]['votes'][ $choice_id_vote ] = 1;
				}

				if($poll_answers[ $question_id ]['pubvote'] == "1")
				{
					if($poll_answers[ $question_id ]['voters'][ $choice_id_vote ] == '')
					{
						$poll_answers[ $question_id ]['voters'][ $choice_id_vote ] = $this->ipsclass->member['id'];
					}
					else
					{
						$poll_answers[ $question_id ]['voters'][ $choice_id_vote ] .= ','.$this->ipsclass->member['id'];
					}
				}
			}
		}			 
		//-----------------------------------------
		// Save...
		//-----------------------------------------

		$topics->topic['choices'] = addslashes( serialize( $poll_answers ) );

		$this->ipsclass->DB->simple_exec_query( array( 'update' => 'polls',
													   'set'	=> "votes=votes+1,choices='{$topics->topic['choices']}'",
													   'where'  => "pid={$topics->topic['poll_id']}" ) );

		//-----------------------------------------
		// Go bump in the night?
		//-----------------------------------------

		if ($topics->topic['allow_pollbump'])
		{
			$topics->topic['last_vote'] = time();
			$topics->topic['last_post'] = time();

			$this->ipsclass->DB->do_update( 'topics', array( 'last_vote' => $topics->topic['last_vote'], 'last_post' => $topics->topic['last_post'] ), 'tid='.$topics->topic['tid'] );
		}
		else
		{
			$topics->topic['last_vote'] = time();

			$this->ipsclass->DB->do_update( 'topics', array( 'last_vote' => $topics->topic['last_vote'], 'last_post' => $topics->topic['last_post'] ), 'tid='.$topics->topic['tid'] );
		}
	}
	else
	{
		//-----------------------------------------
		// Add null vote
		//-----------------------------------------

		$this->ipsclass->DB->do_insert( 'voters', array( 'member_id'  => $this->ipsclass->member['id'],
														 'ip_address' => $this->ipsclass->ip_address,
														 'tid'		=> $topics->topic['tid'],
														 'forum_id'   => $topics->topic['forum_id'],
														 'vote_date'  => time(),
														) );
	}


	//-----------------------------------------
	// Make output html
	//-----------------------------------------

	$html = $topics->parse_poll();

	foreach( $this->ipsclass->skin['_macros'] as $i => $row )
	{
		if ( $row['macro_value'] != "" )
		{
			$html = str_replace( "<{".$row['macro_value']."}>", $row['macro_replace'], $html );
		}
	}

	$html = str_replace( "<#IMG_DIR#>", $this->ipsclass->skin['_imagedir'], $html );
	$html = str_replace( "<#EMO_DIR#>", $this->ipsclass->skin['_emodir']  , $html );


	//-----------------------------------------
	// Return poll html
	//-----------------------------------------

	@header("Content-type: text/html;charset={$this->ipsclass->vars['gb_char_set']}");
	$this->print_nocache_headers();
	print $html;
	exit;

 

 

 

яваскрипт

 

добавить функцию

 

function pre_ajax_array_select(qid, cid)
{
n = qid + '_' + cid;
if (poll_choice[ n ] == cid)
{
 poll_choice[ n ] = 0;
}
else
{
 poll_choice[ n ] = cid;
}

return false;
}

 

заметнить функцию function phpArraySerialize(val) на

 

function phpArraySerialize(val)
{
if (val == null)
{
 return "N;";
}
else if ("length" in val)
{
 var ser_str = '';
 var l = 0;
 /*if ( val.length )
 {*/
  for( var i in val )
  {
			r = 1;
			if (val[i] > 9)
			{
				r = 2;
			}
			ser_str += 's:'+ i.length +':"' + i + '";s:'+ r +':"' + val[i] + '";';
			l++;
  }
 //}
 return 'a:' + l + ':{' + ser_str + '}';
}

return "N;";
}

 

skin_poll - poll_show_form_choice

 

полностью на

 

<tr>
<td class="post2" colspan="3">
<if="qtype==1">
<input type="checkbox" name="choice[{$id}][]" value="$choice_id" onclick="pre_ajax_array_select({$id},{$choice_id})" class="radiobutton" /> <b>$answer</b>
</if>
<else>
<input type="radio" name="choice[{$id}]" value="$choice_id" onclick="pre_ajax_choice_select({$id},{$choice_id})" class="radiobutton" /> <b>$answer</b></td>
</else>
</tr>

 

пробуем

Ссылка на комментарий
Поделиться на других сайтах

Кто-нибудь попробуйте её на 2.2.x :D
Ссылка на комментарий
Поделиться на других сайтах

поставил на 2.2.2 есть проблема, после голосования пропадает данная тема! если создать новый опрос и проголосовать в нем тоже самое пропадает данная тема...
Ссылка на комментарий
Поделиться на других сайтах

В каком смысле пропадает?

Удаляется? Этого в коде нет ;)

Пропадает из списка тем? Посмотрите какая у вас стоит сортировка в форуме.

 

:D

Ссылка на комментарий
Поделиться на других сайтах

после того как проголосовал, и возвращаешься в список тем ее там нету... она перемещаеться в конец списка так как почему вместо к примеру:

 

11.04.2007, 18:43

Посл. сообщение: Kenr

 

Ставиться:

 

--

Посл. сообщение: Kenr

 

 

Раньше такого небыло.

Ссылка на комментарий
Поделиться на других сайтах

Приехал :D

 

Беглое решение(xmlout.php):

			//-----------------------------------------
		// Go bump in the night?
		//-----------------------------------------

		if ($topics->topic['allow_pollbump'])
		{
			$topics->topic['last_vote'] = time();
			$topics->topic['last_post'] = time();

			$this->ipsclass->DB->do_update( 'topics', array( 'last_vote' => $topics->topic['last_vote'], 'last_post' => $this->topic['last_post'] ), 'tid='.$topics->topic['tid'] );
		}
		else
		{
			$topics->topic['last_vote'] = time();

			$this->ipsclass->DB->do_update( 'topics', array( 'last_vote' => $topics->topic['last_vote'], 'last_post' => $this->topic['last_post'] ), 'tid='.$topics->topic['tid'] );
		}

$this->topic заменить на $topics->topic ;)

 

UPD: Обновил архив.

Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...

Поставил где-то полмесяца назад сей мод вместе с Multiply Choise && Public Polls.

Только вчера заметили одну проблему...

Если нажать на кнопку "Показать результаты опроса" без предварительно голосования, то выдаёт следующее:

Вот как это безобразие выглядит на FireFox: скришот раз.

 

А вот как выглядит оно же, но на Internet Explorer'e: скриншот два.

Форум

Версия: 2.1.7

Ссылка на комментарий
Поделиться на других сайтах

Примечание в конце инструкции помогает?

 

Если ошибка во втором моде, то это к Архару, у меня он не стоит :D

Ссылка на комментарий
Поделиться на других сайтах

Примечание в конце инструкции помогает?

 

Если ошибка во втором моде, то это к Архару, у меня он не стоит sad.gif

Да, спасибо. До этого не думал, что возникнет проблема...

Кстати, почему некоторые символы (например, одинарная ковычка, а также двойные ковычки) приобразуются в нечто типа: "

При быстрой цитате с bb-кодами это есть. Также в моде от Dean'a D21-Edit Forum Title & Desc Via Ajax 1.0 точно такое же проявляется.

(Сорри, что вопрос в той теме)

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

При включении функции голосования "Позволить пользователям выбирать более одного варианта ответа"

Вылетает вот такая ошибка:

Ошибка[8]:

Скорее всего вы не выбрали варианты во всех пунктах опроса.

Как бороться?

Ссылка на комментарий
Поделиться на других сайтах

Версия? JS ошибок нет?
Ссылка на комментарий
Поделиться на других сайтах

Тьфу. Судя по ошибке вы в xmlout.php функцию не заменили как Архар написал.
Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Небольшая проблема.

Если создаёшь несколько мульти-опросов, то не выбрав вариантов в одном опросе, при попытке голосования вылетает Error7

Ссылка на комментарий
Поделиться на других сайтах

Так и должно быть, нужно же хоть что-то ответить. В оригинале тоже была бы ошибка :D
Ссылка на комментарий
Поделиться на других сайтах


×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.