Location: PHPKode > projects > MUSPA > muspa/modules/noticia/noticia.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.
*
* $Id: noticia.php,v 1.9 2004/06/19 21:36:13 hugo_pl Exp $
*******************************************************************************/

// Obs.: Toda constante definida nos modulos deve começar com
// o nome do modulo.

//	Número de notícias exibidas por página
define('NOTICIA_PER_PAGE', 20);

// Diretório onde ficarão as imagens uplodeadas (APENAS AS PERMANENTES!)
define('NOTICIA_UPLOADDIR', 'modules/noticia/imagens/');


/**
*	Modulo Noticia
*
*	Possivéis variaveis na seção:
*
*	id				ID da notícia que está sendo editada.
*	imagens			Array com nome e url das imagens temporarias.
*
*/
class Noticia extends Admin
{
	/**
	*	String usada nas queries para restringir acesso a nóticias que não pertencem a este usuário
	*/
	var $restriction;

	/**
	*	Nome do módulo
	*/
	function moduleName()
	{
		return 'Notícias';
	}

	/**
	*	Descrição do modulo
	*/
	function moduleDescription()
	{
		return 'Gerênciador de notícias.';
	}

	/**
	*	Meu lindo nome.
	*/
	function author()
	{
		return 'Hugo P.L.';
	}

	/**
	*	Versão do módulo
	*/
	function version()
	{
		return '1.0';
	}

	/**
	*	Lista de submodulos
	*/
	function subModules()
	{
		return array(
			array(
				'nome' => 'Listar',
				'descricao' => 'Lista as notícias',
				'link' => '?m=noticia&action=listar',
				'privs' => PRIV_NORMAL
			),
			array(
				'nome' => 'Cadastrar',
				'descricao' => 'Cadastra uma notícia',
				'link' => '?m=noticia&action=showcadastro',
				'privs' => PRIV_NORMAL
			),
			array(
				'nome' => 'Seções/Modelos',
				'descricao' => 'Configura as seções de notícia',
				'link' => '?m=noticia&action=secoesmodelos',
				'privs' => PRIV_ADMIN
			),
			array(
				'nome'	=>	'CSS\\\'s',
				'descricao' => 'Configura CSS\\\\\'s disponíveis para as notícias',
				'link' => '?m=noticia&action=css',
				'privs' => PRIV_ADMIN
			)
		);
	}

	/**
	*	Retorna a array com as regras para o formulário
	*/
	function rules()
	{
		return array(
			array('secao', 'seção', FRM_OBRIGATORIO, "/^[0-9]+$/"),
			array('modelo', 'modelo', FRM_OBRIGATORIO, "/^[0-9]+$/"),
			array('olho', 'olho', FRM_OPCIONAL),
			array('titulo', 'título', FRM_OBRIGATORIO),
			array('fonte', 'fonte', FRM_OPCIONAL),
			array('minitexto', 'mini texto', FRM_OBRIGATORIO),
			array('capaimg', 'imagem da capa', FRM_OPCIONAL),
			array('datahora', 'data', FRM_DATA | FRM_OBRIGATORIO),
			array('fixed', 'fixar notícia', FRM_OPCIONAL, "/^1$/"),
			array('visible', 'notícia visível', FRM_OPCIONAL, "/^1$/"),
			array('conteudo', 'conteudo', FRM_OBRIGATORIO),
		);
	}

	/**
	*	Executa o modulo.
	*/
	function run()
	{
		if ($this->aUser['privs'] == PRIV_ADMIN)
			$this->restriction = '1';
		else
			$this->restriction = 'FIND_IN_SET('.$this->aUser['id'].', S.users)';

		$template = null;
		if (!isset($_GET['action']))	// default opt.
			$_GET['action'] = null;


		switch($_GET['action'])
		{
			// Cadastro de notícias
			case 'showcadastro':	// Mostra form. de cadastro
				$this->setCaption('Cadastrando uma notícia');
				$this->tmpl->readTemplatesFromFile('modules/noticia/templates/cadastrar.htm');
				if (isset($_SESSION['noticia']['id']))
					unset($_SESSION['noticia']['id']);
				$aParam = array();
				$aParam['datahora'] = date('d\/m\/Y H:i');
				$aParam['visible'] = 1;
				$this->displayForm($aParam);
				break;
			case 'cadastrar':		// Cadastra uma noticia
				$this->setCaption('Cadastrando uma notícia');
				$this->cadastrar();
				break;
			case 'cadastrook':		// noticia cadastrada
				$this->setCaption('Cadastrando uma notícia');
				$this->tmpl->readTemplatesFromFile('modules/noticia/templates/mensagemfinal.htm');
				break;

			// Edição de notícias
			case 'showeditar':		// Mostra form para editar uma noticia
				$this->setCaption('Editando uma notícia');
				$this->showEditar();
				break;
			case 'editar':			// Edita uma noticia
				$this->setCaption('Editando uma notícia');
				$this->editar();
				break;

			// Configuração de seções e modelos
			case 'secoesmodelos':	// Mostra lista de seções e modelos
				$this->listSecoesModelos();
				break;
			case 'showeditsecao':	// Mostra formulario para editar seção/apaga seção
				$this->showEditSecao();
				break;
			case 'shownovasecao':	// Mostra formulario para criar uma nova seção.
				$this->showNovaSecao();
				break;
			case 'showeditmodelo':	// Mostra formulairo editar um modelo/apagar modelo
				$this->showEditModelo();
				break;
			case 'shownovomodelo':	// Mostra formulario para criar um novo modelo
				$this->showNovoModelo();
				break;

			// Casos especiais
			case 'addimage':		// Popup de adicionar imagem a notícia.
				$this->addImage();
				$template = 'addimage';
				break;
			case 'uploadimage':		// Popup para enviar imagem
				$this->uploadImage();
				$template = 'uploadimage';
				break;

			// Setup CSS
			case 'css':
				$this->setupCSS();
				break;


			// Padrão: listar notícias
			case 'listar':
			default:
				$this->setCaption('Listando notícia(s)');
				$this->listar();
		}
		$this->display($template);
	}

	/**
	*	Apaga uma notícia 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 apagarNoticia($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.'noticia_noticias FROM '
				.PRE_TABLE.'noticia_noticias N, '
				.PRE_TABLE.'noticia_secoes S '
				.' WHERE N.id '.$where.' AND '
				.' N.secao = S.id AND '.$this->restriction,
				__FILE__, __LINE__);
		// Apaga todos os comentários desta notícia
		$this->db->query('DELETE FROM '.PRE_TABLE.'noticia_comentarios WHERE '
				.'noticia '.$where,
				__FILE__, __LINE__);
		// Seleciona todas as imagens da noticia
		$this->db->query('SELECT url FROM '.PRE_TABLE.'noticia_imagens WHERE '
				.' noticia '.$where, __FILE__, __LINE__);
		while($row = $this->db->fetchAssoc())
			@unlink($row['url']);

		// Apaga as imagens do banco de dados
		$this->db->query('DELETE FROM '.PRE_TABLE.'noticia_imagens WHERE '
				.' noticia '.$where, __FILE__, __LINE__);
	}

	/**
	*	Lista as noticias
	*/
	function listar()
	{
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/listar.htm');

		if (isset($_GET['subaction']) && isset($_POST['noticia']))
		{
			$aIds = array();

			foreach ($_POST['noticia'] as $id)
			{
				$id = (int) $id;
				if ($id)
					$aIds[] = $id;
			}
			if (sizeof($aIds))
			{
				$ids = implode(', ', $aIds);
				$query = "";

				switch ($_GET['subaction'])
				{
					case 'fix':
						$query = 'UPDATE '.PRE_TABLE.'noticia_noticias N, '
							.PRE_TABLE.'noticia_secoes S SET '
							.' N.fixed="Y" WHERE N.id IN ('.$ids.') AND '
							.' N.secao = S.id AND '.$this->restriction;
						break;
					case 'unfix':
						$query = 'UPDATE '.PRE_TABLE.'noticia_noticias N, '
							.PRE_TABLE.'noticia_secoes S SET '
							.' N.fixed="N" WHERE N.id IN ('.$ids.') AND '
							.' N.secao = S.id AND '.$this->restriction;
						break;
					case 'visible':
						$query = 'UPDATE '.PRE_TABLE.'noticia_noticias N, '
							.PRE_TABLE.'noticia_secoes S SET '
							.' N.visible="Y" WHERE N.id IN ('.$ids.') AND '
							.' N.secao = S.id AND '.$this->restriction;
						break;
					case 'invisible':
						$query = 'UPDATE '.PRE_TABLE.'noticia_noticias N, '
							.PRE_TABLE.'noticia_secoes S SET '
							.' N.visible="N" WHERE N.id IN ('.$ids.') AND '
							.' N.secao = S.id AND '.$this->restriction;
						break;
					case 'del':
						$this->apagarNoticia($ids, true);
						break;
				}
				if ($query)
					$this->db->query($query, __FILE__, __LINE__);

				header('Location: ?m=noticia&action=listar');
				return;
			}
		}


		// Conta o total de noticias para fazer a paginação
		$this->db->query('SELECT count(N.id) '
			.' FROM '.PRE_TABLE.'noticia_noticias N, '.PRE_TABLE.'noticia_secoes S'
			.' WHERE N.secao = S.id AND '.$this->restriction
			,__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=noticia&action=listar&page='.($page-1));
		}
		if (($page*NOTICIA_PER_PAGE) < $total)
		{
			// tem próx. pág.
			$this->tmpl->setAttribute('nextpage', 'visibility', 'show');
			$this->tmpl->addVar('nextpage', 'LINK',
							'?m=noticia&action=listar&page='.($page+1));
		}
		$this->tmpl->addVar('lista', 'PAGE', $page."/".ceil($total/NOTICIA_PER_PAGE) );


		// Seleciona apenas as noticias em seções que o usuário pode
		// mecher.
		$this->db->query('SELECT N.id, N.titulo, S.nome AS secao, '
			.' N.fixed, N.visible,'
			.' DATE_FORMAT(N.datahora, "'.SQL_DATETIMEFORMAT.'") AS datahora'
			.' FROM '.PRE_TABLE.'noticia_noticias N, '.PRE_TABLE.'noticia_secoes S'
			.' WHERE N.secao = S.id AND '.$this->restriction
			.' ORDER BY N.fixed, N.datahora DESC'
			.' LIMIT '.(($page-1)*NOTICIA_PER_PAGE).', '.NOTICIA_PER_PAGE
			,__FILE__, __LINE__);

		if (!$this->db->numRows())
		{
			$this->tmpl->setAttribute('semnoticia', 'visibility', 'show');
			$this->tmpl->setAttribute('lista', 'visibility', 'hidden');
		}
		else
		{
			$aNoticias = array();
			while($row = $this->db->fetchAssoc())
			{
				$aNoticias['ID'][] = $row['id'];
				$aNoticias['TITULO'][] = $row['titulo'];
				$aNoticias['SECAO'][] = $row['secao'];
				$aNoticias['DATA'][] = $row['datahora'];
				$aNoticias['FIXED'][] = ($row['fixed'] == 'Y') ? 'v.gif' : 'px.gif';
				$aNoticias['VISIBLE'][] = ($row['visible'] == 'Y') ? 'v.gif' : 'px.gif';
				$aNoticias['LINK'][] = '?m=noticia&amp;action=showeditar&amp;id='.$row['id'];
			}
			$this->tmpl->addVars('noticia', $aNoticias);
		}
	}

	/**
	*	Pega a lista de imagens da noticia e retorna em uma array ala patTemplate
	*	@param	$id			ID da imagem que estará selecionada
	*	@param	$noticia	ID da noticia que tem imagens, se "false", pegará apenas as imagens temporarias.
	*	@param	$sizeinurl	Coloca a largura e altura da imagem no final da url separados por '|'
	*/
	function getImageList($id = null, $noticia = false, $sizeinurl = false)
	{
		// Adiciona a lista de imagens que esta no cache
		$aImagens = array();
		if (isset($_SESSION['noticia']['imagens']))
			if (count($_SESSION['noticia']['imagens']))
				foreach($_SESSION['noticia']['imagens'] as $imagem)
				{
					if ($sizeinurl)
					{
						$aInfo = GetImageSize($imagem['url']);
						$aImagens['URL'][] = $imagem['url'].'|'.$aInfo[0].'|'.$aInfo[1];
					}
					else
						$aImagens['URL'][] = $imagem['url'];
					$aImagens['NOME'][] = $imagem['nome'];
					$aImagens['SELECTED'][] = '';
				}
		// Adiciona lista de imagens da notícia
		if ($noticia)
		{
			$this->db->query('SELECT id, nome, url FROM '.PRE_TABLE.'noticia_imagens '
					.' WHERE noticia='.$noticia, __FILE__, __LINE__);
			while($row = $this->db->fetchAssoc())
			{
				if ($sizeinurl)
				{
					$aInfo = GetImageSize('modules/noticia/imagens/'.$row['url']);
					$aImagens['URL'][] = $row['url'].'|'.$aInfo[0].'|'.$aInfo[1];
				}
				else
					$aImagens['URL'][] = $row['url'];
				$aImagens['NOME'][] = $row['nome'];
				$aImagens['SELECTED'][] = ($row['id'] == $id) ? 'selected="selected"' : '';
			}
		}
		return $aImagens;
	}

	/**
	*	Mostra popup para adicionar uma imagem ao conteudo da noticia
	*	@access	private
	*/
	function addImage()
	{
		// Template do popup
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/addimage.htm');

		$id = isset($_SESSION['noticia']['id']) ? $_SESSION['noticia']['id'] : false;
		$aImagens = $this->getImageList( null, $id, true );

		if (count($aImagens))
			$this->tmpl->addVars('imagens', $aImagens);
		else
			$this->tmpl->setAttribute('imagens', 'visibility', 'hidden');
	}


	/**
	*	Popup para upload de imagens ao sistema
	*/
	function uploadImage()
	{
		// Template do popup
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/uploadimage.htm');


		if (isset($_FILES['img']))
		{
			if ($_FILES['img']['error'])
				$error = "Houve um erro enquanto você enviava a imagem.";
			elseif ($_FILES['img']['type'] == 'image/gif' ||
				$_FILES['img']['type'] == 'image/jpeg' ||
				$_FILES['img']['type'] == 'image/pjpeg' ||
				$_FILES['img']['type'] == 'image/png')
			{
				if (is_uploaded_file($_FILES['img']['tmp_name']))
				{
					$url = sess_CreateFileName($_FILES['img']['name']);
					move_uploaded_file($_FILES['img']['tmp_name'], $url);
					chmod($url, 0644);
					$_SESSION['noticia']['imagens'][] = array(
							'nome'=> $_FILES['img']['name'],
							'url'=> $url
							);
				}
				$this->tmpl->setAttribute('body', 'visibility', 'hidden');
				$this->tmpl->setAttribute('uploaddone', 'visibility', 'show');
				$this->tmpl->addVar('uploaddone', 'NOME', $_FILES['img']['name']);
				$this->tmpl->addVar('uploaddone', 'URL', $url);
				$aInfo = GetImageSize($url);
				$this->tmpl->addVar('uploaddone', 'WIDTH', $aInfo[0]);
				$this->tmpl->addVar('uploaddone', 'HEIGHT', $aInfo[1]);
				return;
			}
			else
				$error = 'Você só pode enviar imagens nos formatos GIF, JPG ou PNG.';
		}

		if (isset($error))
		{
			$this->tmpl->setAttribute('error', 'visibility', 'show');
			$this->tmpl->addVar('error', 'ERROR', $error);
		}
	}

	/**
	*	Mostra o formulario de cadastro de noticias
	*	@param	Array com dados do formulario
	*/
	function displayForm( &$aValues )
	{
		// Carrega os templates
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/formulario.htm');
		$this->tmpl->readTemplatesFromFile('sys/templates/editor.htm');

		if (isset($aValues['fixed']))
			$aValues['fixed'] = ($aValues['fixed']) ? 'checked="checked' : '';
		if (isset($aValues['visible']))
			$aValues['visible'] = ($aValues['visible']) ? 'checked="checked' : '';

		$this->tmpl->addVars('formulario', $aValues);

		/// Lista de seções disponiveis
		$this->db->query('SELECT id, nome, modelos '
			.' FROM '.PRE_TABLE.'noticia_secoes '
			.' WHERE INSTR(users, "'.$this->aUser['id'].'")', __FILE__, __LINE__);

		// Monta JS Array e patTemplate Var
		$aSecoes = array();
		$strSecoes = "[\n";
		while ($row = $this->db->fetchAssoc())
		{
			$aSecoes['ID'][] = $row['id'];
			$aSecoes['NOME'][] = $row['nome'];
			if (!isset($aValues['secao']))
				$aSecoes['SELECTED'][] = '';
			else
				$aSecoes['SELECTED'][] = ($row['id'] == $aValues['secao']) ?
												'selected="selected"' : "";
			$strSecoes .= "\t[ ".$row['id'].", [".$row['modelos']."] ],\n";
		}
		$strSecoes = rtrim($strSecoes, ",\n")."\n]";
		$this->tmpl->addVar('formulario', 'SECOESARRAY', $strSecoes);
		$this->tmpl->addVars('secoes', $aSecoes);
		/**            ---              **/


		/** Monta JS Array de todos os Modelos */
		$this->db->query("SELECT id, nome, html "
			." FROM ".PRE_TABLE."noticia_modelos "
			, __FILE__, __LINE__);
		$modelos = "[\n";
		// Monta a array do JavaScript
		while ($row = $this->db->fetchAssoc())
		{
			if (isset($aValues['modelo']))
				$selected = $aValues['modelo'] ? 'true' : 'false';
			else
				$selected = '';
			$modelos .= "\t[ ".$row['id'].", '".$row['nome']."', ".$selected." ],\n";
		}
		$modelos = rtrim($modelos, ",\n")."\n]";
		$this->tmpl->addVar('formulario', 'MODELOSARRAY', $modelos);
		/**            ---              **/

		/** Adiciona lista de CSS's disponiveis */
		$this->db->query('SELECT nome FROM '.PRE_TABLE.'noticia_csss ORDER BY nome');
		if ($this->db->numRows())
		{
			$aCss = array();
			while($row = $this->db->fetchAssoc())
			{
				$aCss[] = '"'.$row['nome'].'" : "'.$row['nome'].'"';
			}
			$this->tmpl->addVar('head', 'CSS', ', '.implode(', ', $aCss));
		}

		/**            ---              **/


		// Adiciona as imagens que podem ser usadas na Capa
		$imgid =  isset($aValues['capaimg']) ? $aValues['capaimg'] : null;
		$notid = isset($aValues['id']) ? $aValues['id'] : false;
		$aImagens = $this->getImageList($imgid, $notid);
		if (count($aImagens))
			$this->tmpl->addVars('capaimg', $aImagens);
		else
			$this->tmpl->setAttribute('capaimg', 'visibility', 'hidden');

	}

	/**
	*	Copia uma imagem para a pasta de imagens e apaga ela da
	*	lista de imagens temporarias.
	*	@param	$img	Caminho completo da imagem temporaria
	*	@returns	Nome do arquivo da imagem
	*/
	function copyImage($img)
	{
		// cria um nome randômico para
		$url = UniqFileName(NOTICIA_UPLOADDIR);
		copy($img, $url);
		chmod($url, 0666);
		unlink($img);

		// Depois de gravar a imagem, apaga ela da lista de imagens temporarias.
		foreach($_SESSION['noticia']['imagens'] as $key=>$value)
			if ($value['url'] == $img)
			{
				unset($_SESSION['noticia']['imagens'][$key]);
				break;
			}
		return basename($url);
	}

	/**
	*	Identifica imagens no conteudo da noticia ($conteudo), inserindo-as
	*	ao banco de dados como pertencentes a noticia de Id = $notid
	*	@param	$conteudo		Texto de onde serão extraidas as imagens
	*	@param	$notid			Noticia a qual as imagens extraidas irão pertencer
	*	@return Translation table, uma array associativa com 'nometemp da img' => 'id da img' de
	*			todas as imagens adicionadas ao banco de dados.
	*/
	function readImages(&$conteudo, $notid = '0')
	{
		// TransTable, basename => ImgId
		$aTransTable = array();

		// Caso no conteudo tenha o texto {IMGPATH}, substitui-se pelo mesmo texto coded em HTML
		$conteudo = str_replace('{IMGPATH}', '&#123;IMGPATH&#125;', $conteudo);

		// Identifica as imagens no corpo da mensagem
		$res = array();
		if (preg_match_all("/src=\"(.*)\"/Ui", $conteudo, $res))
		{
			// para cada imagem encontrada...
			$aFiles = array();
			foreach($res[1] as $img)
			{
				$basename = basename($img);
				if (!isset($aFiles[$basename]))	// se ja não foi "parseada"
				{
					// Verifica se ela é uma img temporária
					if (strpos($basename, 'sess'.session_id().'_') === 0)
					{
						// Pega o nome fantasia da imagen
						$pseudoname = str_replace('sess'.session_id().'_', '',
												$basename);
						// Copia a imagem
						$url = $this->copyImage(TEMPDIR.$basename);

						// Insere as imagens no DB
						$this->db->query("INSERT INTO ".PRE_TABLE."noticia_imagens "
							."(noticia, nome, url) VALUES("
							."'".$notid."', "
							."'".$pseudoname."', "
							."'".$url."' "
							.");", __FILE__, __LINE__);
						$aTransTable[$basename] = $this->db->insertedId();
						$aFiles[$basename] = $url;
						$conteudo = str_replace($img, '{IMGPATH}'.$url, $conteudo);
					}
					else
					{
						if (strpos($url, '/^http:\/\//') === false)	// imagem interna!
							$url = '{IMGPATH}'.$basename;
						else
							$url = $basename;
						$aFiles[$basename] = $url;
						$conteudo = str_replace($img, $url, $conteudo);
					}
				}
				else
					$conteudo = str_replace($img, $aFiles[$basename], $conteudo);
			}
		}
		return $aTransTable;
	}

	/**
	*	Cadastra a noticia
	*/
	function cadastrar()
	{
		if ($this->magic_quotes)
			$_POST['conteudo'] = stripslashes($_POST['conteudo']);

		$res = CheckForm($_POST, $this->rules());

		if ($res === true)	// Tudo Ok... Cadastre!
		{
			$aTransTable = $this->readImages($_POST['conteudo']);

			// Se o cara quer uma imagem na capa...
			$capaimg = 'NULL';
			if ($_POST['capaimg'])
			{
				$basename = basename($_POST['capaimg']);
				// Verifica se a img da capa já foi parseada pelo readImages()
				if (isset($aTransTable[$basename]))
					$capaimg = '"'.$aTransTable[$basename].'"';
				else
				{
					// Copia a imagem
					$url = $this->copyImage(TEMPDIR.$basename);
					// Pega o nome fantasia da imagen
					$pseudoname = str_replace('sess'.session_id().'_', '',
											$basename);
					// Insere as imagens no DB
					$this->db->query('INSERT INTO '.PRE_TABLE.'noticia_imagens '
						.'(noticia, nome, url) VALUES('
						.'"0", '
						.'"'.$pseudoname.'", '
						.'"'.$url.'" '
						.');', __FILE__, __LINE__);
					$capaimg = "'".$this->db->insertedId()."'";
					$aTransTable[$basename] = $this->db->insertedId();
				}
			}

			// Adiciona a noticia
			$this->db->query('INSERT INTO '.PRE_TABLE.'noticia_noticias '
				.'(user, secao, modelo, olho, titulo, fonte, minitexto, '
				.' capaimg, conteudo, datahora, fixed, visible) VALUES( '
				.'"'.$this->aUser['id'].'", '
				.'"'.$_POST['secao'].'", '
				.'"'.$_POST['modelo'].'", '
				.'"'.$this->db->escapeHTMLString($_POST['olho']).'", '
				.'"'.$this->db->escapeHTMLString($_POST['titulo']).'", '
				.'"'.$this->db->escapeHTMLString($_POST['fonte']).'", '
				.'"'.$this->db->escapeHTMLString($_POST['minitexto']).'", '
				.$capaimg.', '
				.'"'.$this->db->escapeString($_POST['conteudo'], true).'", '
				.'"'.$_POST['sql_datahora'].'", '
				.'"'.($_POST['fixed'] ? 'Y' : 'N').'", '
				.'"'.($_POST['visible'] ? 'Y' : 'N').'" '
				.');', __FILE__, __LINE__);

			// Seta as imagens recen colocadas como pertencentes a esta noticia
			if (count($aTransTable))
				$this->db->query('UPDATE '.PRE_TABLE.'noticia_imagens SET '
					.' noticia = '.$this->db->insertedId()
					.' WHERE id IN ('.implode(',',$aTransTable).')', __FILE__, __LINE__);

			header('Location: ?m=noticia&action=cadastrook');
			return;
		}
		else
		{
			$this->tmpl->readTemplatesFromFile('modules/noticia/templates/cadastrar.htm');
			$this->tmpl->setAttribute('error', 'visibility', 'show');
			$this->tmpl->addVars('error', $res);

			// Formata valores dos campos, retirando escape das aspas e código HTML
			$aData = array();
			foreach($_POST as $key=>$value)
			{
				if ($this->magic_quotes)
					$value = stripslashes($value);
				$aData[$key] = htmlspecialchars($value);
			}
			$this->displayForm($aData);
		}
	}


	/**
	*	Mostra o formulário para edição de uma noticia...
	*/
	function showEditar()
	{
		// Verifica se algum ID de noticia foi enviado
		$id = (int)$_GET['id'];
		if (!$id)
			SemiFatalError('Notícia não identificada.', '?m=noticia&action=listar');

		// Pega a noticia do DB...
		$this->db->query('SELECT N.id, N.secao, '
			.' N.modelo, N.titulo, N.olho, N.titulo, N.fonte, '
			.' N.minitexto, N.conteudo, N.fixed, N.visible, N.capaimg, '
			.' DATE_FORMAT(N.datahora, "'.SQL_DATETIMEFORMAT.'") AS datahora'
			.' FROM '.PRE_TABLE.'noticia_noticias N, '.PRE_TABLE.'noticia_secoes S'
			.' WHERE N.secao = S.id AND '.$this->restriction
			.' AND N.id = '.$id
			.' ORDER BY N.fixed DESC, N.datahora DESC'
			.' LIMIT 1'
			,__FILE__, __LINE__);

		if (!$this->db->numRows())
			SemiFatalError('Notícia não encontrada ou você não tem permissões para edita-la.',
							'?m=noticia&action=listar');

		$_SESSION['noticia']['id'] = $id;
		$aNoticia = $this->db->fetchAssoc();
		// Recoloca o path da imagem, para ela ser vista no editor
		$aNoticia['conteudo'] = str_replace('{IMGPATH}', NOTICIA_UPLOADDIR, $aNoticia['conteudo']);
		if ($aNoticia['fixed'] == 'N')
			unset($aNoticia['fixed']);
		if ($aNoticia['visible'] == 'N')
			unset($aNoticia['visible']);

		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/editar.htm');
		$this->displayForm($aNoticia);
	}


	function editar()
	{
		$id = (int)$_POST['id'];
		if (!$id)
			SemiFatalError('Notícia inválida.', '?m=noticia&action=listar');

		// Verifica se o ID é de uma noticia que o usuario tem permissão.
		$this->db->query('SELECT N.id '
			.' FROM '.PRE_TABLE.'noticia_noticias N, '.PRE_TABLE.'noticia_secoes S'
			.' WHERE N.secao = S.id AND '.$this->restriction.' AND N.id='.$id
			,__FILE__, __LINE__);
		if (!$this->db->numRows())
			SemiFatalError('Você não tem permissão para editar esta notícia',
							'?m=noticia&action=listar');

		$_POST['conteudo'] = stripslashes($_POST['conteudo']);

		$res = CheckForm($_POST, $this->rules());
		if ($res === true)	// Tudo Ok... Salve!
		{
			$aImgIds = $this->readImages($_POST['conteudo'], $id);
			// Adiciona a noticia
			$this->db->query('UPDATE '.PRE_TABLE.'noticia_noticias SET '
				.'user = "'.$this->aUser['id'].'", '
				.'secao = "'.$_POST['secao'].'", '
				.'modelo = "'.$_POST['modelo'].'", '
				.'olho = "'.$this->db->escapeHTMLString($_POST['olho']).'", '
				.'titulo = "'.$this->db->escapeHTMLString($_POST['titulo']).'", '
				.'fonte = "'.$this->db->escapeHTMLString($_POST['fonte']).'", '
				.'minitexto = "'.$this->db->escapeHTMLString($_POST['minitexto']).'", '
				.'conteudo = "'.$this->db->escapeString($_POST['conteudo'], true).'", '
				.'datahora = "'.$_POST['sql_datahora'].'", '
				.'fixed = "'.($_POST['fixed'] ? 'Y' : 'N').'", '
				.'visible = "'.($_POST['visible'] ? 'Y' : 'N').'" '
				.'WHERE id='.$id, __FILE__, __LINE__);
			header('Location: ?m=noticia&action=editarok');
			return;
		}
		else
		{
			$this->tmpl->readTemplatesFromFile('modules/noticia/templates/editar.htm');
			$this->tmpl->setAttribute('error', 'visibility', 'show');
			$this->tmpl->addVars('error', $res);
			$this->displayForm($_POST);
		}
	}

	/**
	*	Executa as subactions do configurar seção
	*	retornando erro, se houver.
	*/
	function addSecao()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		$aError = array();
		if (!$_POST['secao'])
			$aError['ERROR'][] = "A nova seção precisa de um nome.";

		$aUserIds = array();
		if (isset($_POST['users']))
			foreach ($_POST['users'] as $uid)
			{
				$uid = (int) $uid;
				if ($uid)
					$aUserIds[] = $uid;
			}
		if (!sizeof($aUserIds))
			$aError['ERROR'][] = "A nova seção precisa de usuários.";

		$aModeloIds = array();
		if (isset($_POST['modelos']))
			foreach ($_POST['modelos'] as $mid)
			{
				$mid = (int) $mid;
				if ($mid)
					$aModeloIds[] = $mid;
			}
		if (!sizeof($aModeloIds))
			$aError['ERROR'][] = "A nova seção precisa de modelos.";

		if (sizeof($aError))
			return $aError;

		$this->db->query("INSERT INTO ".PRE_TABLE."noticia_secoes "
					." (nome, users, modelos) VALUES("
					."'".$this->db->escapeString(htmlspecialchars($_POST['secao']))."',"
					."'".implode(',', $aUserIds)."', "
					."'".implode(',', $aModeloIds)."')", __FILE__, __LINE__);
		return true;
	}

	/**
	*	Mostra lista comtodas as seções e modelos existentes.
	*/
	function listSecoesModelos()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		$this->setCaption('Configurando seções e modelos');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/secoesmodelos.htm');

		$aUsers = array();
		$aModelos = array();
		$aSecoes = array();

		// Pega lista de usuários
		$this->db->query("SELECT id, user, nome"
			." FROM ".PRE_TABLE."users"
			, __FILE__, __LINE__);
		while($row = $this->db->fetchAssoc())
			$aUsers[] = $row;

		// Pega lista de modelos
		$this->db->query("SELECT id, nome"
			." FROM ".PRE_TABLE."noticia_modelos"
			, __FILE__, __LINE__);
		while($row = $this->db->fetchAssoc())
			$aModelos[] = $row;

		// Pega lista de seções
		$this->db->query("SELECT id, nome, users, modelos "
			." FROM ".PRE_TABLE."noticia_secoes"
			, __FILE__, __LINE__);
		while($row = $this->db->fetchAssoc())
			$aSecoes[] = $row;


		// Lista de seções
		if (!count($aSecoes))
		{
			$this->tmpl->setAttribute('semsecao', 'visibility', 'show');
			$this->tmpl->setAttribute('listsecao', 'visibility', 'hidden');
		}
		else
		{
			// Monta index com usuários
			$aUserIdx = array();
			foreach($aUsers as $user)
				$aUserIdx[$user['id']] = $user['nome'];
			// Monta index com modelos
			$aModelosIdx = array();
			foreach($aModelos as $modelo)
				$aModelosIdx[$modelo['id']] = $modelo['nome'];

			$aTplSecoes = array();
			foreach($aSecoes as $secao)
			{
				$aTplSecoes['ID'][] = $secao['id'];
				$aTplSecoes['SECAO'][] = $secao['nome'];
				$aTplSecoes['LINK'][] = '?m=noticia&action=showeditsecao&id='.$secao['id'];
				// Lista de usuários
				$aTemp = explode(',', $secao['users']);
				$aTemp2 = array();
				foreach($aTemp as $temp)
				{
					if (isset($aUserIdx[$temp]))
						$aTemp2[] = $aUserIdx[$temp];
				}
				$aTplSecoes['USERS'][] = implode(', ', $aTemp2);

				// Lista Modelos
				$aTemp = explode(',', $secao['modelos']);
				$aTemp2 = array();
				foreach($aTemp as $temp)
				{
					if (isset($aModelosIdx[$temp]))
						$aTemp2[] = $aModelosIdx[$temp];
				}
				$aTplSecoes['MODELOS'][] = implode(', ', $aTemp2);
			}
			$this->tmpl->addVars('secao', $aTplSecoes);
		}


		// Lista de Modelos
		if (!count($aModelos))
		{
			$this->tmpl->setAttribute('semmodelo', 'visibility', 'show');
			$this->tmpl->setAttribute('listmodelo', 'visibility', 'hidden');
		}
		else
		{
			// Monta Index das seções
			$aSecoesIdx = array();
			foreach($aSecoes as $secao)
				$aSecoesIdx[$secao['id']] = $secao['nome'];

			$aTplModelos = array();
			foreach($aModelos as $modelo)
			{
				$aTplModelos['ID'][] = $modelo['id'];
				$aTplModelos['NOME'][] = $modelo['nome'];
				$aTplModelos['LINK'][] = '?m=noticia&action=showeditmodelo&id='.$modelo['id'];
			}
			$this->tmpl->addVars('modelo', $aTplModelos);
		}
	}

	/**
	*	Mostra o formulario de seção
	*/
	function displaySecaoForm(&$aData, $users, $modelos)
	{
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/formsecao.htm');
		$this->tmpl->addVars('formsecao', $aData);

		// Pega todos os usuários do sistema
		$this->db->query("SELECT id, nome, user, "
				." IF(id IN (0".$users."), 'checked=\"checked\"', '') AS checked "
				." FROM ".PRE_TABLE."users"
				, __FILE__, __LINE__);
		while($row = $this->db->fetchAssoc())
			$aUsers[] = $row;

		$count = count($aUsers);
		for($i = 0; $i < $count; $i += 2)
		{
			$aTplVar['ID1'][] = $aUsers[$i]['id'];
			$aTplVar['NOME1'][] = $aUsers[$i]['nome'];
			$aTplVar['USER1'][] = $aUsers[$i]['user'];
			$aTplVar['CHECKED1'][] = $aUsers[$i]['checked'];
			if (isset($aUsers[$i+1]))
			{
				$aTplVar['ID2'][] = $aUsers[$i+1]['id'];
				$aTplVar['NOME2'][] = $aUsers[$i+1]['nome'];
				$aTplVar['USER2'][] = $aUsers[$i+1]['user'];
				$aTplVar['CHECKED2'][] = $aUsers[$i+1]['checked'];
			}
			else
			{	// Para evitar "notify" no patTemplate
				$aTplVar['ID2'][] = null;
				$aTplVar['NOME2'][] = null;
				$aTplVar['USER2'][] = null;
				$aTplVar['CHECKED2'][] = null;
			}
		}
		$this->tmpl->addVars('users', $aTplVar);


		// Pega todos os usuários do sistema
		$this->db->query("SELECT id, nome, "
				." IF(id IN (0".$modelos."), 'checked=\"checked\"', '') AS checked "
				." FROM ".PRE_TABLE."noticia_modelos"
				, __FILE__, __LINE__);
		if (!$this->db->numRows())
			SemiFatalError('Antes você precisa cadastrar um modelo', '?m=noticia&action=shownovomodelo');

		$aModelos = array();
		while($row = $this->db->fetchAssoc())
			$aModelos[] = $row;

		$aTplVar = array();	// zera a array...
		$count = count($aModelos);
		for($i = 0; $i < $count; $i += 2)
		{
			$aTplVar['ID1'][] = $aModelos[$i]['id'];
			$aTplVar['NOME1'][] = $aModelos[$i]['nome'];
			$aTplVar['CHECKED1'][] = $aModelos[$i]['checked'];
			if (isset($aModelos[$i+1]))
			{
				$aTplVar['ID2'][] = $aModelos[$i+1]['id'];
				$aTplVar['NOME2'][] = $aModelos[$i+1]['nome'];
				$aTplVar['CHECKED2'][] = $aModelos[$i+1]['checked'];
			}
			else
			{	// Para evitar "notify" no patTemplate
				$aTplVar['ID2'][] = null;
				$aTplVar['NOME2'][] = null;
				$aTplVar['CHECKED2'][] = null;
			}
		}
		$this->tmpl->addVars('modelos', $aTplVar);


	}

	/**
	*	Mostra Formulario para editar uma seção
	*/
	function showEditSecao()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		// Verifica se foi enviado o ID sda seção por GET ou POST
		$id = 0;
		if (isset($_POST['id']))
			$id = $_POST['id'];
		elseif (isset($_GET['id']))
			$id = $_GET['id'];
		if (!$id)
			SemiFatalError("ID inválido para seção", "?m=noticia&action=secoesmodelos");


		// Lê template...
		$this->setCaption('Editando seção');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/editsecao.htm');


		// Verifica se há alguma subaction... add, del...
		if (isset($_GET['subaction']))
		{
			switch($_GET['subaction'])
			{
				case 'add':
					$error = $this->editSecao($id);
					break;
				case 'del':
					break;
			}
			// Se tudo ocorreu bem, volte a lista de seções e modelos
			if ($error === true)
			{
				header("Location: ?m=noticia&action=secoesmodelos");
				exit;
			}
			$this->tmpl->addVars('error', $error);
		}
		// Pega todas as seções existentes com exeção da que será editada
		$this->db->query("SELECT id, nome "
						." FROM ".PRE_TABLE."noticia_secoes WHERE id != ".$id, __FILE__, __LINE__);
		if (!$this->db->numRows())
			$this->tmpl->setAttribute('secoes', 'visibility', 'hidden');
		else
		{
			while($row = $this->db->fetchAssoc())
			{
				$aSecoes['ID'][] = $row['id'];
				$aSecoes['NOME'][] = $row['nome'];
			}
			$this->tmpl->addVars('secoes', $aSecoes);
		}


		// Pega a seção que será editada
		if (!isset($error))
		{
			$this->db->query("SELECT id, nome AS secao, modelos, users, arqconteudo "
							." FROM ".PRE_TABLE."noticia_secoes WHERE id=".$id, __FILE__, __LINE__);
			if (!$this->db->numRows())
				SemiFatalError("Seção não encontrada!", "?m=noticia&action=secoesmodelos");
			$aData = $this->db->fetchAssoc();
		}
		else
		{
			$aData = array();
			$aData['users'] = isset($_POST['user']) ? implode(",", $_POST['user']) : '';
			$aData['modelos'] = isset($_POST['modelo']) ? implode(",", $_POST['modelo']) : '';
			$aData['id'] = $id;
			$aData['secao'] = $_POST['secao'];
			$aData['arqconteudo'] = $_POST['arqconteudo'];
		}
		$this->displaySecaoForm($aData, $aData['users'], $aData['modelos']);

	}

	/**
	*	Edita a seção, chamado por showEditSecao()
	*/
	function editSecao($id)
	{
		$aError = array();
		if (isset($_POST['del']))
		{
			$moveto = (int) $_POST['moveto'];
			if ($moveto)	// Move todas as noticias para a nova seção
			{
				$this->db->query("UPDATE ".PRE_TABLE."noticia_noticias N "
					." SET N.secao=".$moveto." WHERE N.secao = ".$id
					, __FILE__, __LINE__);
			}
			else	// Apaga todas as noticias...
			{
				// Pega o ID de todas as noticias desta seção
				$this->db->query("SELECT id FROM ".PRE_TABLE."noticia_noticias "
					."WHERE secao=".$id, __FILE__, __LINE__);
				$aIds = array();
				while($row = $this->db->fetchAssoc())
					$aIds[] = $row['id'];
				if (count($aIds))
					$this->apagarNoticia(implode(',',$aIds), true);
			}
			// Apaga a seção
			$this->db->query("DELETE FROM ".PRE_TABLE."noticia_secoes "
				." WHERE id = ".$id, __FILE__, __LINE__);
		}
		else
		{
			$aUserIds = array();
			if (isset($_POST['user']))
				$aUserIds = $_POST['user'];

			$aModeloIds = array();
			if (isset($_POST['modelo']))
				$aModeloIds = $_POST['modelo'];
			if (!count($aModeloIds))
				$aError['ERROR'][] = "A seção precisa de modelos.";

			if (!$_POST['secao'])
				$aError['ERROR'][] = "A seção precisa ter um nome.";
			if (!$_POST['arqconteudo'])
				$aError['ERROR'][] = "A seção precisa ter um arquivo para exibição de conteúdo.";

			if (count($aError))
				return $aError;
			$this->db->query("UPDATE ".PRE_TABLE."noticia_secoes SET"
				." nome = '".$this->db->escapeHTMLString($_POST['secao'])."', "
				." users = '".implode(',', $aUserIds)."', "
				." modelos = '".implode(',', $aModeloIds)."', "
				." arqconteudo = '".$this->db->escapeString($_POST['arqconteudo'])."'"
				." WHERE id=".$id
				, __FILE__, __LINE__);
		}
		return true;
	}


	function showNovaSecao()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		// Lê templates....
		$this->setCaption('Criando seção');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/novasecao.htm');

		// Verifica subactions
		if (isset($_GET['subaction']))
			if ($_GET['subaction'] == 'new')
			{
				$error = $this->novaSecao();
				if ($error === true)
				{
					header("Location: ?m=noticia&action=secoesmodelos");
					exit;
				}
				else
					$this->tmpl->addVars('error', $error);
			}
		$aData = array();
		if (isset($_POST['secao']))
			$aData['secao'] = $_POST['secao'];
		$users = isset($_POST['user']) ? implode(",", $_POST['user']) : "";
		$modelos = isset($_POST['modelo']) ? implode(",", $_POST['modelo']) : "";
		$this->displaySecaoForm($aData, $users, $modelos);
	}

	/**
	*	Cria a nova seção, chamado por showNovaSecao()
	*/
	function novaSecao()
	{
		$aError = array();
		// Verifica se os campos estão preenchidos...
		if (!$_POST['secao'])
			$aErros['ERROR'][] = 'A seção precisa de um nome.';
		$aUserIds = array();
		if (isset($_POST['user']))
			if (is_array($_POST['user']))
				$aUserIds = $_POST['user'];
			else
				$aErros['ERROR'][] = 'Os usuários da seção não foram enviados de forma correta.';

		$aModeloIds = array();
		if (isset($_POST['modelo']))
			$aModeloIds = $_POST['modelo'];
		if (!count($aModeloIds))
			$aError['ERROR'][] = "A seção precisa de modelos.";

		if (!$_POST['secao'])
			$aError['ERROR'][] = "A seção precisa ter um nome.";
		if (!$_POST['arqconteudo'])
			$aError['ERROR'][] = "A seção precisa ter um arquivo para exibição de conteúdo.";
		// Se tiver erros... saida pela direita...
		if (count($aError))
			return $aError;

		$users = implode(",", $aUserIds);
		$modelos = implode(",", $aModeloIds);
		$this->db->query("INSERT INTO ".PRE_TABLE."noticia_secoes "
				." (nome, users, modelos, arqconteudo) VALUES ("
				."'".$this->db->escapeHTMLString($_POST['secao'])."', "
				."'".$users."', "
				."'".$modelos."',"
				."'".$this->db->escapeString($_POST['arqconteudo'])."'"
				.");", __FILE__, __LINE__);
		return true;
	}

	function displayModeloForm($aData)
	{
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/formmodelo.htm');
		// Formata o código HTML do modelo, para os parenteses aparecerem no patTemplate
		if (isset($aData['html']))
		{
			$search = array('{', '}');
			$replace = array('&#123', '&#125');
			$aData['html'] = str_replace($search, $replace, htmlspecialchars($aData['html']));
		}

		$this->tmpl->addVars('formmodelo', $aData);
	}

	/**
	*	Mostra um formulario para editar um modelo
	*/
	function showEditModelo()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		// Verifica se foi passado o ID do modelo
		$id = 0;
		if (isset($_POST['id']))
			$id = $_POST['id'];
		elseif (isset($_GET['id']))
			$id = $_GET['id'];
		if (!$id)
			SemiFatalError("ID inválido para o modelo", "?m=noticia&action=secoesmodelos");

		// Inicia template
		$this->setCaption('Editando modelo');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/editmodelo.htm');

		// Verifica subactions...
		if (isset($_GET['subaction']))
		{
			if ($_GET['subaction'] == 'edit')
				$res = $this->editModelo($id);
			if ($res === true)	// sem erros!, parece estranho mas é isso qdo $error === true, hehe
			{
				header("Location: ?m=noticia&action=secoesmodelos");
				exit;
			}
			else
				$this->tmpl->addVars('error', $res);
		}

		$this->db->query("SELECT id, nome, html, css "
				." FROM ".PRE_TABLE."noticia_modelos WHERE "
				." id=".$id
				, __FILE__, __LINE__);
		$aData = $this->db->fetchAssoc();
		$this->displayModeloForm($aData);
	}

	function editModelo($id)
	{
		$aError = array();


		// Apagar modelo
		if (isset($_POST['del']))
		{
			// Verifica se existe alguma seção que utiliza apenas este modelo
			$this->db->query("SELECT nome FROM ".PRE_TABLE."noticia_secoes WHERE "
				."modelos = '".$id."'"
				,__FILE__, __LINE__);
			if ($this->db->numRows())
			{
				while($row = $this->db->fetchAssoc())
					$aSecoes[] = $row['nome'];
				$aError['ERROR'][] = "Não é possivél apagar a seção, por que as seguintes seções &quot;"
									.implode("&quot;, &quot;", $aSecoes)
									."&quot; utilizam apenas este modelo.";
			}
			else
			{
				// Faz as devidas alterações nos modelos, retirando o modelo atual da lista
				$this->db->query("SELECT id, modelos FROM ".PRE_TABLE."noticia_secoes WHERE "
						." FIND_IN_SET('".$id."', modelos)", __FILE__, __LINE__);
				if ($this->db->numRows())
				{
					$aSecoes = array();
					while($row = $this->db->fetchAssoc())
						$aSecoes[] = $row;
					foreach($aSecoes as $secao)
					{
						$aModelos = explode(",", $secao['modelos']);
						$key = array_search($id, $aModelos);
						if ($key === false)
							continue;
						unset($aModelos[$key]);
						$this->db->query("UPDATE ".PRE_TABLE."noticia_secoes SET "
								."modelos = '".implode(",", $aModelos)."' "
								." WHERE id=".$secao['id']
								,__FILE__, __LINE__);
					}
				}
				// Seta todas as noticias que utilizam este modelo para usar o primeiro modelo da seção
				$this->db->query("UPDATE ".PRE_TABLE."noticia_noticias N, ".PRE_TABLE."noticia_secoes S SET "
						." N.modelo = IF((LOCATE(',', S.modelos)-1) > 0, "	// if
						." SUBSTRING(S.modelos, 1, LOCATE(',', S.modelos)-1), " // else
						." S.modelos) "
						." WHERE N.modelo=".$id." AND N.secao = S.id"
						, __FILE__, __LINE__);
				// Finalmente apaga o modelo...
				$this->db->query("DELETE FROM ".PRE_TABLE."noticia_modelos WHERE id=".$id, __FILE__, __LINE__);
				return true;
			}
		}

		// Verifica os 2 campos... html e nome
		if (!$_POST['nome'])
			$aError['ERROR'][] = "O modelo precisa ter um nome.";
		if (!$_POST['html'])
			$aError['ERROR'][] = "O modelo ter um código HTML.";
		if (count($aError))
			return $aError;

		$this->db->query("UPDATE ".PRE_TABLE."noticia_modelos SET "
			."nome='".$this->db->escapeHTMLString($_POST['nome'])."',"
			."html='".$this->db->escapeString($_POST['html'])."',"
			."css='".$this->db->escapeString($_POST['css'])."' "
			."WHERE id=".$id
		, __FILE__, __LINE__);
		return true;
	}


	/**
	*	Mostra tela para criação de um novo modelo
	*/
	function showNovoModelo()
	{
		if ($this->aUser['privs'] < PRIV_ADMIN)
			FatalError(MSG_NOPRIVS);

		// Inicia template
		$this->setCaption('Criando modelo');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/novomodelo.htm');


		// Verifica subactions
		if (isset($_GET['subaction']))
			if ($_GET['subaction'] == 'new')
			{
				$error = $this->novoModelo();
				if ($error === true)	// sem erros!, parece estranho mas é isso qdo $error === true, hehe
				{
					header("Location: ?m=noticia&action=secoesmodelos");
					exit;
				}
				else
					$this->tmpl->addVars('error', $error);
			}

		$aData = array();
		$this->displayModeloForm($aData);
	}

	/**
	*	Cria o novo modelo, chamado por showNovoModelo()
	*	@see showNovoModelo()
	*	@return	True no sucesso, uma array com erros em caso de falha.
	*/
	function novoModelo()
	{
		$aError = array();

		if (!$_POST['nome'])
			$aError['ERROR'][] = "O modelo precisa de um nome.";

		if (count($aError))
			return $aError;

		// Grava o modelo no DB... =)
		$this->db->query("INSERT INTO ".PRE_TABLE."noticia_modelos (nome, HTML, css) VALUES ("
			."'".$this->db->escapeHTMLString($_POST['nome'])."', "
			."'".$this->db->escapeString($_POST['html'])."', "
			."'".$this->db->escapeHTMLString($_POST['css'])."' "
			.");", __FILE__, __LINE__);
		return true;
	}

	/**
	*	Tela que lista, cadastra e apaga possiveis CSS a serem usados no site.
	*/
	function setupCSS()
	{
		$this->setCaption('CSS setup');
		$this->tmpl->readTemplatesFromFile('modules/noticia/templates/csslist.htm');

		$subaction = isset($_GET['subaction']) ? $_GET['subaction'] : '';
		if ($subaction == 'add')
		{
			if (isset($_POST['css']))
				if ($_POST['css'])
					$this->db->query('INSERT INTO '.PRE_TABLE.'noticia_csss (nome)'
						.'VALUES("'.$this->db->escapeString($_POST['css']).'")', __FILE__, __LINE__);
		}
		elseif ($subaction == 'del')
		{
			if (isset($_POST['css']))
			{
				if (is_array($_POST['css']))
				{
					$ids = $this->db->escapeString(implode(', ', $_POST['css']));
					$this->db->query('DELETE FROM '.PRE_TABLE.'noticia_csss WHERE id IN ('.$ids.')');
				}
			}
		}
		else
		{
			/**	Lista CSS's	*/
			$this->db->query('SELECT id, nome FROM '.PRE_TABLE.'noticia_csss', __FILE__, __LINE__);
			if (!$this->db->numRows())
			{
				$this->tmpl->setAttribute('lista', 'visibility', 'hidden');
			}
			else
			{
				$aCSS = array();
				while($row = $this->db->fetchAssoc())
				{
					$aCSS['ID'][] = $row['id'];
					$aCSS['NOME'][] = $row['nome'];
				}
				$this->tmpl->addVars('css', $aCSS);
			}
			return;
		}
		header('Location: ?m=noticia&action=css');
		exit;
	}
};



Return current item: MUSPA