Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Macêdo

[Resolvido] Enquete estilo site "Código Fonte"

Recommended Posts

Estou muito interessado nesse script de enquetes do site "Código Fonte".

http://codigofonte.uol.com.br/

 

Alguém teria ou saberia onde baixá-lo?

 

Agradeço desde já! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou muito interessado nesse script de enquetes do site "Código Fonte".

 

Diego, montar uma enquete dessas é muito simples,

 

Primeiro você vai precisar de 3 tabelas, Na tabela enquetes você irá gravar o título da enquete, a data de início e fim da enquete e indicará se é uma enquete com múltiplas respostas ou se aceitará apenas uma resposta.

 

Tabela Enquetes

mysql> select * from `Enquetes`;
+------------+--------------------------------------------------+---------------------+---------------------+----------+
| idEnquetes | titulo 	| inicio 	| fim 	| multiplo |
+------------+--------------------------------------------------+---------------------+---------------------+----------+
| 	1 | Você acha que sucesso do Twitter é passageiro? | 2009-12-02 05:00:00 | 2009-12-25 05:00:00 | 	0 |
+------------+--------------------------------------------------+---------------------+---------------------+----------+
1 row in set (0.00 sec)

Depois você irá precisar de uma tabela para as perguntas:

Tabela Perguntas

mysql> select * from `Perguntas`;
+-------------+------------+-----------------------------+
| idPerguntas | idEnquetes | pergunta 	|
+-------------+------------+-----------------------------+
| 	3 | 	1 | Não sei 	|
| 	2 | 	1 | Não, ele veio para ficar |
| 	4 | 	1 | O que é Twitter ? 	|
| 	1 | 	1 | Sim, ele vai cair em desuso |
+-------------+------------+-----------------------------+
4 rows in set (0.00 sec)

Veja que a coluna idEnquetes é a relação das perguntas com o título da enquete na tabela Enquetes. Depois você vai precisar de uma tabela onde você irá armazenar os votos:

Tabela Respostas

mysql> select * from `Respostas`;
+-------------+-------------+	
| idRespostas | idPerguntas |	
+-------------+-------------+	
| 	5 | 	1 |
| 	6 | 	2 |
| 	7 | 	2 |
| 	8 | 	2 |
| 	10 | 	2 |
| 	11 | 	2 |
| 	12 | 	2 |
| 	13 | 	2 |
| 	14 | 	2 |
| 	4 | 	3 |
| 	9 | 	3 |
| 	3 | 	4 |
+-------------+-------------+
12 rows in set (0.00 sec)

Com as 3 tabelas você irá precisar de uma Model para fazer o CRUD:

Model.php

abstract class Model {
const DB_HOST = '127.0.0.1';
const DB_USER = 'usuariodobanco';
const DB_PSWD = 'senhadobanco';
const DB_NAME = 'enquete';

protected $pdo;

final public function __construct(){
	$this->pdo = new PDO( sprintf( 'mysql:host=%s;dbname=%s' , self::DB_HOST , self::DB_NAME ) , self::DB_USER , self::DB_PSWD );
}
}

 

A classe Model é apenas base para a criação da Model das Enquetes:

EnquetesModel

class EnquetesModel extends Model {
public function &getEnquetes(){
	$ret	= array();
	$stmt	= $this->pdo->prepare( 'SELECT * FROM `Enquetes` e WHERE :now BETWEEN e.`inicio` AND e.`fim`' );
	$stmt->bindValue( ':now' , date( 'Y-m-d H:i:s' ) , PDO::PARAM_STR );

	if ( $stmt->execute() ){
		while ( ( $row = $stmt->fetch( PDO::FETCH_OBJ ) ) !== false ){
			$ret[] = $row;
		}
	}

	return $ret;
}

public function &getPerguntas( &$idEnquete ){
	$ret = array();

	$stmt = $this->pdo->prepare( 'SELECT p.`idPerguntas`,p.`pergunta` FROM `Perguntas` p WHERE p.`idEnquetes`=:idEnquetes order by p.`pergunta`' );
	$stmt->bindParam( ':idEnquetes' , $idEnquete , PDO::PARAM_INT );

	if ( $stmt->execute() ){
		while ( ( $row = $stmt->fetch( PDO::FETCH_OBJ ) ) !== false ){
			$ret[] = $row;
		}
	} else throw new RuntimeException( 'Erro ao recuperar as perguntas' );

	return $ret;
}

public function &getResults( &$idEnquete ){
	$ret = array();

	$stmt = $this->pdo->prepare( 'SELECT e.`titulo`,p.`pergunta`,count(*) "votos" FROM `Perguntas` p LEFT JOIN `Respostas` r USING(`idPerguntas`) LEFT JOIN `Enquetes` e USING(`idEnquetes`) WHERE e.`idEnquetes`=:idEnquete GROUP BY r.`idPerguntas`' );
	$stmt->bindParam( ':idEnquete' , $idEnquete , PDO::PARAM_INT );

	if ( $stmt->execute() ){
		while ( ( $row = $stmt->fetch( PDO::FETCH_OBJ ) ) !== false ){
			$ret[] = $row;
		}
	} else throw new RuntimeException( 'Erro ao recuperar os resultados.' );

	return $ret;
}

public function saveVote( &$idPergunta ){
	$stmt = $this->pdo->prepare( 'INSERT INTO `Respostas`(`idPerguntas`) VALUES(:idPergunta);' );
	$stmt->bindParam( ':idPergunta' , $idPergunta , PDO::PARAM_INT );

	return $stmt->execute();
}
}

 

Como pode ver, a EnquetesModel é a classe que lidará com o banco de dados, agora vamos precisar de uma View para exibir os dados:

EnquetesView.php

class EnquetesView {
private $model = array();

public function setModel( array &$model ){
	$this->model =& $model;
}

public function show(){
	foreach ( $this->model as $row ){
		echo '<div id="enquetes">' , PHP_EOL;
		echo '<form action="' , $_SERVER[ 'PHP_SELF' ] , '?action=saveVote" method="post">' , PHP_EOL;
		echo '<input type="hidden" name="enquete" value="' , $row[ 0 ]->idEnquetes , '" />' , PHP_EOL;
		echo '<strong>' , $row[ 0 ]->titulo , '</strong>' , PHP_EOL;
		echo '<ul>' , PHP_EOL;

		foreach ( $row[ 1 ] as $pergunta ){
			$idr = sprintf( 'idr%d' , $pergunta->idPerguntas );
			$type = (int) $row[ 0 ]->multiplo ? 'checkbox' : 'radio';

			echo '<li>' , PHP_EOL;

			echo '<label for="' , $idr , '">' , PHP_EOL;
			echo '<span>' , $pergunta->pergunta , '</span>' , PHP_EOL;

			echo '<input id="' , $idr , '" type="' , $type , '" name="resposta[]" value="' , $pergunta->idPerguntas , '" />' , PHP_EOL;

			echo '</label>' , PHP_EOL;

			echo '</li>' , PHP_EOL;
		}

		echo '</ul>' , PHP_EOL;

		echo '<input type="submit" value="Votar" />' , PHP_EOL;
		echo '</form>' , PHP_EOL;
		echo '</div>' , PHP_EOL;
	}

}

public function showResults(){
	$enquete = null;
	$results = '<div id="resultados">' . PHP_EOL;
	$results .= '<strong>%s</strong>' . PHP_EOL;
	$results .= '<ul>' . PHP_EOL;

	foreach ( $this->model as $row ){
		if ( $enquete == null ) $enquete =& $row->titulo;

		$results .= '<li><span class="pergunta">' . $row->pergunta . '</span> -> <span class="votos">' . $row->votos . '</span></li>';
	}

	$results .= '</ul>' . PHP_EOL;
	$results .= '</div>' . PHP_EOL;

	printf( $results , $enquete );
}

public function showError( &$error ){
	printf( '<strong>%s</strong>' , $error );
}
}

 

Agora que já temos a View e a Model, precisamos da Controller que irá decidir qual ação tomar:

EnquetesController.php

require 'Model.php';
require 'EnquetesModel.php';
require 'EnquetesView.php';

class EnquetesController {
private $action = 'show';
private $model;

public function handle(){
	$this->model = new EnquetesModel();
	$this->view = new EnquetesView();

	try {
		switch ( $this->action ){
			case 'show':
				$model = array();

				foreach ( $this->model->getEnquetes() as $enquete ){
					$model[] = array( $enquete , $this->model->getPerguntas( $enquete->idEnquetes ) );
				}

				$this->view->setModel( $model );
				$this->view->show();

				break;
			case 'saveVote':
				if ( isset( $_POST[ 'resposta' ] ) ){
					foreach ( $_POST[ 'resposta' ] as $resposta ){
						if ( !$this->model->saveVote( $resposta ) ){
							throw new RuntimeException( 'Não foi possível salvar o voto, tente novamente.' );
						}
					}
				} else throw new RuntimeException( 'É necessário saber em qual pergunta foi votado.' );
			case 'showResults':
				if ( isset( $_POST[ 'enquete' ] ) ){
					$this->view->setModel( $this->model->getResults( $_POST[ 'enquete' ] ) );
					$this->view->showResults();
				} else throw new RuntimeException( 'Enquete não definida' );
				break;
			default:
				throw new RuntimeException( 'Ação inválida.' );
		}
	} catch ( Exception $e ){
		$this->view->showError( $e->getMessage() );
	}
}

public function setAction( $action ){
	switch ( $action ){
		case 'saveVote':
		case 'show':
		case 'showResults':
			$this->action =& $action;
			break;
		default:
			throw new InvalidArgumentException( 'Ação inválida.' );
	}
}
}

 

Agora para usar isso ai é só incluir os arquivos:

index.php

require 'EnquetesController.php';

$enquetes = new EnquetesController();

if ( isset( $_GET[ 'action' ] ) )
$enquetes->setAction( $_GET[ 'action' ] );

$enquetes->handle();

 

Está ai, você tem uma enquete agora, deixei de propósito os métodos para criar e editar enquetes e perguntas para você implementar na EnquetesModel, porém, caso tenha dúvidas em como fazer é só dar um toque.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Neto, muito obrigado pela dica, mas quanto a montar o sistema de enquete eu sei.

 

O problema é que eu não mecho com AJAX, para fazer com que haja o voto sem atualizar a página e também aquele botão que chama uma "próxima enquete" para responder.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que eu não mecho com AJAX, para fazer com que haja o voto sem atualizar a página e também aquele botão que chama uma "próxima enquete" para responder.

 

Nesse caso você vai precisar mudar sua View:

 

EnquetesView.php

class EnquetesView {
private $model = array();

public function setModel( array &$model ){
	$this->model =& $model;
}

private function header(){
	echo '<html>' , PHP_EOL;
	echo '<head>' , PHP_EOL;
	echo '<title>Enquetes</title>' , PHP_EOL;
	echo '<script type="text/javascript" src="jquery-1.3.2.min.js"></script>' , PHP_EOL;
	echo '<script type="text/javascript" src="enquetes.js"></script>' , PHP_EOL;
	echo '</head>' , PHP_EOL;
	echo '<body>' , PHP_EOL;
}

private function footer(){
	echo '</body>' , PHP_EOL;
	echo '</html>' , PHP_EOL;
}

public function show(){
	$this->header();

	foreach ( $this->model as $row ){
		echo '<div id="enquetes">' , PHP_EOL;
		echo '<form id="fEnquete" action="' , $_SERVER[ 'PHP_SELF' ] , '?action=saveVote" method="post">' , PHP_EOL;
		echo '<input id="enquete" type="hidden" name="enquete" value="' , $row[ 0 ]->idEnquetes , '" />' , PHP_EOL;
		echo '<strong>' , $row[ 0 ]->titulo , '</strong>' , PHP_EOL;
		echo '<ul>' , PHP_EOL;

		foreach ( $row[ 1 ] as $pergunta ){
			$idr = sprintf( 'idr%d' , $pergunta->idPerguntas );
			$type = (int) $row[ 0 ]->multiplo ? 'checkbox' : 'radio';

			echo '<li>' , PHP_EOL;

			echo '<label for="' , $idr , '">' , PHP_EOL;
			echo '<span>' , $pergunta->pergunta , '</span>' , PHP_EOL;

			echo '<input id="' , $idr , '" type="' , $type , '" name="resposta[]" value="' , $pergunta->idPerguntas , '" />' , PHP_EOL;

			echo '</label>' , PHP_EOL;

			echo '</li>' , PHP_EOL;
		}

		echo '</ul>' , PHP_EOL;

		echo '<input type="button" onclick="votar();" value="Votar" />' , PHP_EOL;
		echo '</form>' , PHP_EOL;
		echo '</div>' , PHP_EOL;
	}

	$this->footer();
}

public function showResults(){
	$enquete = null;
	$results = '<div id="enquetes">' . PHP_EOL;
	$results .= '<strong>%s</strong>' . PHP_EOL;
	$results .= '<ul>' . PHP_EOL;

	foreach ( $this->model as $row ){
		if ( $enquete == null ) $enquete =& $row->titulo;

		$results .= '<li><span class="pergunta">' . $row->pergunta . '</span> -> <span class="votos">' . $row->votos . '</span></li>';
	}

	$results .= '</ul>' . PHP_EOL;
	$results .= '</div>' . PHP_EOL;

	printf( $results , $enquete );
}

public function showError( $error ){
	echo '<div id="enquetes"><strong>' , $error , '</strong></div>';
}
}

 

Nesse método fazemos a inclusão do jQuery (jquery-1.3.2.min.js) que você encontra no site oficial e também do arquivo enquetes.js:

enquetes.js

function votar(){
	var action = $( '#fEnquete' ).attr( 'action' );
	var method = $( '#fEnquete' ).attr( 'method' );
	var obj = {};
	
	$( '#fEnquete input:checked' ).each( function(){
		obj[ $(this).attr( 'name' ) ] = $(this).val(); 
	} );
	
	obj.enquete = $( '#enquete' ).val();
	
	$.ajax( {
		type		: method,
		url			: action,
		data		: obj,
		async		: true,
		dataType	: "html",
		success		: function( msg ){
			$( 'div#enquetes' ).replaceWith( msg );
		}
	} );
}

Tai, agora a enquete funciona com Ajax, as outras duas classes ficam exatamente como estavam.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar uma estudada nesse seu código e tentar aprender.

 

Qualquer dúvida eu voltarei a postar aqui.

 

Muito obrigado mesmo! =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar uma estudada nesse seu código e tentar aprender.

 

Se for necessário, eu coloco o código em um link para download.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow, seria ótimo. Eu ia pedir, mas eu não quis pedir pra não parecer aquele típico chato que não quer quebrar a cabeça de fóruns! E eu não sou assim. :P

 

Mas se você botar o link aí, eu agradeço muito mesmo! Estou realmente precisando de uma enquete desse tipo, então pretendo estudá-la, para entender e assim poder desenvolver ou adaptá-la a qualquer site que eu precisar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow, seria ótimo. Eu ia pedir, mas eu não quis pedir pra não parecer aquele típico chato que não quer quebrar a cabeça de fóruns! E eu não sou assim. :P

http://joaoneto.com4.com.br/download/enquetes.tar.gz

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não adianta baixar a enquete do site passado pelo 11closed - http://www.dhtmlgood...ipt=ajax-poller

 

Pois está faltando arquivos em seu pacote além de estar corrompida. ico, na Orientação No. 2[/topic]. Siga as orientações desse tópico para postar sua dúvida

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.