Location: PHPKode > projects > MUSPA > modules/enquete/enquete.php
<?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&ccedil;&otilde;es",
				"descricao" => "Configura as se&ccedil;&otilde;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);
		}
	}

}




Return current item: MUSPA