From 5e218468d784bf58645e125aab59d6046c94fd1a Mon Sep 17 00:00:00 2001 From: Felipe Guaycuru Date: Thu, 8 Jun 2017 10:09:01 -0300 Subject: [PATCH] Enquetes funcionando! --- README.md | 2 +- ajax/enquete.php | 39 ++++++++ ajax/enquetes.php | 96 ++++++++++++++++++++ classes/GDE/Enquete.inc.php | 75 +++++++++++++++- classes/GDE/EnqueteOpcao.inc.php | 35 ++++++-- classes/GDE/Usuario.inc.php | 2 +- views/index.php | 13 ++- web/js/gde.42.js | 150 ++++++++++++++++--------------- 8 files changed, 328 insertions(+), 84 deletions(-) create mode 100644 ajax/enquete.php create mode 100644 ajax/enquetes.php diff --git a/README.md b/README.md index 6f1aa23..88c8b09 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Funciona: - Disciplina - Editar Perfil (pouco testada) - Eliminar Disciplinas + - Enquetes - Estatísticas (parcial) - Frase do Dia - Login @@ -56,7 +57,6 @@ Ainda não funciona: - Admin - API - Chat - - Enquetes P: E qual o prazo pra isso ser concluído? diff --git a/ajax/enquete.php b/ajax/enquete.php new file mode 100644 index 0000000..c49070b --- /dev/null +++ b/ajax/enquete.php @@ -0,0 +1,39 @@ +getID() == null) + Base::Error_JSON('Enquete não encontrada.'); + if(($Enquete->Ja_Votou($_Usuario)) || ($Enquete->getAtiva() === false)) + Base::Error_JSON('Você já votou nesta Enquete'); + elseif((($Enquete->getMax_Votos() > 1) && ((!isset($_POST['votos'])) || (!is_array($_POST['votos'])))) || (($Enquete->getMax_Votos() == 1) && ((!isset($_POST['voto'])) || ($_POST['voto'] == null)))) + Base::Error_JSON('Selecione pelo menos uma opção...'); + elseif((isset($_POST['votos'])) && (count($_POST['votos']) > $Enquete->getMax_Votos())) + Base::Error_JSON('Selecione no máximo '.$Enquete->getMax_Votos().(($Enquete->getMax_Votos() > 1)? ' opções' : ' opção').'...'); + else { + if($Enquete->getMax_Votos() == 1) { + $Opcao = EnqueteOpcao::Load($_POST['voto']); + if($Opcao->getID() == null) + Base::Error_JSON('Opção não encontrada.'); + if(($Opcao->getEnquete() === null) || ($Opcao->getEnquete()->getID()) != $Enquete->getID()) + Base::Error_JSON('Opção inválida.'); + $_Usuario->addEnquetes_Opcoes($Opcao); + } else { + foreach($_POST['votos'] as $id_opcao) { + $Opcao = EnqueteOpcao::Load($id_opcao); + if($Opcao->getID() == null) + Base::Error_JSON('Opção não encontrada.'); + if(($Opcao->getEnquete() === null) || ($Opcao->getEnquete()->getID()) != $Enquete->getID()) + Base::Error_JSON('Opção inválida.'); + $_Usuario->addEnquetes_Opcoes($Opcao); + } + } + $_Usuario->Save_JSON(true); + } +} diff --git a/ajax/enquetes.php b/ajax/enquetes.php new file mode 100644 index 0000000..0cbc7dc --- /dev/null +++ b/ajax/enquetes.php @@ -0,0 +1,96 @@ +Ja_Votou($_Usuario)) || ($Enquete->getAtiva() === false)); +?> + +
+ +
+ + + + + + + + + + + + + +Numero_Votos(); + $total_usuarios = $Enquete->Numero_Usuarios(); + foreach($Enquete->getOpcoes() as $Opcao) { + $votos = $Opcao->Numero_Votos(); + $porcentagem = $Opcao->Porcentagem(2); +?> + + + + + + + + + + + + + + + +getOpcoes() as $Opcao) { ?> + + + + + + + + + + + +
getPergunta(false); ?>
Opção + Votos + -
getOpcao(false); ?> (%)
Total de Votos: ( Usuários)
" class="opcao" name="getMax_Votos() > 1) ? "votos[]" : "voto"); ?>" value="getID(); ?>" id="opcao_getID(); ?>" />

+ Ver Resultados
+ +
+ +
Atualizar
+ +
diff --git a/classes/GDE/Enquete.inc.php b/classes/GDE/Enquete.inc.php index 5f9fe92..48f4584 100644 --- a/classes/GDE/Enquete.inc.php +++ b/classes/GDE/Enquete.inc.php @@ -7,7 +7,12 @@ /** * Enquete * - * @ORM\Table(name="gde_enquetes") + * @ORM\Table( + * name="gde_enquetes", + * indexes={ + * @ORM\Index(name="ativa", columns={"ativa"}) + * } + * ) * @ORM\Entity */ class Enquete extends Base { @@ -20,6 +25,13 @@ class Enquete extends Base { */ protected $id_enquete; + /** + * @var EnqueteOpcao + * + * @ORM\OneToMany(targetEntity="EnqueteOpcao", mappedBy="enquete") + */ + protected $opcoes; + /** * @var string * @@ -27,6 +39,13 @@ class Enquete extends Base { */ protected $nome; + /** + * @var string + * + * @ORM\Column(type="string", nullable=false) + */ + protected $chamada; + /** * @var string * @@ -55,5 +74,59 @@ class Enquete extends Base { */ protected $max_votos = 1; + /** + * @return Enquete|null + */ + public static function Ativa() { + $Enquetes = self::FindBy(array('ativa' => true), null, 1); + return (count($Enquetes) > 0) ? $Enquetes[0] : null; + } + + /** + * @param Usuario $Usuario + * @return integer + */ + public function Usuario_Quantos_Votos(Usuario $Usuario) { + $dql = "SELECT COUNT(O.id_opcao) FROM ".get_class()." AS E ". + "JOIN E.opcoes AS O ". + "WHERE E.id_enquete = :id_enquete ". + "AND :usuario MEMBER OF O.usuarios"; + return self::_EM()->createQuery($dql) + ->setParameter('id_enquete', $this->getID()) + ->setParameter('usuario', $Usuario) + ->getSingleScalarResult(); + } + + /** + * @param Usuario $Usuario + * @return bool + */ + public function Ja_Votou(Usuario $Usuario) { + return ($this->Usuario_Quantos_Votos($Usuario) > 0); + } + + /** + * @return integer + */ + public function Numero_Votos() { + $dql = "SELECT COUNT(U.id_usuario) FROM ".get_class()." AS E ". + "JOIN E.opcoes AS O JOIN O.usuarios AS U ". + "WHERE E.id_enquete = :id_enquete"; + return self::_EM()->createQuery($dql) + ->setParameter('id_enquete', $this->getID()) + ->getSingleScalarResult(); + } + + /** + * @return integer + */ + public function Numero_Usuarios() { + $dql = "SELECT COUNT(DISTINCT U.id_usuario) FROM ".get_class()." AS E ". + "JOIN E.opcoes AS O JOIN O.usuarios AS U ". + "WHERE E.id_enquete = :id_enquete"; + return self::_EM()->createQuery($dql) + ->setParameter('id_enquete', $this->getID()) + ->getSingleScalarResult(); + } } diff --git a/classes/GDE/EnqueteOpcao.inc.php b/classes/GDE/EnqueteOpcao.inc.php index 3aa75af..d5b1f23 100644 --- a/classes/GDE/EnqueteOpcao.inc.php +++ b/classes/GDE/EnqueteOpcao.inc.php @@ -2,6 +2,7 @@ namespace GDE; +use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** @@ -24,18 +25,20 @@ class EnqueteOpcao extends Base { * @var Enquete * * @ORM\ManyToOne(targetEntity="Enquete") - * @ORM\JoinColumns({ - * @ORM\JoinColumn(name="id_enquete", referencedColumnName="id_enquete") - * }) + * @ORM\JoinColumn(name="id_enquete", referencedColumnName="id_enquete") */ protected $enquete; /** - * @var \Doctrine\Common\Collections\Collection + * @var ArrayCollection|Usuario[] * * @ORM\ManyToMany(targetEntity="Usuario", mappedBy="enquetes_opcoes") + * @ORM\JoinTable(name="gde_r_usuarios_enquetes_opcoes", + * inverseJoinColumns={@ORM\JoinColumn(name="id_usuario", referencedColumnName="id_usuario")}, + * joinColumns={@ORM\JoinColumn(name="id_opcao", referencedColumnName="id_opcao")} + * ) */ - protected $usuario; + protected $usuarios; /** * @var string @@ -51,5 +54,27 @@ class EnqueteOpcao extends Base { */ protected $ativa = false; + /** + * @return integer + */ + public function Numero_Votos() { + $dql = "SELECT COUNT(DISTINCT U.id_usuario) FROM ".get_class()." AS O ". + "JOIN O.usuarios AS U ". + "WHERE O.id_opcao = :id_opcao"; + return self::_EM()->createQuery($dql) + ->setParameter('id_opcao', $this->getID()) + ->getSingleScalarResult(); + } + + /** + * @param int $decimais + * @return string + */ + public function Porcentagem($decimais = 2) { + $total_usuarios = $this->getEnquete()->Numero_Usuarios(); + return ($total_usuarios > 0) + ? number_format(($this->Numero_Votos() / $total_usuarios)*100, $decimais) + : '0.'.str_repeat('0', $decimais); + } } diff --git a/classes/GDE/Usuario.inc.php b/classes/GDE/Usuario.inc.php index 799a825..6c2de20 100644 --- a/classes/GDE/Usuario.inc.php +++ b/classes/GDE/Usuario.inc.php @@ -111,7 +111,7 @@ class Usuario extends Base { /** * @var ArrayCollection|EnqueteOpcao[] * - * @ORM\ManyToMany(targetEntity="EnqueteOpcao") + * @ORM\ManyToMany(targetEntity="EnqueteOpcao", inversedBy="usuarios") * @ORM\JoinTable(name="gde_r_usuarios_enquetes_opcoes", * joinColumns={@ORM\JoinColumn(name="id_usuario", referencedColumnName="id_usuario")}, * inverseJoinColumns={@ORM\JoinColumn(name="id_opcao", referencedColumnName="id_opcao")} diff --git a/views/index.php b/views/index.php index cc7da53..2a278ad 100644 --- a/views/index.php +++ b/views/index.php @@ -10,6 +10,12 @@ $Recomendacoes = $_Usuario->Amigos_Recomendacoes(2, 15); $Autorizacoes = $_Usuario->getAmigos_Pendentes(); +$_enquete = ''; +$Enquete = Enquete::Ativa(); +if($Enquete !== null) { + $_enquete = '
'.$Enquete->getChamada(true).' Clique aqui e dê sua opinião!
'; +} + // ToDo ? if(!isset($_SESSION['atualizacoes_last_id'])) $_SESSION['atualizacoes_last_id'] = 0; //Acontecimento::Ultimo_Id_Por_Data($_SESSION['ultimo_acesso']); @@ -241,7 +247,10 @@ $('#buscar_amigos1').Procura_Amigo('lista_amigos1'); $("a#enquete").fancybox({ 'hideOnContentClick': false, - 'autoDimensions': true + 'autoDimensions': true, + 'onComplete': function() { + $("#fancybox-content form.auto-form").each(auto_form_handler); + } }); $("#lista_amigos2 div.sliding_top").live("click", function() { Adicionar_Amigo_Sugestao(($(this).attr("id").split('_'))[1]); @@ -288,7 +297,7 @@ - +
    diff --git a/web/js/gde.42.js b/web/js/gde.42.js index 39a3c71..5a4d01a 100644 --- a/web/js/gde.42.js +++ b/web/js/gde.42.js @@ -16,86 +16,88 @@ var Logout = function() { return false; }; -$(document).ready(function() { - // Logout - $(".link_logout").click(Logout); - - // Auto Forms - $("form.auto-form").each(function() { - $(this).validate({ - submitHandler: function(form) { - $(form).find('button').prop('disabled', true); - var parse_res = function(res) { - if((typeof res !== 'object') || (res === null)) - res.ok = false; - if(res.ok) { - var msg = ($(form).data('sucesso')) ? $(form).data('sucesso') : 'Dados salvos com sucesso!'; - if(msg !== ' ') - alert(msg); - if(res.destino) - var destino = res.destino; - else if(!$(form).data('destino')) { - var destino = document.URL; - if(destino.charAt(destino.length-1) !== '/') - destino += '/'; - destino += res.id; - } else { - var destino = $(form).data('destino').replace('#ID#', res.id); - } - document.location = destino; +var auto_form_handler = function() { + $(this).validate({ + submitHandler: function(form) { + $(form).find('button').prop('disabled', true); + var parse_res = function(res) { + if((typeof res !== 'object') || (res === null)) + res.ok = false; + if(res.ok) { + var msg = ($(form).data('sucesso')) ? $(form).data('sucesso') : 'Dados salvos com sucesso!'; + if(msg !== ' ') + alert(msg); + if(res.destino) + var destino = res.destino; + else if(!$(form).data('destino')) { + var destino = document.URL; + if(destino.charAt(destino.length-1) !== '/') + destino += '/'; + destino += res.id; } else { - if(res.erro) - var msg = res.erro; - else if(res.error) - var msg = res.error; - else - var msg = 'Um erro ocorreu, por favor tente novamente.'; - if(res.destino) - var destino = res.destino; - else - var destino = null; - erro_comum($(form), msg, 'Erro:', true, destino); - $(form).find('button').prop('disabled', false); + var destino = $(form).data('destino').replace('#ID#', res.id); } - }; - var multipart = ($(form).find('input[type=file]').length > 0); - erro_comum_esconder(); - if(!multipart) { - $.post($(form).attr('action'), $(form).serialize(), parse_res) - .fail(function () { - parse_res(false); - }); + document.location = destino; } else { - var iframe_name = 'controle'; - $("#" + iframe_name).unbind('load'); - $("#" + iframe_name).bind('load', function() { - try { - parse_res($.parseJSON($(this).contents().text())); - } catch(err) { - parse_res({ok: false}); - } - }); - $(form).attr({ - enctype: "multipart/form-data", - encoding: "multipart/form-data", - target: iframe_name - }).get(0).submit(); - } - }, - invalidHandler: function(event, validator) { - // 'this' refers to the form - var errors = validator.numberOfInvalids(); - if(errors) { - var msg = (errors === 1) - ? 'Por favor verifique o campo destacado.' - : 'Por favor verifique os ' + errors + ' campos destacados.'; - erro_comum($(this), msg); - } else { - erro_comum_esconder(); + if(res.erro) + var msg = res.erro; + else if(res.error) + var msg = res.error; + else + var msg = 'Um erro ocorreu, por favor tente novamente.'; + if(res.destino) + var destino = res.destino; + else + var destino = null; + erro_comum($(form), msg, 'Erro:', true, destino); + $(form).find('button').prop('disabled', false); } + }; + var multipart = ($(form).find('input[type=file]').length > 0); + erro_comum_esconder(); + if(!multipart) { + $.post($(form).attr('action'), $(form).serialize(), parse_res) + .fail(function () { + parse_res(false); + }); + } else { + var iframe_name = 'controle'; + $("#" + iframe_name).unbind('load'); + $("#" + iframe_name).bind('load', function() { + try { + parse_res($.parseJSON($(this).contents().text())); + } catch(err) { + parse_res({ok: false}); + } + }); + $(form).attr({ + enctype: "multipart/form-data", + encoding: "multipart/form-data", + target: iframe_name + }).get(0).submit(); + } + }, + invalidHandler: function(event, validator) { + // 'this' refers to the form + var errors = validator.numberOfInvalids(); + if(errors) { + var msg = (errors === 1) + ? 'Por favor verifique o campo destacado.' + : 'Por favor verifique os ' + errors + ' campos destacados.'; + erro_comum($(this), msg); + } else { + erro_comum_esconder(); } - }); + } }); +}; + +$(document).ready(function() { + // Logout + $(".link_logout").click(Logout); + + // Auto Forms + $("form.auto-form").each(auto_form_handler); }); jQuery.extend(jQuery.validator.messages, {