Mostrando entradas con la etiqueta parámetros. Mostrar todas las entradas
Mostrando entradas con la etiqueta parámetros. Mostrar todas las entradas

lunes, 27 de diciembre de 2010

Parámetros de URL y paginator

Debo decir que odio tener que comenzar esta entrada con el típico: "siento haber estado tanto tiempo sin escribir", pero razones de todo tipo me han mantenido alejado del blog, no siempre de manera muy justificada. Quiero decir, que probablemente mejor me hubiera ido escribiendo aquí que dejando pasar el tiempo sin hacerlo y sin tener la oportunidad de compartir aunque sólo fuesen pequeños trozos de código como el que traigo hoy.

En fin, para volver a la buena senda, he aquí cómo me las apaño para resolver un problema típico:

Tenemos una vista de registros paginada, con la más o menos típica tabla, con sus cabeceras "clicables" para ordenar los registros y sus botones para cambiar de página.

También tenemos un problema: ¿cómo conservar todos los parámetros que vienen en la URL en los enlaces relacionados con la paginación? Pues, la verdad es que es bastante sencillo:

$options = array(
    'url' => array_merge($url, $this->params['named'], $this->params['pass']),
    'model' => $this->defaultModel
);
$this->Paginator->options($options);

Bien, lo que tenemos que hacer es pasarle a Paginator un array de opciones que contenga una clave 'url' la cual estará compuesta por una URL de CakePHP expresada como array a la que habremos añadido los parámetros adecuados.

¿Dónde vamos a encontrar esos parámetros? Muy sencillo, en la vista en la que estemos trabajando (o incluso dentro de un Helper, que es de donde he copiado el código) tendremos los parámetros de la petición presentes en la variable de clase params, estando los parámetros "directos" en la clave 'pass' y los que tienen nombre en la clave 'named'. Simplemente hacermos un array_merge de la url, y ambos arrays de parámetros.

En el código de ejemplo, $url contendrá la URL básica de la vista.

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.

jueves, 7 de junio de 2007

¿Cómo se pasan parámetros? parte 2

Las URL de CakePHP también permiten pasar parámetros "con nombre". Tienen esta forma.

/controlador/accion/param1:valor1/param2:valor2

¿Bonito verdad? Se recogen en la propiedad (array) Controller:params[pass], los nombres del parámetro como claves y los valores como, bueno, valores.

¿Cómo recibe datos una acción de un controlador? (parte 1)

Es bastante sencillo.

Supongamos que tienes una accion en un controlador que necesita algunos parámetros:

class ControladoresController extends AppController {
var $name = "Controladores";

function Accion ($param1 = null, $param2 = null) {
// ... el código
}
}


Vale, pues para invocarla y pasarle los parámetros necesitamos una url tal que así:

/Controladores/Accion/param1/param2


Que en el formato array, debe ser algo así:

$url = array (
'controller' = 'Controladores',
'action' = 'Accion',
'param1',
'param2'
)



Aparte de que la acción reciba los datos de esta manera, es posible acceder a los parámetros pasados a través de la propiedad Controller::params['pass'], que devuelve un array con los parámetros pasados.

Ahora tengo que ver eso de pasar parámetros con nombre...