<?php
class plantilla {
var $nombreclase = "plantilla";
/* SI TRUE, imprimimos asignaciones */
var $debug = false;
/* $fichero[manejador] = "nombrefichero"; */
var $fichero = array();
/* los fichero son tomados respecto a esta ruta */
var $path = "";
/* $claves[clave] = "clave"; $valores[clave] = "valor"; */
var $claves = array();
var $valores = array();
/* "eliminar" => elimina las variables indefinidas
* "comentar" => pone las variables indefinidas entre comentarios
* "mantener" => mantiene las variables indefinidas
*/
var $indefinidas = "eliminar";
/* "si" => mata el php , "reportar" => reporta el error y continue, "no" => ignora el error */
var $detener_si_error = "si";
/* aqui guardamos el ultimo mensaje de error */
var $ultimo_error = "";
//+++++++++++ modificacion
var $bloques = array();
//+++++++++++ fin modificacion
//=======================================================================================
// FUNCIONES
//----------------------------------------------------------------------------------------
// Plantilla (constructor)
// $path es el path al que haran referencia todas las rutas
// $indefinidos determina que se hara con las variables no definidas
// puede valer "eliminar", "mantener", "comentar";
function plantilla($path = ".", $indefinidos = "eliminar"){
$this->asignar_path($path);
$this->asignar_indefinidos($indefinidos);
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//funcion asignar_path
// $path es el path al que haran referencia todas las rutas
function asignar_path($path) {
if (!is_dir($path)) {
$this->error("asignar_path: $path no es un directorio.");
return false;
}
$this->path = $path;
return true;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
// funcion debug
// $valor --> true, false;
function debug($valor){
$this->debug=$valor;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
// funcion asignar_indefinidos
// $indefinidos determina que se hara con las variables no definidas
// puede valer "eliminar", "mantener", "comentar";
function asignar_indefinidos($indefinidos = "mantener"){
$this->indefinidos = $indefinidos;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
// funcion asignar_fichero
// $manejador nombre que se le va a dar al manejador del fichero
// $nombrefichero es el nombre del fichero a abrir
function asignar_fichero($manejador, $nombrefichero=""){
if (!is_array($manejador)) {
if ($nombrefichero == "") {
$this->error("asignar_fichero: Para el Manejador $manejador el fichero esta vacĂo.");
return false;
}
$this->fichero[$manejador] = $this->nombrefichero($nombrefichero);
} else {
reset($manejador);
while(list($h, $f) = each($manejador)) {
$this->fichero[$h] = $this->nombrefichero($f);
}
}
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
// funcion asignar_bloque
// $padre nombre del manejador que es padre de este
// $manejador nombre del bloque en la plantilla
// (en la plantilla existira <!-- BEGIN $manejador -->...<!-- END $manejador-->)
// $nombre nombre para sustituir
function asignar_bloque($padre , $manejador , $nombre=""){
if (!$this->cargar_fichero($padre)) {
$this->error("asignar_bloque: no se puede cargar $padre.");
return false;
}
if ($nombre == "")
$nombre = $manejador;
$str = $this->tomar_variable($padre);
$reg = "/<!--\s+BEGIN $manejador\s+-->(.*)\n\s*<!--\s+END $manejador\s+-->/sm";
preg_match_all($reg, $str, $m);
$str = preg_replace($reg, "{". "$nombre}", $str);
$this->asignar_variable($manejador, $m[1][0]);
$this->asignar_variable($padre, $str);
//+++++++++++ modificacion
$this->bloques[$nombre]=$padre;
//+++++++++++ fin modificacion
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//funcion asignar_variable
// $nombres nombre/s de las variables
// $valor valor/es a asignar
function asignar_variable($nombres, $valor = ""){
if (!is_array($nombres)) {
if (!empty($nombres))
if ($this->debug) print "DEBUG -:escalar:- : poniendo *$nombres* a *$valor*<br>\n";
$this->claves[$nombres] = "/".$this->nombrevariable($nombres)."/";
$this->valores[$nombres] = $valor;
} else {
reset($nombres);
while(list($k, $v) = each($nombres)) {
if (!empty($k))
if ($this->debug) print "DEBUG -:lista:- : poniendo *$k* a *$v*<br>\n";
$this->claves[$k] = "/".$this->nombrevariable($k)."/";
$this->valores[$k] = $v;
}
}
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//funcion subst
// $manejador es un manejador valido
function subst($manejador){
if (!$this->cargar_fichero($manejador)) {
$this->error("subst: No se puede cargar $manejador.");
return false;
}
$str = $this->tomar_variable($manejador);
$str = @preg_replace($this->claves, $this->valores, $str);
return $str;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//funcion psubst
// $manejador es un manejador valido
function psubst($manejador){
print $this->subst($manejador);
return false;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//calcular
// $destino nombre del manejador en el que se guardara el resultado
// $manejador nombre del manejador que vamos a calcular
// $concatenar valores: true, false
function calcular($destino, $manejador, $concatenar=false){
if (!is_array($manejador)) {
$str = $this->subst($manejador);
if ($concatenar) {
$this->asignar_variable($destino, $this->tomar_variable($destino) . $str);
} else {
$this->asignar_variable($destino, $str);
}
//++++++++ modificacion
reset($this->bloques);
do{
if (current($this->bloques)==$manejador) $this->asignar_variable(key($this->bloques),"");
}while (next($this->bloques));
//++++++++ fin modificacion
} else {
reset($manejador);
while(list($i, $h) = each($manejador)) {
$str = $this->subst($h);
$this->asignar_variable($destino, $str);
//++++++++ modificacion
reset($this->bloques);
do{
if (current($this->bloques)==$h) $this->asignar_variable(key($this->bloques),"");
}while (next($this->bloques));
//++++++++ fin modificacion
}
}
return $str;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function calcular_imprimir($destino, $manejador, $concatenar=false){
print $this->calcula($destino, $manejador, $concatenar);
return false;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function tomar_variables(){
reset($this->claves);
while(list($k, $v) = each($this->claves)) {
$result[$k] = $this->valores[$k];
}
return $result;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function tomar_variable($nombre){
if (!is_array($nombre)) {
return $this->valores[$nombre];
} else {
reset($nombre);
while(list($k, $v) = each($nombre)) {
$result[$k] = $this->valores[$k];
}
return $result;
}
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function tomar_indefinido($manejador){
if (!$this->cargar_fichero($manejador)) {
$this->error("tomar_indefinido: imposible cargar $manejador.");
return false;
}
preg_match_all("/\{([^}]+)\}/", $this->tomar_variable($manejador), $m);
$m = $m[1];
if (!is_array($m))
return false;
reset($m);
while(list($k, $v) = each($m)) {
if (!isset($this->claves[$v]))
$result[$v] = $v;
}
if (count($result))
return $result;
else
return false;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function terminar($str){
switch ($this->indefinidos) {
case "mantener":
break;
case "eliminar":
$str = preg_replace("/{[^ \t\r\n}]+}/", "", $str);
break;
case "comentar":
$str = preg_replace("/{([^ \t\r\n}]+)}/", "<!-- Plantilla: Variable '\\1' indefinida -->", $str);
break;
}
return $str;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function imprimir($nombre){
print $this->terminar($this->tomar_variable($nombre));
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function i($varname){
print $this->terminar($this->tomar_variable($nombre));
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function tomar($nombre) {
return $this->terminar($this->tomar_variable($nombre));
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function t($varname){
return $this->terminar($this->tomar_variable($nombre));
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function nombrefichero($nombrefichero){
if (substr($nombrefichero, 0, 1) != "/") {
$nombrefichero = $this->path."/".$nombrefichero;
}
if (!file_exists($nombrefichero))
$this->error("nombrefichero: el fichero $nombrefichero no existe.");
return $nombrefichero;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function nombrevariable($nombre){
return preg_quote("{".$nombre."}");
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function cargar_fichero($manejador){
if (isset($this->claves[$manejador]) and !empty($this->valores[$manejador]))
return true;
if (!isset($this->fichero[$manejador])) {
$this->error("cargar_fichero: $manejador no es un manejador valido.");
return false;
}
$nombrefichero = $this->fichero[$manejador];
$str = implode("", @file($nombrefichero));
if (empty($str)) {
$this->error("cargar_fichero: Mientras se estaba cargando $handle, $nombrefichero no existia o estaba vacio.");
return false;
}
$this->asignar_variable($manejador, $str);
return true;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function error($msg){
$this->ultimo_error = $msg;
if ($this->detener_si_error != "no")
$this->error_mensaje($msg);
if ($this->detener_si_error == "si")
die("<b>Detenido.</b>");
return false;
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
function error_mensaje($msg){
printf("<b>Error de Plantilla:</b> %s<br>\n", $msg);
}
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
}
?>