Location: PHPKode > scripts > Pagina > pagina/modelo.php
<?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;
}
}
?>
Return current item: Pagina