27/02/2006, 03:09
|
| | Fecha de Ingreso: febrero-2006
Mensajes: 4
Antigüedad: 18 años, 8 meses Puntos: 0 | |
MGTheme.php
Código:
<?php
/*
+----------------------------------------------------------------------
| Class MGTheme
| ========================================
| @developer Marioly Garza
| @copyright (C) 2005 MariolyGroup
| @license GNU/GPL
|
| ========================================
| @Web hackyashira.com
| @Email [email protected]
+-----------------------------------------------------------------------
|
| > Clase para manejo de archivos template
| + Manejo de variables
| + Blockes
| + Sub-Blockes
| + Archivos anidados
|
+----------------------------------------------------------------------
*/
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();
/**
* Class Constructor
* Define el directorio principal de templates
*
* @param string $home directorio de templates
* @access public
*/
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;
}
/**
* Asigna archivos template
*
* @param array $archivos array asociativo de archivos
* @access public
*/
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;
}
/**
* Imprime resultado final
*
* @param string $archivo archivo a imprimir
* @access public
*/
function Mostrar($archivo)
{
if (!$this->archivos[$archivo])
{
die("MGTheme->Mostrar(): No existe archivo asignado a " . $archivo);
}
//Verificar archivos asignados a parse
$this->CheckAsignArc();
//Mostrar resultado final
print $this->Compilar($this->archivos[$archivo]);
}
/**
* Asigna variable de archivo anidado.
*
* @param string $var nombre variable
* @param $archivo referencia de archivo
* @access public
*/
function AsignarVarArc($var, $archivo)
{
if (!$this->archivos[$archivo])
{
die("MGTheme->AsignarVarArc(): No existe archivo asignado a " . $archivo);
}
$this->datos_arc[$var] = $archivo;
return true;
}
/**
* Asigna valor a variables tpl de blocke
*
* @param string $blocke nombre blocke
* @param array $valores array asociativo de valores
* @access public
*/
function AsignarBlocke($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;
}
/*
* Asigna valor a variables tpl
*
* @param array $valores array asociativo de valores
* @access public
*/
function AsignarVars($valores)
{
reset($valores);
while(list($var, $valor) = each($valores))
{
$this->datos_var[$var] = $valor;
}
return true;
}
/**
* Asigna valor a solo una variable tpl
*
* @param string $var nombre var
* @param string $valor valor var
* @access public
*/
function AsignarVar($var, $valor)
{
$this->datos_var[$var] = $valor;
return true;
}
/**
* Verifica archivos asignados a parse
*
* @access public
*/
function CheckAsignArc()
{
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->AsignarVar($var, $data);
}
}
return true;
}
/**
* Procesa el contenido del archivo cambiando variables tpl
* por el valor programado y retorna resultado final
*
* @param string $archivo archivo a procesar
* @access public
*/
function Compilar($archivo)
{
$cont = implode("", @file($archivo));
if (empty($cont))
{
die('MGTheme->Compilar(): El archivo esta vacio.');
}
if(!empty($this->datos_var))
{
reset($this->datos_var);
while(list($var, $valor) = each($this->datos_var))
{
// Remplazar variables
$cont = str_replace("{" . $var . "}", preg_replace(array('/{/', '/}/'), array('&mgv;', '&mlv;'), $valor), $cont);
}
}
$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);
}
}
//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('/{(.*?)}/', '', $cont);
$cont = preg_replace(array('/&mgv;/i', '/&mlv;/i'), array('{', '}'), $cont);
return $cont;
}
/**
* Metodo recursivo para blockes y sub-blockes
* lo que hace posible procesar arreglos tipo:
* $this->datos_blk['parent'][]['$child'][]['$child2'][]...['$childN']
*
* @param string $texto texto a procesar
* @param object $objeto objeto a desglosar
* @param string $blocke nombre blocke
* @param string $orig_blocke blocke padre (si existe)
* @param bool $sub indicativo de sub-blocke
* @access public
*/
function Blk($texto, $objeto, $blocke, $orig_blocke = '', $sub = false)
{
if(empty($blocke))
{
return $texto;
}
$texto_blk = '';
// Contenido original de blocke
if(preg_match("/<!-- BEGIN " . $blocke . " -->(.*?)<!-- END " . $blocke . " -->/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 . "." . $var . "}/";
$repl_blk[] = preg_replace(array('/{/', '/}/'), array('&mgv;', '&mlv;'), $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;
}
}
?>
|