Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clase Codigo=Texto

Estas en el tema de Clase Codigo=Texto en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas tardes a todos!! Llevo varios días metido de lleno desarrollando una clase, que para mi me va a ser de mucha utilidad, y para ...
  #1 (permalink)  
Antiguo 09/12/2005, 07:02
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 19 años, 4 meses
Puntos: 0
Clase Codigo=Texto

Buenas tardes a todos!!

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:
#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...
}
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.

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;
        }
    }
}
?>
Y ahora vemos como podemos un ejemplo de como utilizarla:

Código PHP:
include('lib/clases/class_traduccion.inc.php');
$a=new codigoTexto('leng_cms-es-ES.lng');
echo 
$a->codigo('MENU_TOP'); 
Esto imprimiría
Código:
Menú top
Estoy pensando en añadir más cosas (entre ellas alguna función que acceda a variables), pero eso más adelante.

Que les parece? Que cambirían? Que añadirían?

Gracias
  #2 (permalink)  
Antiguo 16/12/2005, 12:48
 
Fecha de Ingreso: diciembre-2005
Mensajes: 5
Antigüedad: 18 años, 4 meses
Puntos: 0
Creo que me sirve para lo que yo necesito....
Podrías explicarme que hace exactamente:
Código PHP:
preg_match_all('/([0-9]+|[\w]+)=(\w+)\s/',$cadenaAnalizar,$entradas)) 
????

Yo le agregaría funciones que permitan modificar el archivo.
  #3 (permalink)  
Antiguo 22/12/2005, 02:24
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 19 años, 4 meses
Puntos: 0
Perdon por el retraso, he llevado unos días un poco locos.

La función:
Código PHP:
preg_match_all('/([0-9]+|[\w]+)=(\w+)\s/',$cadenaAnalizar,$entradas)); 
Se encarga de cojer la cadena de texto de la variable "$cadenaAnalizar" de formato:
Código:
5841=Algo
o
Código:
Alfanúmerico_85=Algo2
y almacena en el array $entradas, el código(5841 y Alfanúmerico_85) por una parte y el resultado(Algo y Algo2) por otra.

Por ejemplo:
Código PHP:
$cadenaAnalizar="
5841=Algo
Alfanúmerico_85=Algo2
"
preg_match_all('/([0-9]+|[\w]+)=(\w+)\s/',$cadenaAnalizar,$entradas));

echo 
$entradas[1][0]."/n";
echo 
$entradas[1][1]."/n/n";

echo 
$entradas[2][0]."/n";
echo 
$entradas[2][1]."/n"
Imprimiría:

Código:
5841
Alfanúmerico_85

Algo
Algo2
Puedes hacer un print_r($entradas) para sacar toda la estructura del array así poder estudiar la función con más detalle.

En cuanto a funciones que modifiquen el archivo, tenía algo pensado, pero todavía no se que haré. Algún ejemplo?

Espero haber aclarado tus dudas

Saludos
  #4 (permalink)  
Antiguo 08/07/2006, 13:07
Geo
 
Fecha de Ingreso: marzo-2003
Ubicación: México
Mensajes: 44
Antigüedad: 21 años, 1 mes
Puntos: 2
¿Qué ha pasado con tu clase? Estoy buscando una opción para incluir soporte multi-lenguaje en un script que estoy actualizando, ¿algún ejemplo de cómo se utiliza?
__________________
La imaginación es el límite
Visita mi página o la versión anterior.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:05.