26 de Enero, 2010
Uso del patron Factory para no crear diferentes instancias sobre el mi...
<?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 */ } /** Presentamos variables para debug */ function debug() { $salida = "\nVariables: "; $salida .= "\nDescripciones: "; 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; /* Los valores del array del archivo son introducidos en $this->variables */ } /** 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) { 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); } return $this->descripciones[$idioma][$variable]; } else { return FALSE; } } /** * Borrar variable * * @param $variable Variable a borrar */ function del($variable) { $this->variables_modificadas = TRUE; /* Borramos descripciones en todos los idiomas */ /* Buscar ficheros de idiomas */ /* 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; 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; } $this->escribirArchivos($archivo_descripciones, $this->descripciones[$idioma], $this->nombre_array.'_DESC'); return TRUE; } /** Pasar contenido a archivos php */ function escribirArchivos($archivo, $datos, $nombre_array) { throw new Exception("No se puede escribir en ".$archivo); return FALSE; } throw new Exception("No se puede escribir en ".$archivo); return FALSE; } } } else { // No es un array 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 */ foreach ( $this->descripciones_modificadas as $i => $dm ) { if ( $dm ) { $this->guardar_descipciones($i); } } } } } ?>