<?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&action=showeditar&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}', '{IMGPATH}', $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('{', '}');
$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 ""
.implode("", "", $aSecoes)
."" 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;
}
};