viernes, 28 de noviembre de 2008

Llamar a papá

De la serie de fallos estúpidos cometidos por Fran nos llega esta nueva entrega, con varias espectaculares meteduras de pata. Digno de un premio en el "pifias de primera".

El problema

El CMS que estoy escribiendo tiene soporte para múltiples blogs en un site. Cada blog puede tener su theme asociado. Para saber qué blog se está viendo actualmente se guardan sus datos en la sesión siempre que la URL solicitada lo implique (básicamente ver la página principal de un blog o uno de sus posts).

Simplemente hay que consultar la variable de sesión y obtener el theme del blog en cuestión. Lo mejor es hacerlo en el AppController.

Fallo 1: poner ese código en el beforeFilter.

Es un fallo porque el blog actual puede cambiar durante la acción y la sesión ya no la volvemos a leer hasta el próximo clic del usuario.

Y lo peor es que esa acción puede suponer que si ese siguiente clic nos lleva a otro blog, éste coge el tema del blog que acabamos de abandonar y nos hace alucinar en colores.

Consejo: Si prepara cosas para la acción, ponlo en beforeFilter, si utiliza cosas generadas por la acción, ponlo en beforeRender.

Fallo 2: no llamar a papá

El sitio lógico para poner el cambio de theme es beforeRender porque así se ha ejecutado la acción y si ha cambiado el blog actual el código puede enterarse. Como beforeRender se ejecuta justo antes de empezar a dibujar la vista, ocurre que ésta ya aplica el nuevo theme.

Pero si los Controllers tienen su propio beforeRender debes asegurarte de llamar en ellos al parent::beforeRender() porque si no te saltas el código encargado de determinar si hay que cambiar el theme para las vistas.

Consejo general: siempre que escribas un callback en un controller llama a la función equivalente en parent, o por lo menos, piensa si tendrías que llamarla.

Fallo extra. Controla los nombres de variables

Este fallo me ha tenido varios días detenido. En un behavior utilizaba una variable cuyo nombre era igual que el del parámetro por el que CakePHP pasa la referencia del modelo. Por supuesto, se iba todo a tomar por el saco.

La cuestión curiosa es que ese código funciona bien sobre PHP 5, pero provoca un error fatal en PHP4.

miércoles, 12 de noviembre de 2008

$ajax->div sirve para algo

Trabajando hoy en el tema de Ajax me he dado cuenta de que si no utilizas $ajax->div('identificador') para crear los elementos que se han de actualizar mediante peticiones Ajax, las cosas no funcionan bien y se carga la vista entera, con layout y todo, aún con el RequestHandler.

Basta utilizar este método y cerrar con $ajax->divEnd('identificador') para que funcione perfectamente.