Mostrando entradas con la etiqueta problemas. Mostrar todas las entradas
Mostrando entradas con la etiqueta problemas. Mostrar todas las entradas

viernes, 16 de noviembre de 2007

Plantillas en PHP (I)

Tras siglos desde mi último post me he decidido a retomar mis escritos con otra serie dedicada a las plantillas. Este primer artículo lo dedicaré a dar una visión general sobre el tema, veremos porqué son útiles y en qué nos ayudan. En los post siguientes propondré una implementación propia de un sistema de plantillas.


Mucha gente, entre la que me incluyo, empezó a programar PHP como un lenguaje de scripting insertado dentro del código HTML. Resultaba muy intuitivo extender las funcionalidades de tu página incluyendo pequeños trozos de código PHP.

El problema surgió cuando a medida que añadimos más funcionalidades el código de nuestras páginas se convierte en El Laberinto del Minotauro. Encontrar y corregir errores tanto HTML/JavaScript como PHP se hace enormemente tedioso al tener todo el código mezclado. Este tipo de escritura de código es altamente interdependiente además de compartir lógica y presentación la mismas variables.
Esta situación es mala de cara a la gestión de errores, mala frente a futuras modificaciones, mala porque no podemos aprovechar código de un proyecto a otro y mala porque no podemos dividir el trabajo entre diseñador y programador.

¿Como hacer código menos interdependiente?


Pensemos como sería una pagina HTML con el mínimo código PHP, para representar el típico resultado de una búsqueda en nuestra base de datos:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?=$TITULO?></title>
</head>
<body>
<table>
<thead>
<tr><th>campo 1</th><th>campo 2</th></tr>
</thead>
<tbody>
<? foreach($DATOS AS $D): ?>
<tr><td><?=$D->CAMPO1?></td><td><?=$D->CAMPO2?></td></tr>
<? endforeach ?>
</tbody>
</table>
</body>
</html>


Primero, SÍ, utilizo short tags, para activarlas deberás editar tu php.ini poniendo short_open_tag=1. Pero, un momento, seguro que habréis visto en más de un sitio que no se deben utilizar las short tag que son la reencarnación del diablo y otras lindeces, veamos porqué:

  1. No se deben utilizar las short tags porque producen problemas si queremos hacer un include de un xml. Los archivos xml empiezan con <?xml y por lo tanto el PHP (con short tags activadas) interpreta que ahí empieza un bloque PHP. Esto se soluciona si en lugar de empezar de ese modo el xml lo empezamos así: <<? ?>?xml . ¿Supone esto un gran problema para no hacer uso de las short tags? Cada uno tendrá su opinión.

  2. No es raro hacer un include de un xml sobre todo si vamos a utilizar un sistema de plantillas basado en PHP, que en última instancia hará un include de la plantilla, y si ésta es un xml surgirá el problema.


A mi personalmente no me parece un gran problema si a cambio puedo utilizar <?= ?> que resulta un gran aliado para legibilidad de las plantillas, en todo caso cada uno es libre de utilizar <?php echo.

Dicho esto diré también que ya tenemos nuestra primera plantilla PHP. Metan ese código en un archivo, guárdenlo en UTF-8 y pónganle una extensión del tipo .phpt. A partir de ahora diferentes scripts podrán utilizar la misma plantilla o un mismo script utilizar plantillas diferentes. Además, se requieren unos mínimos conocimientos de PHP para hacer una plantilla por lo que fácilmente podrá hacerlas un diseñador mientras nosotros nos dedicamos a la miga de la aplicación y que se pelee él con el JavaScript, el DOM y las CSS (sí teneis la gran fortuna de tener un buen diseñador a mano).

Pero, ¿como instanciar esa plantilla y rellenar los huecos? paciencia, lo veremos en la próxima entrada.

LEER MÁS……

jueves, 10 de mayo de 2007

Guardar propiedades static en $_SESSION (I)

Hechas las presentaciones empezamos en esta entrada con la primera de una serie de articulos dedicados a resolver el problema de como guardar las propiedades static de las clases en PHP 5 (OJO: utilizaremos funciones que no existen en PHP4).

Como es sabido en PHP cuando se finaliza la ejecución de un script el motor PHP seria(serializa) todo el array $_SESSION, para almacenarlo en un fichero; si hay objetos en su interior también los seria, guardando el valor de todas sus propiedades (public, private o protected). El resultado sería el mismo que el que se obtiene con la función serialize():


session_start();

class Foo{
static $propiedad;

function __construct(){
self::$propiedad=4;
}
}


$_SESSION['obj']=new Foo();
$datos=serialize($_SESSION['obj']);
echo $datos;

Cuando se vuelve a ejecuta la funcion session_start() se reconstruye el array $_SESSION a partir del fichero. Problema: los cambios producidos en las propiedades static de la clase durante la ejecución anterior del script se pierden. Esto se debe a que sólo se guarda información del objeto y no de la clase.

Es posible que en futuras versiones de PHP este problema se solucione y quizá este sea el motivo más importante para buscar una solución temporal que nos permita trabajar en el paradigma que utilicemos con PHP6. De este modo podremos desarrollar un mayor potencial en nuestros diseños (podría extenderme sobre los problemas de esta limitación pero si estás leyendo esto seguramente ya te habrás enfrentado a alguno) y si en un futuro se soluciona sólo tendremos que borrar unas pocas líneas de código.

En la próxima entrada empezaré a discutir mi solución al problema, procuparé no demorarme mucho.
Ir a... [II][III][IV]

LEER MÁS……