<?php
/**********************************************************************
Copyright (C) 2003 Cornel Alexa
Class ft version 1.0 (born)
Tradução e Adaptação para pt-BR por Fábio Coelho
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
www.freesoftwarefoundation.org
************************************************************************/
class Modelo
{
var $Raiz; // Diretório raiz dos modelos
var $Modelos; // Contém os modelos e seus conteúdos
var $Marcas; // Contém os pares Marcas->Valores
var $Blocos; // Blocos Dinâmicos
var $Destrincha; // Se verdade, limpa marcas sem valores atribuidos
/* public: constructor */
function Modelo($Raiz_Dir=NULL)
{
if($Raiz_Dir)
{
$this->Conf_Raiz($Raiz_Dir);
}
$this->Modelos=array();
$this->Marcas=array();
$this->Blocos=array();
$this->Destrincha=true;
}
/*
Configura o caminho de procura por arquivos de modelo
*/
function Conf_Raiz($Raiz_Dir)
{
if('/' != substr($Raiz_Dir,strlen($Raiz_Dir)-1,1))
{
$Raiz_Dir.='/';
}
if(!is_dir($Raiz_Dir))
{
user_error("Modelos::Conf_Raiz()-Impossível configurar diretório Raiz: $Raiz_Dir");
return false;
}
$this->Raiz=$Raiz_Dir;
return true;
}
/*
Define se as Marcas vazias vão ser mantidas após a Inserção
*/
function Estrito()
{
$this->Destrincha=false;
}
function N_Estrito()
{
$this->Destrincha=true;
}
/*
Define qual(is) o(s) arquivos que contém os modelos html a serem usados
Modelo_Misto deve ser um array com pares 'Mod_ID'=>'Mod_Arquivo'
*/
function Define($Modelo_Misto)
{
if('array' == gettype($Modelo_Misto))
{
foreach($Modelo_Misto as $Mod_ID => $Mod_Arquivo)
{
$this->Modelos[$Mod_ID]=$this->Carrega_Arquivo($Mod_Arquivo);
}
return true;
}
user_error("Modelo::Define()-Espera-se uma Matriz de Modelos.");
return false;
}
/*
Extrai de dentro de um modelo já definido, um bloco,
e o transforma também em um modelo definido.
Blocos aninhados serão levados com o bloco extraido.
*/
function Define_Dinamico($Nome_Bloco,$Conteiner)
{
if(!$Nome_Bloco || !$Conteiner)
{
user_error("Modelo::Define_Dinamico()-Preencha os parâmetros corretamente seu animal ! ! ! !.");
return false;
}
if(!isset($this->Modelos[$Conteiner]))
{
user_error("Modelo::Define_Dinamico()-Bloco inválido: $Conteiner.");
return false;
}
$this->Blocos[$Nome_Bloco]=$Conteiner;
$Mod_Conteiner=$this->Modelos[$Conteiner];
$Inicio_Bloco="<!-- INICIA BLOCO DINAMICO: $Nome_Bloco -->";
$Fim_Bloco="<!-- FINALIZA BLOCO DINAMICO: $Nome_Bloco -->";
$rez=preg_match_all("/$Inicio_Bloco(.*)$Fim_Bloco/s",$Mod_Conteiner,$Novo_Conteiner);
if(!$rez)
{
user_error("Modelo::Define_Dinamico()-O Bloco '$Nome_Bloco' não foi achado no arquivo Conteiner.");
return false;
}
if($rez > 1)
{
user_error("Modelo::Define_Dinamico()- Mais de um bloco com o nome '$Nome_Bloco' foi achado.");
return false;
}
$this->Modelos[$Nome_Bloco]=$Novo_Conteiner[1][0];
return true;
}
/*
Atribui o valor de Valor_Marca, na marca nomeada por Marcas_Valores
Não é necessário definir em que modelo está a marca.
Marcas_Valores também pode ser um array de pares 'Marca'=>'Valor'
*/
function Atribui($Marcas_Valores,$Valor_Marca=NULL)
{
if(empty($Marcas_Valores))return false;
if('array' == gettype($Marcas_Valores))
{
foreach($Marcas_Valores as $Marca_Nome => $Valor_Marca)
{
$this->Marcas["\{$Marca_Nome}"]=$Valor_Marca;
}
return true;
}
$this->Marcas["\{$Marcas_Valores}"]=$Valor_Marca;
return true;
}
/*
Insere o HTML junto com as marcas trocadas no BUFFER Sessão_Saída
Se Destrincha, as marcas não trocadas serão extirpadas
Se Manter_Aberto, não será possível novas iterações
com aquele mesmo modelo
*/
function Insere($Sessao_Saida,$Modelo_Nome)
{
if("." == substr($Modelo_Nome,0,1))
{
$Manter_Aberto=true;
$Modelo_Nome=substr($Modelo_Nome,1);
}
if(!isset($this->Modelos[$Modelo_Nome]))
{
user_error("Modelo::Insere()-Modelo não definido: $Modelo_Nome.Use Modelo::Define() primeiro.");
return false;
}
if(isset($this->Blocos[$Modelo_Nome]))
{
if(!$this->Insere_Dinamico($Sessao_Saida,$Modelo_Nome))
{
return false;
}
}
$Conteudo_Mod=$this->Modelos[$Modelo_Nome];
$M=array_keys($this->Marcas);
$V=array_values($this->Marcas);
$Conteudo_Mod=str_replace($M,$V,$Conteudo_Mod);
if($this->Destrincha)
{
$Conteudo_Mod=ereg_replace("\{([A-Z0-9_]+)}",'',$Conteudo_Mod);
}
echo $Conteudo;
if($Manter_Aberto)
{
$this->Marcas["\{$Sessao_Saida}"].=$Conteudo_Mod;
}
else
{
$this->Marcas["\{$Sessao_Saida}"]=$Conteudo_Mod;
}
unset($Conteudo_Mod);
return true;
}
function Insere_Dinamico($Marca_Saida,$Modelo_Nome)
{
if(!$Marca_Saida)return false;
if(!isset($this->Modelos[$Modelo_Nome]))
{
user_error("Modelo::Insere_Dinamico()-Modelo $Modelo_Nome não definido.");
return false;
}
$m_Modelo=$this->Modelos[$this->Blocos[$Modelo_Nome]];
$Inicio_Bloco="<!-- INICIA BLOCO DINAMICO: $Modelo_Nome -->";
$Fim_Bloco="<!-- FINALIZA BLOCO DINAMICO: $Modelo_Nome -->";
$m_Modelo=preg_replace("/$Inicio_Bloco(.*)$Fim_Bloco/s","\{$Marca_Saida}",$m_Modelo);
$this->Modelos[$this->Blocos[$Modelo_Nome]]=$m_Modelo;
unset($m_Modelo);
return true;
}
function Retorna($Marca_Nome)
{
return $this->Marcas["\{$Marca_Nome}"];
}
function Limpa_Dinamico($Sessao_Saida,$Nome_Bloco=NULL)
{
if(!$Nome_Bloco)
{
$Nome_Bloco="([a-zA-Z0-9_]+)";
}
$m_Modelo=$this->Marcas["\{$Sessao_Saida}"];
$Inicio_Bloco="<!-- INICIA BLOCO DINAMICO: $Nome_Bloco -->";
$Fim_Bloco="<!-- FINALIZA BLOCO DINAMICO: $Nome_Bloco -->";
$m_Modelo=preg_replace("/$Inicio_Bloco(.*)$Fim_Bloco/s"," ",$m_Modelo);
$this->Marcas["\{$Sessao_Saida}"]=$m_Modelo;
return true;
}
function Modelo_Imprime($Marca_Nome)
{
echo $this->Retorna($Marca_Nome);
}
function Limpa($Marca_Nome)
{
unset($this->Marcas["\{$Marca_Nome}"]);
return true;
}
function Carrega_Arquivo($Caminho_Arquivo)
{
if(FALSE === ($ID_Arquivo=@fopen($this->Raiz.$Caminho_Arquivo,'r')))
{
user_error("Modelo::Carrega_Arquivo()-Falha ao abrir arquivo do modelo: ".$this->Raiz.$Caminho_Arquivo);
return false;
}
if(-1 === ($Conteudo_Arquivo=@fread($ID_Arquivo,@filesize($this->Raiz.$Caminho_Arquivo))))
{
user_error("Modelo::Carrega_Arquivo()-Falha ao abrir arquivo do modelo: ".$this->Raiz.$Caminho_Arquivo);
return false;
}
fclose($ID_Arquivo);
return $Conteudo_Arquivo;
}
}
?>