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("@(.*?)@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('@(.*)@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("/(.*?)/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("@(.*?)@sU", $final_blocke[$blocke], $texto) : $final_blocke[$blocke]; return $texto; } } ?>