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('\'), $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;
}
}
?>