Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
>
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.
;)
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.
>
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.
;)
Vou dar uma estudada nesse seu código e tentar aprender.
Qualquer dúvida eu voltarei a postar aqui.
Muito obrigado mesmo! =)
>
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.
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.
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
;)
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
Olá Diego segue um link com uma enquete parecida com a que você quer.
http://www.dhtmlgoodies.com/index.html?whichScript=ajax-poller
para baixala clique em Zip file.
e para velá funcionando clique em Demo.
Espero ter ajudado.
T+