Llevo varios días metido de lleno desarrollando una clase, que para mi me va a ser de mucha utilidad, y para vosotros puede que también, por eso voy a compartirla, para sacarle todos los defectos que puediera tener y para que todos vosotros también podais hacer uso de ella.
La clase yo la tenía pensada para realizar traducciones de mi Website a varios idiomas, pero pueden darsele muchas utilidades. Sólo hay que echarle un poco de imaginación.
Esta clase se encarga de leer en un fichero con el siguiente formato:
Código:
Cada fichero tiene que empezar por el comando '{' y acabar '}' (puede cambiarse, para personalizar el tipo de ficheros etc...). Todo lo que esté encerrado dentro de estos corchetes es un bloque. Nuestro fichero de traducción (o de instrucciones, o como quieras llamarlo, según su utilidad) puede estar dividido en varios bloques.#Fichero de traducción, bloque 0 { CODIGO=RESULTADO MENU_LATERAL_IZQUIERDA=Menu izquierda MENU_TOP=Menú top 8441=Esto es un ejemplo de como funciona etc... } #Fichero de traducción, bloque 1 { MENU_LATERAL_DERECHA=Menu derecha MENU_BOTTOM=Menú pie de página 8442=Esto es otro ejemplo de como funciona etc... }
El que este dividido en varios bloques es para dar la opción de elección, y de esta forma poder seleccionar solo aquellos bloques de los que vayas a hacer uso. Si te organizas bien los ficheros de traducción, esta puede ser una opción interesante, pero no la más rápida, ya que el servidor carga con más (se supone que el fichero es más grande y complejo, y requiere más tiempo para procesarlo), por ello yo recomiendo intentar separar más por ficheros, y no englobar todo en uno. Pero claro, todo depende del uso, y de como sea este.
Dejando un poco el fichero, pasamos a la clase, para gestionar el fichero.
Código PHP:
<?php
class codigoTexto{
/** Contiene todo el fichero de instrucciones.
* @access private
**/
var $fichero;
/** Contiene un array con todos los bloques seleccionados.
* @access private
**/
var $arrayBloques;
/** Contiene un array con la estructura: [codigo]=texto.
* @access private
**/
var $arrayCodigoTexto;
/** Contiene el número de entradas disponibles.
* @access public
**/
var $totalEntradas;
/** Almacena un pequeña descripción del error ocurrido.
* @access private
**/
var $error;
/** Función constructor. Desde aquí se maneja practicamente toda la clase.
* @access public
* @param $fichero Ruta del fichero de instrucciones en texto plano.
* @param $bloque "Partes" del fichero de instrucciones seleccionadas. Por ejemplo: "1,7,12"
**/
function codigoTexto($fichero,$bloque=-1,$separadorInicio='{',$separadorFinal='}'){
if($this->cargar($fichero)){
if($this->bloques($bloque,$separadorInicio,$separadorFinal)){
$this->clasificarCodigoTexto($this->arrayBloques);
}
else{
echo $this->error();
}
}
else{
echo $this->error();
}
}
/** Carga el fichero en una variable para poder ser procesado.
* @access private
* @param $fichero Ruta del archivo (texto plano).
**/
function cargar($fichero){
# Comprobamos que el fichero el posible leerlo. Sino se producirá un error.
if(is_readable($fichero) === true){
# Leemos y almacenamos el contenido.
if(($contenido=file_get_contents($fichero)) == true){
$this->fichero=$contenido;
return true;
}
else{
$this->error('El fichero no existe o está protegido contra escritura.');
return false;
}
}
else{
$this->error('El fichero no existe o está protegido contra escritura.');
return false;
}
}
/** Se encarga de fraccionar el fichero de instrucciones en bloques. Una vez fraccionado, se siguen los
* siguientes criterios:
* - Si la variable de la función, $bloquesSelec, es igual a -1, almacena en la dimensión 0 de la propiedad,
* $arrayBloques, todo el archivo de traducción.
* - Si la variable de la función, $bloqueSelec, es diferente a -1 y con el siguiente formato: "0,3,7...n"
* (cada número es un bloque, no importa su orden), se copiará a la propiedad, $arrayBloques, solo aquellos
* bloques indicados en la cadena anterior.
* @access private
* @param $bloqueSelec Partes del fichero de instrucciones seleccionados para ser procesados. Leer más arriba
* su funcionamiento.
* @param $separadorInicio Indica a la función el caracter por el cual empieza el bloque.
* @param $separadosFinal Indica a la función el caracter por el cual termina el bloque.
**/
function bloques($bloquesSelec=-1,$separadorInicio='{',$separadorFinal='}'){
if(preg_match_all('/'.$separadorInicio.'([^}]+)'.$separadorFinal.'/',$this->fichero,$bloques)){
if($bloquesSelec === -1){
$this->arrayBloques[0]=$bloques[1][0];
return true;
}
else{
$bloquesSelec=explode(',',$bloquesSelec);
for($i=0;$i<=count($bloquesSelec);$i++){
$this->arrayBloques[$i]=$bloques[1][$bloquesSelec[$i]];
}
return true;
}
}
else{
$this->error('El fichero no es válido o a ocurrido algún error.');
return false;
}
}
/** Se encarga de procesar los bloques extraídos de el fichero de instrucciones. Los datos los guarda en la
* propiedad, $arrayCodigoTexto. El funcionamiento del array es muy lógico:
* - La dimensión 0 almacena el código (puede ser númerico o alfanúmerico) que tiene relacionado a él la cadena
* de texto. Ejemplo: Bloque: { CODIGO=texto } PHP: <? echo $arrayCodigoTexto['CODIGO'] ?>. Esto imprimirá "texto".
* La función es capaz de procesar arrays con el formato: $array['nombre']=CONTENIDO.
* @access private
* @param $cadenaAnalizar Puede pasarse una simple cadena de instrucciones o un array.
**/
function clasificarCodigoTexto($cadenaAnalizar){
if(is_array($cadenaAnalizar)){
foreach($cadenaAnalizar as $puntero){
$this->clasificarCodigoTexto($puntero);
}
}
else{
if(($this->totalEntradas=preg_match_all('/([0-9]+|[\w]+)=(\w+)\s/',$cadenaAnalizar,$entradas)) > 0){
$i=0;
foreach($entradas[1] as $identificador){
$this->arrayCodigoTexto[$identificador]=$entradas[2][$i];
$i++;
}
}
}
}
/** Accede a la variable $arrayCodigoTexto con el código preindicado.
* @access public
* @param $codigo Código del cual queremos obtener la cadena de texto relacionado con él.
**/
function codigo($codigo){
if(isset($this->arrayCodigoTexto[$codigo])){
return $this->arrayCodigoTexto[$codigo];
}
else{
$this->error('No se ha encontrado la clave buscada.');
}
}
/**
@access private
**/
function error($error=''){
if(empty($error)){
echo $this->error;
}
else{
$this->error=$error;
}
}
}
?>
Código PHP:
include('lib/clases/class_traduccion.inc.php');
$a=new codigoTexto('leng_cms-es-ES.lng');
echo $a->codigo('MENU_TOP');
Código:
Estoy pensando en añadir más cosas (entre ellas alguna función que acceda a variables), pero eso más adelante.Menú top
Que les parece? Que cambirían? Que añadirían?
Gracias