All pastes #595834 Raw Edit

Stuff

public text v1 · immutable
#595834 ·published 2007-06-29 17:58 UTC
rendered paste body
<?php
/*
+----------------------------------------------------------------------
|           Class MGTheme
|   ========================================
|   @developer  Marioly Garza
|   @copyright (C) 2005  MariolyGroup
|   @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
|
|   ========================================
|   @Web http://www.marioly.com
|   @Email marioly@marioly.com
+-----------------------------------------------------------------------
|
|   > Clase para manejo de archivos template
|   + Manejo de variables
|   + Blockes
|   + Sub-Blockes
|   + Archivos anidados
|
+----------------------------------------------------------------------
*/


if(!defined('MG_DIR'))
{
      die('Error de Seguridad');   
}

class MGTheme
{
   // Directorio de templates
   var $home = '';
   // Archivos template
   var $archivos = array();
   // Vars tpl
   var $datos_var = array();
   // Vars tpl de blocke
   var $datos_blk = array();
   // Archivos Asignados a parse
   var $datos_arc = array();
   

    function MGTheme($home = "./")
    {
	    if(!is_dir($home))
	    {
	        die('MGTheme: Error al abrir el directorio de templates.');
	    }
	   
	    $home = (substr($home, -1) != '/') ? $home . "/" : $home;

	    $this->home = $home;
	}

	function cargar($archivos)
	{
		if (!is_array($archivos))
		{
			return false;
		}

		reset($archivos);
		while(list($nombre, $archivo) = each($archivos))
		{
			$this->archivos[$nombre] = $this->home . $archivo;
			if(!file_exists($this->archivos[$nombre]))
			{
			   die("MGTheme->Cargar(): El archivo " . $this->archivos[$nombre] . " no existe."); 
			}
		}

		return true;	   
	}

	function mostrar($archivo)
	{
		if (!$this->archivos[$archivo])
		{
			die("MGTheme->Mostrar(): No existe archivo asignado a " . $archivo);
		}
		//Verificar archivos asignados a parse
		$this->check_assign_arc();
        
		//Mostrar resultado final
        print $this->Compilar($this->archivos[$archivo]);
	}
    
	function asignar_var_arc($var, $archivo)
	{
	   	if (!$this->archivos[$archivo])
		{
			die("MGTheme->Asignar_var_arc(): No existe archivo asignado a " . $archivo);
		}
		
		$this->datos_arc[$var] = $archivo;
	
		return true;
	}
	
	function asignar_blocke($blocke, $valores)
	{    
		if (strstr($blocke, '.'))
		{
			// Sub-Blocke
			$blockes = explode('.', $blocke);
			$blockcount = sizeof($blockes) - 1;
			$str = '$this->datos_blk';
			for ($i = 0; $i < $blockcount; $i++)
			{
				$str .= '[\'' . $blockes[$i] . '\']';
				eval('$lastiteration = sizeof(' . $str . ') - 1;');
				$str .= '[' . $lastiteration . ']';
			}
			$str .= '[\'' . $blockes[$blockcount] . '\'][] = $valores;';

			eval($str);
		}
		else
		{
		     //Blocke Normal
	         $this->datos_blk[$blocke][] = $valores;
		}
		 
	    return true;
	}
 
    function asignar_vars($valores)
	{
	      reset($valores);
	      while(list($var, $valor) = each($valores))
		  {
		     $this->datos_var[$var] = $valor; 
		  }
		  
	      return true;
	}	

	function asignar_var($var, $valor)
	{
	    $this->datos_var[$var] = $valor;
		
		return true;
	}
 
	function check_assign_arc()
	{
	   if(!empty($this->datos_arc))
	   {
	       while(list($var, $archivo) = each($this->datos_arc))
		   {
		      $data = '';
			  //Obtener contenido parseado del archivo
		      $data = $this->compilar($this->archivos[$archivo]);
			  //Asignar el contenido a la variable especificada
			  $this->asignar_var($var, $data);
		   }
	   }
	   
	   return true;
	}	

	function compilar($archivo)
	{

		$cont = implode("", @file($archivo));
		if (empty($cont))
		{
			die('MGTheme->Compilar(): El archivo esta vacio.');
		}
		  
	    $final_blocke = array();
		
		if(!empty($this->datos_blk))
		{  
		    reset($this->datos_blk);
            // Blockes			
            while(list($block) = each($this->datos_blk))
			{
		        $final_blocke[$block] = $this->blk($cont, $this->datos_blk, $block, '', false);
               
			    $cont = preg_replace("@<!--\s+BEGIN\s+" . $block . "\s+-->(.*?)<!--\s+END\s+" . $block . "\s+-->@sm", $final_blocke[$block], $cont);			  	
            }
			
		} 
		  	        
        if(!empty($this->datos_var))
		{
	      reset($this->datos_var);
	    //  while(list($var, $valor) = each($this->datos_var))
		  foreach( $this->datos_var as $var => $valor )
		  {
		     // Remplazar variables
		     $cont = preg_replace("/{" . $var . "}/iU", $this->sanitaze_var($valor), $cont);
		  }	 
		}
		  
		//Anular blockes no usados
        $cont = preg_replace('@<!--\s+BEGIN\s+([0-9A-Za-z_-]+)\s+-->(.*)<!--\s+END\s+\1\s+-->@sU', '', $cont);

		//Anular variables no usadas
		$cont = preg_replace(array('#{([a-zA-Z0-9\._-]+)}#', '#&\#092;#'), array('', '\\'), $cont); // Estupidos errores en js si no regreso las llaves ¬¬
		
		return $cont;		
	}
	
    function sanitaze_var($value) 
	{
	    $value = preg_replace(array('#\\\#'), array('&#092;'), $value);
		return $value;
	}
	
    function blk($texto, $objeto, $blocke, $orig_blocke = '', $sub = false)
    {
        if(empty($blocke))
		{
		   return $texto;
        }

        $texto_blk = '';
		
		// Contenido original de blocke
        if(preg_match("/<!--\s+BEGIN " . $blocke . "\s+-->(.*?)<!--\s+END " . $blocke . "\s+-->/sU", $texto, $text))
        {
             $texto_blk = $text[1];
        }
					   
        $orig_blocke = ($sub == true) ? $orig_blocke . "." : "";
   			   
        $final_blocke = array();

        $contar = sizeof($objeto[$blocke]) - 1;
        
		// Definir remplazos
        for($i = 0; $i <= $contar; $i++)
        {
            $orig_blk = $repl_blk = $sublock = array();

	        foreach($objeto[$blocke][$i] as $var => $valor)
	        {
			     if(is_array($valor) && !in_array($var, $sublock) && !empty($var))
				 {
				    $sublock[] = $var;
				 }
				 else
				 {
	               $orig_blk[] = "/{" . $orig_blocke . $blocke . "." . preg_replace("/\W/", "", $var) . "}/iU";
				   $repl_blk[] = $this->sanitaze_var($valor);
				 }
	        }
            
			$texto_proc = $texto_blk;
			
			// Rutina de Sub-blockes (sino existe solo retornamos texto)
			$contar2 = sizeof($sublock) - 1;
			for($m = 0; $m <= $contar2; $m++)
			{
		      $texto_proc = $this->blk($texto_proc, $objeto[$blocke][$i], $sublock[$m], $blocke, true);
            }
			
			// blocke final (vector)
	        $final_blocke[$blocke] .= preg_replace($orig_blk, $repl_blk, ' ' . $texto_proc . ' ');
        }   
		
        // Si es Sub-blocke remplazamos contenido, sino solo devolvemos texto
        $texto = ($sub == true) ? preg_replace("@<!--\s+BEGIN\s+" . $blocke . "\s+-->(.*?)<!--\s+END\s+" . $blocke . "\s+-->@sU", $final_blocke[$blocke], $texto) : $final_blocke[$blocke];			  

        return $texto;
   }

}

?>