<?php
/**
* @file GcmConfig.php
* @author Eduardo Magrané
*
* @internal
* Created 21/01/10
* Revision SVN $Id: GcmConfig.php 140 2010-01-22 15:54:59Z eduardo $
* Copyright Copyright (c) 2010, Eduardo Magrané
*
* This source code is released for free distribution under the terms of the
* GNU General Public License as published by the Free Software Foundation.
*/
/**
* @class GcmConfig
*
* @brief Lectura y edición de archivos de configuración
*
* Esta clase nos permite leer archivos de configuración nativos de php y
* a la vez la edición de su contenido con formularios php.
*
* Inspirado en @see http://www.jourmoly.com.ar/introduccion-a-mvc-con-php-segunda-parte/
*
* Uso:
*
* Formato para el archivo que contiene las variables de configuración TGC.php:
*
* <pre>
* <?php
* $TGC[v1]="variable1";
* $TGC[v2]="variable2";
* $TGC[v3]="variable3";
* ?>
* </pre>
*
* Formato para archivo de descripciones TGC_es.php:
*
* <pre>
* <?php
* $TGC_DESC[v1]="descripcion_variable1";
* $TGC_DESC[v2]="descripcion_variable2";
* $TGC_DESC[v3]="descripcion_variable3";
* $TGC_DESC[v4]="descripcion_variable4";
* $TGC_DESC[v5]="descripcion_variable5";
* $TGC_DESC[v6]="descripcion_variable6";
* ?>
* </pre>
*
* <pre>
* $config = new GcmConfig('config/TGC.php');
* $variable1 = $config->get('v1');
* $config->set('v1','NUEVO VALOR PARA v1');
* $config->setDescripcion('v1','NUEVO VALOR PARA DESCRIPCION v1');
* $config->del('v4');
* </pre>
*
* La clase recibe la ruta del archivo que contiene las variables, a partir de la ruta
* se deduce el nombre de la variable, que sera el del archivo sin '.php'.
*
* Los ficheros de idiomas contendran su especificación en el nombre, ejemplo: TGC_es.php
*
* @version 0.1
*/
class GcmConfig {
private $variables; ///< Variables del archivo de configuración
private $descripciones; ///< Descripciones de las variables
private $archivo; ///< Ruta de archivo que contiene el array con las variables
private $nombre_array; ///< Nombre del array que contiene las variables;
private $variables_modificadas = FALSE; ///< Para saber si hubo modificaciones para guardar
private $descripciones_modificadas = FALSE; ///< Para saber si hubo modificaciones para guardar
/**
* Array para saber si ya se recogieron las descripciones de los diferentes idiomas
*/
private $descripciones_recogidas = FALSE;
public $idioma = 'es'; ///< Idioma de las descripciones por defecto
function __construct($archivo) {
$this->archivo = $archivo;
throw new Exception("Archivo de configuración ".$this->Archivo." no existe");
}
include ($this->archivo);
/* Los valores del array del archivo son introducidos en $this->variables */
eval( '$this->variables = $'.$this->nombre_array.';');
}
/** Presentamos variables para debug */
function debug() {
$salida = "\nVariables: ";
$salida .= print_r($this->variables,TRUE); $salida .= "\nDescripciones: ";
$salida .= print_r($this->descripciones,TRUE);
return $salida;
}
/**
* Recuperamos descripciones en caso de ser necesario
*
* @param $idioma Idioma de las descripciones
*/
function recoger_descripciones($idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
if ( $this->descripciones_recogidas[$idioma] == TRUE ) {
return;
}
$this->descripciones_recogidas[$idioma] = TRUE;
include (dirname($this->archivo).'/'.$this->nombre_array.'_'.$idioma.'.php');
/* Los valores del array del archivo son introducidos en $this->variables */
eval( '$this->descripciones['.$idioma.'] = $'.$this->nombre_array.'_DESC;');
}
/** Devolver array con las variables */
function variables() { return $this->variables; }
/** Devolver array con las descripciones */
function descripciones($idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
return $this->descripciones[$idioma];
}
/** Con set vamos guardando nuestras variables. */
function set($variable, $valor) {
$this->variables_modificadas = TRUE;
$this->variables[$variable] = $valor;
}
/** Guardar valor para descripción */
function setDescripcion($variable, $descripcion, $idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
$this->recoger_descripciones($idioma);
$this->descripciones_modificadas[$idioma] = TRUE;
$this->descripciones[$idioma][$variable] = $descripcion;
}
/** Con get('nombre_de_la_variable') recuperamos un valor */
function get($variable) {
if(isset($this->variables[$variable])) { return $this->variables[$variable];
} else {
return FALSE;
}
}
/** Con getDescripcion('nombre_de_la_variable') recuperamos la descripción */
function getDescripcion($variable, $idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
/* Si no tenemos las descripciones hay que recuperarlas */
if ( !$this->descripciones_recogidas[$idioma] ) { $this->recoger_descripciones($idioma); }
if(isset($this->descripciones[$idioma][$variable])) { return $this->descripciones[$idioma][$variable];
} else {
return FALSE;
}
}
/**
* Borrar variable
*
* @param $variable Variable a borrar
*/
function del($variable) {
$this->variables_modificadas = TRUE;
unset($this->variables[$variable]);
/* Borramos descripciones en todos los idiomas */
/* Buscar ficheros de idiomas */
$fidiomas = glob(dirname($this->archivo).'/'.$this->nombre_array.'_*.php');
/* Recorrer cada idioma para eliminarlo */
foreach( $fidiomas as $f ) {
$this->delDescripcion($variable, $idioma);
}
return TRUE;
}
/**
* Borrar descripción
*
* @param $variable Variable a borrar su descripción
*/
function delDescripcion($variable, $idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
$this->recoger_descripciones($idioma);
$this->descripciones_modificadas[$idioma] = TRUE;
unset($this->descripciones[$idioma][$variable]); return TRUE;
}
/** Guardar cambios de variables en archivo */
function guardar_variables() {
$this->escribirArchivos($this->archivo, $this->variables, $this->nombre_array);
return TRUE;
}
/** Guardar cambios de descripciones en archivo */
function guardar_descipciones($idioma = NULL) {
$idioma = ( $idioma ) ? $idioma : $this->idioma ;
/* Miramos si han habido cambios antes de escribir archivo sino nos crearia un
* archivo sin contenido
*/
if ( $this->descripciones_modificadas[$idioma] != TRUE ) {
return TRUE;
}
$archivo_descripciones = dirname($this->archivo).'/'.$this->nombre_array.'_'.$idioma.'.php';
$this->escribirArchivos($archivo_descripciones, $this->descripciones[$idioma], $this->nombre_array.'_DESC');
return TRUE;
}
/** Pasar contenido a archivos php */
function escribirArchivos($archivo, $datos, $nombre_array) {
if (!$file = fopen($archivo, "w")) { throw new Exception("No se puede escribir en ".$archivo);
return FALSE;
}
while (list($clave, $val)=each($datos)){
if ( is_array($val)) { // si es un array
while (list($claveArray, $valorArray)=each($val)) {
$valorArray=str_replace('\'','\\\
'',$valorArray); // Tratamiento de las comillas if (fputs($file, '$'."$nombre_array"."['".$clave."'][]='".$valorArray."';\n") === FALSE ) { throw new Exception("No se puede escribir en ".$archivo);
return FALSE;
}
}
} else { // No es un array
$val=str_replace('\'','\\\
'',$val); // Tratamiento de las comillas if (fputs($file, '$'."$nombre_array"."['".$clave."']='".$val."';\n") === FALSE ) { throw new Exception("No se puede escribir en ".$archivo);
return FALSE;
}
}
}
}
return TRUE;
}
/** Antes de terminar guardar cambios si los han habido */
function __destruct() {
if ( $this->variables_modificadas ) { $this->guardar_variables(); }
/* Recorremos array de descripciones_modificadas para saber cuales hay que actualizar */
if ( !empty($this->descripciones_modificadas) ) {
foreach ( $this->descripciones_modificadas as $i => $dm ) {
if ( $dm ) { $this->guardar_descipciones($i); }
}
}
}
}
?>