<?php
/*******************************************************************************
* MUSPA
*
* Copyright (C) 2004 MUSPA Project
*
* Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
* sob os termos da Licença Pública Geral GNU conforme publicada pela Free
* Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
* qualquer versão posterior.
*
* Este programa é distribuído na expectativa de que seja útil, porém, SEM
* NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
* ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do
* GNU para mais detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto com
* este programa; se não, escreva para a Free Software Foundation, Inc., no
* endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
*
*******************************************************************************/
define("ENQUETE_PER_PAGE", 20);
/**
* Modulo Enquete
*/
class Enquete extends admin
{
var $restriction;
/**
* Nome do módulo
*/
function moduleName()
{
return "Enquete";
}
/**
* Descrição do módulo
*/
function moduleDescription()
{
return "Gerênciador de enquetes.";
}
/**
* Meu lindo nome.
*/
function author()
{
return "Hugo P.L.";
}
/**
* Versão do módulo
*/
function version()
{
return "0.5";
}
/**
* Lista de submódulos
*/
function subModules()
{
return array(
array(
"nome" => "Listar",
"descricao" => "Lista as enquetes",
"link" => "?m=enquete&action=listar",
"privs" => PRIV_NORMAL
),
array(
"nome" => "Cadastrar",
"descricao" => "Cadastra uma enquete",
"link" => "?m=enquete&action=showcadastro",
"privs" => PRIV_NORMAL
),
array(
"nome" => "Config Seções",
"descricao" => "Configura as seções de enquete.",
"link" => "?m=enquete&action=showconfigsecao",
"privs" => PRIV_ADMIN
)
);
}
function run()
{
if ($this->aUser['privs'] == PRIV_ADMIN)
$this->restriction = "1";
else
$this->restriction = "FIND_IN_SET(".$this->aUser['id'].", S.users)";
if (!isset($_GET['action'])) // default opt.
$_GET['action'] = null;
switch($_GET['action'])
{
// Cadastro
case 'cadastrar':
$this->cadastrar();
break;
case 'showcadastro':
$this->showCadastro();
break;
case 'cadastrook':
$this->setCaption('Enquete cadastrada');
$this->tmpl->readTemplatesFromFile('modules/enquete/templates/cadastrook.htm');
break;
// Configuração de seção
case 'showconfigsecao':
$this->showConfigSecao();
break;
// Listar
default:
case 'listar':
$this->listar();
break;
}
$this->tmpl->displayParsedTemplate();
}
/**
* Regras do formulario
*/
function rules()
{
return array(
array('secao', 'seção', FRM_OBRIGATORIO, "/^[0-9]+$/"),
array('pergunta', 'pergunta', FRM_OBRIGATORIO),
array('respostas', 'respostas', FRM_OBRIGATORIO),
array('dataend', 'data do término', FRM_DATA | FRM_OPCIONAL),
array('visible', 'enquete visível', FRM_OPCIONAL, "/^1$/")
);
}
/**
* Apaga uma enquete dado um ID ou uma lista de ID's
* @param id ID ou lista de ID'd separados por ","
* @param multipleids No param. id tem uma lista de ID's?
*/
function apagarEnquete($id, $multipleids = false)
{
$where = "";
if ($multipleids)
$where = " IN (".$id.") ";
else
$where = "= ".((int)$id)." ";
// Funciona apenas para mysql 4.0.0 !
$this->db->query("DELETE ".PRE_TABLE."enquete_enquetes FROM "
.PRE_TABLE."enquete_enquetes E, "
.PRE_TABLE."enquete_secoes S "
." WHERE E.id ".$where." AND "
." E.secao = S.id AND ".$this->restriction,
__FILE__, __LINE__);
// Apaga todas as respostas da enquete
$this->db->query("DELETE FROM ".PRE_TABLE."enquete_respostas WHERE "
." enquete ".$where, __FILE__, __LINE__);
}
/**
* Lista as enquetes
*/
function listar()
{
if (isset($_GET['subaction']) && isset($_POST['enquete']))
{
$aIds = array();
foreach ($_POST['enquete'] as $id)
{
$id = (int) $id;
if ($id)
$aIds[] = $id;
}
if (sizeof($aIds))
{
$ids = implode(', ', $aIds);
$query = "";
switch ($_GET['subaction'])
{
case 'show':
$query = "UPDATE ".PRE_TABLE."enquete_enquetes E, "
.PRE_TABLE."enquete_secoes S SET "
." E.visible='Y' WHERE E.id IN (".$ids.") AND "
." E.secao = S.id AND ".$this->restriction;
break;
case 'hidden':
$query = "UPDATE ".PRE_TABLE."enquete_enquetes E, "
.PRE_TABLE."enquete_secoes S SET "
." E.visible='N' WHERE E.id IN (".$ids.") AND "
." E.secao = S.id AND ".$this->restriction;
break;
case 'del':
$this->apagarEnquete($ids, true);
break;
}
if ($query)
$this->db->query($query, __FILE__, __LINE__);
header("Location: ?m=enquete&action=listar");
exit;
}
}
$this->setCaption("Listando enquete(s)");
$this->tmpl->readTemplatesFromFile('modules/enquete/templates/listar.htm');
// Paginação
// Conta o total de enquetes para fazer a paginação
$this->db->query("SELECT count(E.id) "
." FROM ".PRE_TABLE."enquete_enquetes E, ".PRE_TABLE."enquete_secoes S"
." WHERE ".$this->restriction." AND E.secao = S.id"
,__FILE__, __LINE__);
$total = (int) $this->db->result(0, 0);
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if (!$page)
$page = 1;
// Verifica se vai existir os botões de Próx. Pág. e Pág. Anterior
if ($page > 1)
{
// tem pág. anterior
$this->tmpl->setAttribute('prevpage', 'visibility', 'show');
$this->tmpl->addVar('prevpage', 'LINK',
'?m=enquete&action=listar&page='.($page-1));
}
if (($page*ENQUETE_PER_PAGE) < $total)
{
// tem próx. pág.
$this->tmpl->setAttribute('nextpage', 'visibility', 'show');
$this->tmpl->addVar('nextpage', 'LINK',
'?m=enquete&action=listar&page='.($page+1));
}
$this->tmpl->addVar('lista', 'PAGE', $page."/".ceil($total/ENQUETE_PER_PAGE) );
// Pega todas as enquetes que o usuário pode manusear
$rResult = $this->db->query("SELECT E.id, E.pergunta, S.nome AS secao, "
." E.visible,"
." DATE_FORMAT(E.datastart, '".SQL_DATETIMEFORMAT."') AS inicio,"
." DATE_FORMAT(E.dataend, '".SQL_DATETIMEFORMAT."') AS fim"
." FROM ".PRE_TABLE."enquete_enquetes E, ".PRE_TABLE."enquete_secoes S"
." WHERE E.secao = S.id AND ".$this->restriction
." ORDER BY E.datastart DESC"
." LIMIT ".(($page-1)*ENQUETE_PER_PAGE).", ".ENQUETE_PER_PAGE
,__FILE__, __LINE__);
if (!$this->db->numRows())
{
$this->tmpl->setAttribute('semenquete', 'visibility', 'show');
$this->tmpl->setAttribute('lista', 'visibility', 'hidden');
}
else
{
$aEnquete = array();
while($row = $this->db->fetchAssoc($rResult))
{
$aEnquete['ID'][] = $row['id'];
$aEnquete['PERGUNTA'][] = $row['pergunta'];
$aEnquete['SECAO'][] = $row['secao'];
$aEnquete['INICIO'][] = $row['inicio'];
$aEnquete['FIM'][] = $row['fim'];
$aEnquete['VISIBLE'][] = ($row['visible'] == "Y") ? 'v.gif' : 'px.gif';
$this->db->query("SELECT resposta, count FROM ".PRE_TABLE."enquete_respostas"
." WHERE enquete=".$row['id']);
$count = 0;
$aAux = array();
while( $row2 = $this->db->fetchAssoc())
{
$aAux[] = array($row2['resposta'], $row2['count']);
$count += (int)$row2['count'];
}
$aEnquete['VOTOS'][] = $count;
$aResposta = array();
foreach($aAux as $resposta)
{
$aResposta['RESPOSTA'][] = $resposta[0];
$aResposta['COUNT'][] = $resposta[1];
$perc = ($count) ? 100.0 * ((float)$resposta[1])/$count : 0.00;
$aResposta['WIDTH'][] = (int)$perc;
$aResposta['PERC'][] = round($perc, 2);
}
$this->tmpl->addVars('respostas', $aResposta);
$aEnquete['RESULTADO'][] = addcslashes(htmlspecialchars($this->tmpl->getParsedTemplate('respostas')), "\n\r");
$this->tmpl->clearTemplate('respostas');
}
$this->tmpl->addVars('noticia', $aEnquete);
}
}
/**
* Mostra o formulario
* @param $aValues Dados do formualrio
*/
function displayForm(&$aValues)
{
$this->tmpl->readTemplatesFromFile("modules/enquete/templates/formulario.htm");
// Pega todas as seções
$this->db->query("SELECT S.id, S.nome FROM ".PRE_TABLE."enquete_secoes S"
." WHERE ".$this->restriction, __FILE__, __LINE__);
if (!$this->db->numRows())
{
header("Location: ?m=enquete&action=showconfigsecao");
exit;
}
$aSecoes = array();
while($row = $this->db->fetchAssoc())
{
$aSecoes['ID'][] = $row['id'];
$aSecoes['NOME'][] = $row['nome'];
if (!isset($aValues['secao']))
$aSecoes['SELECTED'][] = '';
else
$aSecoes['SELECTED'][] = ($aValues['secao'] == $row['id']) ?
'selected="selected"' : '';
}
$this->tmpl->addVars('secoes', $aSecoes);
if (isset($aValues['visible']))
$aValues['visible'] = ($aValues['visible']) ? 'checked="checked' : '';
$this->tmpl->addVars('formulario', $aValues);
}
/**
* Mostra tela de cadastro da enquete
*/
function showCadastro()
{
$this->setCaption("Cadastrando enquete");
$this->tmpl->readTemplatesFromFile("modules/enquete/templates/cadastrar.htm");
$aData['visible'] = true;
$this->displayForm($aData);
}
/**
* Cadastra a enquete
*/
function cadastrar()
{
$res = CheckForm($_POST, $this->rules());
if ($res === true) // Tudo Ok, cadastre!
{
$dataend = isset($_POST['sql_dataend']) ? "'".$_POST['sql_dataend']."'"
: 'NULL';
// Cadastra a pergunta
$this->db->query("INSERT INTO ".PRE_TABLE."enquete_enquetes "
."(datastart, dataend, user, visible, secao, pergunta) VALUES ("
."NOW(), "
.$dataend.", "
.$this->aUser['id'].", "
.$_POST['visible'].", "
.$_POST['secao'].", "
."'".$this->db->escapeHTMLString($_POST['pergunta'])."'"
.");", __FILE__, __LINE__);
// Cadastra as respostas
$enqueteid = $this->db->insertedId();
$aRespostas = explode("\r\n", $_POST['respostas']);
foreach($aRespostas as $resposta)
{
$this->db->query("INSERT INTO ".PRE_TABLE."enquete_respostas "
."(enquete, resposta) VALUES("
.$enqueteid.", "
."'".$this->db->escapeHTMLString($resposta)."'"
.");", __FILE__, __LINE__);
}
header("Location: ?m=enquete&action=cadastrook");
exit;
}
else
{
$this->tmpl->readTemplatesFromFile('modules/enquete/templates/cadastrar.htm');
$this->tmpl->setAttribute('error', 'visibility', 'show');
$this->tmpl->addVars('error', $res);
$this->displayForm($_POST);
}
}
function showConfigSecao()
{
$this->setCaption('Configurando seções');
$this->tmpl->readTemplatesFromFile('./modules/enquete/templates/secoes.htm');
$this->db->query('SELECT S.id, S.nome, U.user FROM '.PRE_TABLE.'enquete_secoes S, '
.PRE_TABLE.'users U WHERE FIND_IN_SET(U.id, S.users)');
if (!$this->db->numRows())
{
$this->tmpl->setAttribute('semsecao', 'visibility', 'show');
$this->tmpl->setAttribute('listsecao', 'visibility', 'hidden');
}
else
{
$aSecoes = array();
while ($row = $this->db->fetchAssoc())
{
$aSecoes['ID'][] = $row['id'];
$aSecoes['SECAO'][] = $row['nome'];
$aSecoes['USERS'][] = $row['user'];
}
$this->tmpl->addVars('secao', $aSecoes);
}
}
}