Location: PHPKode > projects > NAR contents manager > software/plantilla/plantilla.php
<?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);
  }
  //----------------------------------------------------------------------------------------
  //----------------------------------------------------------------------------------------
}

?>
Return current item: NAR contents manager