Mostrando entradas con la etiqueta técnicas. Mostrar todas las entradas
Mostrando entradas con la etiqueta técnicas. Mostrar todas las entradas

martes, 28 de agosto de 2007

Capturar una URL (actualizado)

Después de un rato dándole vueltas y haciendo debug de un controller, se me ha ocurrido este código para obtener un array de la página solicitada. Para hacerlo directamente en el controller, debería bastar con eliminar los $this->controller


$redirectAfterLogin = array (
'controller' => $this->controller->params['controller'],
'action' => $this->controller->params['action'],
);
if (isset($this->controller->params['pass'])) {
foreach ($this->controller->params['pass'] as $pass) {
$redirectAfterLogin[] = $pass;
}
}


Esto lo hice para una redirección post-login, esto es, si la página solicitada requiere autentificación hay que anotar qué página es y recuperarla una vez que el usuario ha hecho login correctamente para llevarlo a dónde quería.


Es posible que haya una solución mejor en el propio CakePHP, pero ¿quién sabe dónde?

Claro que la hay

Está en el router:

$redirectAfterLogin = Router::parse ($this->controller->here)


Funciona aún mejor, pues respeta los parámetros con nombre.

lunes, 27 de agosto de 2007

La técnica de los argumentos como array

Una cosa que me llamó la atención al estudiar algunos ejemplos de código en CakePHP es el amplio uso de los arrays asociativos para pasar múltiples argumentos a los métodos, sobre todo conjuntos de ajustes para Behaviors, Helpers o Components.

La técnica básica es muy sencilla, simplemente es definir un array asociativo con las claves que nos interesen y sus valores. Por ejemplo:

$ejemplo = array (
'etiqueta' => 'La que sea',
'repetir' => 5
);


La ventaja es que así resulta bastante fácil mantener la interfaz de un método y pasarle un número indeterminado de parámetros. Sólo tenemos que declarar que pasaremos un array y será problema del método decidir qué hacer con él.

Algo así:

class ejemplo {
function metodo ($argumentos ) {
}
}


Al ser $argumentos un array asociativo, en realidad le podemos pasar cualquier estructura de datos que se nos ocurra.

Valores por defecto

Para resolver el tema de los valores por defecto lo que haremos será definir una variable con una "plantilla" del array y luego mezclarla con el array que pasamos. De este modo, nos aseguramos de que el array final tenga todas las claves necesarias y, a la vez, los valores que hayamos pasado.

Por ejemplo:

$porDefecto = array (
'etiqueta' => '',
'repetir' => 10,
'plantilla' => 'Campo = %campo% ',
);

$array_final = array_merge ($porDefecto, $ejemplo);


Uso

Para utilizar los valores del array podemos optar por dos estrategias:

1. Utilizar el array, como en $array_final['repetir'].
2. Utilizar extract, para convertir las claves del array en variables y poder referirnos a ellas como $repetir y así.

El segundo método parece más legible, pero a veces me resulta más inteligible el primero. Una vez que hemos hecho "extract" de un array nos salen un montón de variables nuevas y puede ser fácil perder la pista de su origen, sin descontar el problema de que pueda haber conflictos de nombres. Pero es una elección personal, claro.

sábado, 9 de junio de 2007

¿Lo quiere por id o por nombre? (actualizado)

Este pequeño trozo de código permite que una acción pueda localizar un mismo modelo de dos maneras distintas, gracias a los métodos mágicos de búsqueda de Cake (Model::findBy...).
if (is_numeric ($id)) {
// Buscar por ID
$this->MenuBar->id = $id;
$resultado = $this->MenuBar->Find ();
} else {
$resultado = $this->MenuBar->FindByMenuBar ($id);
}
Explaneishon

Capturamos el parámetro id de una URL típica como /controller/action/parametro.
Vemos si es de tipo numérico, en cuyo caso debería ser un ID.
Y si no, será que es el nombre.

Explaneishon 2

Los métodos mágicos Model::findByCampo () nos sirven para hacer búsquedas de modelos por un campo específico (Campo) del modelo. Dispones de un método findBy por cada campo que tenga el modelo.