miércoles, 4 de marzo de 2009

Limpiar floats que no se limpian con clear both

Por algún motivo, clear: both no acaba de funcionar cuando hay diferentes combinaciones de floats dentro del contenedor. Para solucionarlo, se puede probar a utilizar los siguientes estilos de CSS para el contenedor que contiene los floats:

overflow: auto;
height: auto;

viernes, 27 de febrero de 2009

Trabajo con ficheros en PHP

Para leer el contenido de un directorio, pero sólo los ficheros o directorios (sin "." ni ".."):

$directorio=dir(RUTA);

while ($fichero=$directorio->read()){

//Mientras siga pudiendo leer.

//Siempre que el fichero no sea ni "." ni ".."

if ($fichero!='.' && $fichero!='..'){

//trabajo con el fichero

}

}

Para leer el fichero en bloques de 8kb (más seguro que leerlo de una vez):

$file=fopen(RUTA_FICHERO);

if ($file!=0){

//No ha dado error.
//Escribo el contenido.

$contenido = '';

while (!feof($file)) {

$contenido .= fread($file, 8192);

}

//Hago lo que tenga que hacer con el contenido del fichero.

fclose($file);

martes, 24 de febrero de 2009

Interfaces en PHP 5

La siguiente es la estructura de un interface común:

interface BeingDamage{

public function processDamage($weapon);

public function damageHealth($damage);



}

El interfaz se implementaría de la siguiente manera:

class character implements BeingDamage{

function processDamage($weapon){

//implementación

}

function damageHealth($damage){

//implementación

}

}

Es importante recordar que la reutilización de clases y métodos sugiere que conviene programar a interfaces, no a implementaciones.

miércoles, 18 de febrero de 2009

Solucionar compatibilidades entre navegadores en CSS

Para evitar problemas de compatibilidades entre diferentes navegadores, sobre todo en cuanto se usen listas, conviene añadir lo siguiente a la hoja de estilos CSS:

* { margin:0; padding:0; border: 0; }

martes, 17 de febrero de 2009

Extraer información de un archivo de texto formateado de cierta manera

Organizo valores constantes mediante archivos ini para poder modificarlos rápidamente y que afecten diferentes sitios. Uso la siguiente función:

function devuelveValorIni($claveIni,$archivoIni){

$datos=archivoTextoAString("/ini/" . $archivoIni);

//Queda separarlo en función de los delimitadores y del texto.

$textoConvertido="[" . $claveIni;



$valorIni=extraeUnidad($datos,$textoConvertido,"]");

return $valorIni;



}

function archivoTextoAString($archivo){

//Se busca en el archivo ini los hit die para esa clase especificada.

$directorioBase=parent_directory();

// read file into string

$data = file_get_contents($directorioBase . $archivo) or die("Could not read file!");

//Teniendo ya el archivo en un string, hago la búsqueda y separación.

return $data;

}

function parent_directory(){


return dirname(dirname(__FILE__));

}

Asumo la siguiente estructura:

[LIMITEMAPA:150]

Se establece que el primer límite donde empezar a buscar es '[LIMITEMAPA:' y el último es el cierre, ']'.

Funciones JavaScript no definidas y Firebug

A menudo una página no funciona como debería y Firebug nos devuelve que una función de JavaScript está "not defined" o "undefined". Uno tiende a pensar que se debería a que no tiene acceso a la función y el tag script no ha funcionado bien por algún motivo, pero en realidad se suele deber a un error de sintaxis. Asegúrate de que el código javascript sea correcto. También suele pasar cuando desde un archivo .js llamas a funciones de otro (como librerías Prototype).

Pasar un array de PHP a JavaScript mediante JSON

Por algún motivo, pasar arrays de PHP a JavaScript es más complicado de lo que debería ser. Por fortuna, para arreglar el asunto podemos traducir el array de PHP a JSON.

Cualquier servidor de PHP mayor que el 5 tiene la siguiente función:

$arrayAJS=json_encode($arrayEnPHP);

Nota muy importante: nada más pasar el array PHP a JSON y enviarlo como parámetro, la función javascript lo considera un array normal y corriente. No hace falta deserializarlo.

Estilo de menús horizontales en CSS usando ambos navegadores

Uno de los elementos específicos que siempre crea problemas de compatibilidad entre los dos navegadores principales, Firefox y IE, son los menús horizontales. Hay que jugar con la propiedad margin tanto de esa capa como la que le precede, intentando combinaciones de números positivos y negativos en ambos para acabar ajustando ambos. Por ejemplo:

#PaisesContenedorLogo{

width: 700px;
height: 132px;

background-color: #888888;

background: url("../img/logo.jpg");
background-repeat: no-repeat;
margin-bottom: 16px;


}

#PaisesContenedorMenu{

background-color: #95b48b;
color: #000000;
height: 30px;
margin-top: -16px;

}

En el caso expuesto, 'PaisesContenedorLogo' está situada por encima de 'PaisesContenedorMenu' y en la misma capa, pero, como se ve, los margin no parecen muy racionales.

lunes, 16 de febrero de 2009

Crear un array unidimensional en JSON

No confundir con los arrays asociativos.

{

"arrayUnidimensional" : [0,0,2,3,0,1,0,5]



}

Crear Request Object para recibir JSON usando AJAX

Omito el lado del servidor, pero el archivo php debe generar un texto que respete la sintaxis.

var the_object;
var http_request = new XMLHttpRequest();
http_request.open( "GET", url, true );
http_request.send(null);
http_request.onreadystatechange = function () {
if ( http_request.readyState == 4 ) {
if ( http_request.status == 200 ) {
var inputJSON=http_request.responseText;

var
my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + inputJSON + ')');


} else {
alert( "There was a problem with the URL." );
}
http_request = null;
}
};
Es conveniente limpiar la cadena enviada por el servidor para evitar posibles inyecciones de código.