Location: PHPKode > projects > MUSPA > muspa/modules/noticia/index.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.
*
*******************************************************************************/

require "../../config.php";
require "../../include/db.php";

error_reporting(E_ALL);

if (!isset($_GET['type']))
	die('Você precisa especificar a váriavel "type".');

$type = $_GET['type'];
if ($type == 'list')
	DisPlayList();
elseif ($type == 'content')
	DisplayContent();
else
	die('O valor da variável "type" é inválido.');


/**
*	Imprime a lista de noticias
*	Note: Se este arquivo ficar muito grande, talvez eu possa por as funções
*	DisplayList() e DisplayContent() cada uma em um arquivo diferente.
*/
function DisplayList()
{
	if (!isset($_GET['secao']))
		die('Variável "secao" faltando. '
			.'Você precisa especificar pelo menos uma seção de notícia.');
	if (!isset($_GET['end']))
		die('Variável "end" faltando. '
			.'Você precisa especificar quantas seções serão mostradas.');

	$end = (int)$_GET['end'];
	if (!$end)
		die('A variável "end" precisa ser um número maior que zero.');

	// Váriaveis opcionais
	$start = isset($_GET['start']) ? (int)$_GET['start'] : 0;
	$basedir = isset($_GET['basedir']) ? $_GET['basedir'] : "";

	$aRawSecoes = explode(',', $_GET['secao']);
	$aSecoes = array();
	foreach($aRawSecoes as $secao)
	{
		$secao = (int)$secao;
		if ($secao <= 0)
			continue;
		else
			$aSecao[] = $secao;
	}


	if (!count($aSecao))
		die('As seções que você especificou são inválidas, você precisa especificar o ID das seções que deseja mostrar.');
	$secao = "";
	if (count($aSecao) == 1)
		$secao = "= ".$aSecao[0];
	else
		$secao = "IN (".implode(',', $aSecao).")";

	//	Finalmente cria a conexão com o DB e faz a query...
	$db = new db(DB_HOST, DB_USER, DB_PWD, DB_DB);


	// Pega todos os modelos que irão aparecer
	$db->query('SELECT N.modelo, M.html '
				.' FROM '.PRE_TABLE.'noticia_noticias N, '.PRE_TABLE.'noticia_modelos M '
				.' WHERE N.modelo = M.id AND '
				.' N.secao '.$secao.' GROUP BY N.modelo LIMIT '.$end, __FILE__, __LINE__);
	if (!$db->numRows())
		return;

	// array que guarda para cada modelo, a data hora, e o substituto dela.
	$aDataHora = array();
	$dataQuery = "";
	$j = 0;
	while ($row = $db->fetchAssoc())
	{
		// Procura quantas formatações de data o cara colocou.
		if ($found = preg_match_all('/\{DATAHORA\|?([^\}]*)\}/', $row['html'], $match))
		{
			for ($i = 0; $i < $found; $i++)
			{
				$aDataHora[$row['modelo']][0][] = $match[0][$i];
				$aDataHora[$row['modelo']][1][] = 'datahora_'.$j;
				$dataQuery .= ', DATE_FORMAT(N.datahora, "'.$db->escapeString($match[1][$i]).'") AS datahora_'.$j;
				$j++;
			}
		}
	}

	$db->query('SELECT N.id, N.modelo, N.olho, N.titulo, '
		.' N.fonte, N.minitexto, N.conteudo, N.datahora,'
		.' I.url AS capaimg, M.html AS html,'
		.' S.nome AS secao '.$dataQuery
		.' FROM '.PRE_TABLE.'noticia_noticias N '
		.' INNER JOIN '.PRE_TABLE.'noticia_modelos M ON (N.modelo = M.id)'
		.' INNER JOIN '.PRE_TABLE.'noticia_secoes S ON (N.secao = S.id)'
		.' LEFT JOIN '.PRE_TABLE.'noticia_imagens I ON (N.capaimg = I.id)'
		.' WHERE N.secao '.$secao
		.' ORDER BY N.fixed DESC, N.datahora DESC'
		.' LIMIT '.$end
		, __FILE__, __LINE__);

	$row = $db->fetchAssoc();
	$db->reset();

	while($row = $db->fetchAssoc())
	{
		$modelo = $row['html'];
		$modelo = str_replace('{OLHO}', $row['olho'], $modelo);
		$modelo = str_replace('{TITULO}', $row['titulo'], $modelo);

		if (isset($aDataHora[$row['modelo']]))
		{
			$aTemp = $aDataHora[$row['modelo']];
			$len = count($aTemp[0]);
			for($i = 0; $i < $len; $i++)
			{
				$modelo = str_replace($aTemp[0][$i], $row[$aTemp[1][$i]], $modelo);
			}
		}
		$modelo = str_replace('{SECAO}', $row['secao'], $modelo);
		$modelo = str_replace('{FONTE}', $row['fonte'], $modelo);
		$modelo = str_replace('{MINITEXTO}', $row['minitexto'], $modelo);
		$modelo = str_replace('{CONTEUDO}', $row['conteudo'], $modelo);

		if ($row['capaimg'])
			$modelo = str_replace('{CAPAIMG}', '<img src="'
						.$basedir.INSTALL_DIR.'/modules/noticia/imagens/'.$row['capaimg']
						.'" alt="" />', $modelo);
		else
			$modelo = str_replace('{CAPAIMG}', '', $modelo);
		$modelo = str_replace('{LINK}', $basedir
						.INSTALL_DIR.'/modules/noticia/?type=content&amp;id='.$row['id'],
						$modelo);
//		echo "<PRE>".(++$i)."</pre>";
		echo $modelo;
	}
}

/**
*	Imprime o conteudo da noticia
*/
function DisplayContent()
{
	$id = isset($_GET['id']) ? (int)$_GET['id'] : die("Erro: Você precisa especificar o ID da notícia.");

	$db = new db(DB_HOST, DB_USER, DB_PWD, DB_DB);
	$db->query("SELECT N.id, N.modelo, N.olho, N.titulo, "
		." N.fonte, N.minitexto, N.conteudo, N.datahora,"
		." I.url AS capaimg, M.html AS modelo,"
		." S.nome AS secao, S.arqconteudo"
		." FROM ".PRE_TABLE."noticia_noticias N "
		." INNER JOIN ".PRE_TABLE."noticia_modelos M ON (N.modelo = M.id)"
		." INNER JOIN ".PRE_TABLE."noticia_secoes S ON (N.secao = S.id)"
		." LEFT JOIN ".PRE_TABLE."noticia_imagens I ON (N.capaimg = I.id)"
		." WHERE N.id=".$id
		, __FILE__, __LINE__);

	// TODO!
	// Deixar uma opção para o cara poder escolher um arquivo de template com
	// esta mensagem, para ele poder exibir uma página com o estilo do site quando
	// ocorrer o erro...
	if (!$db->numRows())
		die('Não foi encontrada nenhuma notícia com este ID');

	$row = $db->fetchAssoc();
	if (!file_exists($row['arqconteudo']))
		die('O arquivo de conteúdo não foi encontrado ('.$row['arqconteudo'].')');
	$row['conteudo'] = str_replace('{IMGPATH}', 'imagens/', $row['conteudo']);
	extract($row, EXTR_PREFIX_ALL, 'muspa');

	include $row['arqconteudo'];
}
Return current item: MUSPA