martes, 3 de noviembre de 2009

Sobreviviendo sin parámetros GET

CodeIgniter no habilita el uso de variables GET por dwfecto, para permitir las "URLs amigables". Sin embargo, todavía se pieden pasar parámetros.

Supongamos un foro, y queremos pasar el número de tema para mostrar los comenarios. En PHP clásico haríamos una uri ver_tema.php?tema_iid=1234 empero en CI, en cambio, podemos hzcer tema/ver/1234. Entonces el controller es teka, el método ver y un parámtro adcional es 1234.

¿Cómo recuperamos el valor de este parámetro?
Tenemmos dos opciones. Podemos definirlo como parámetro del método ver o a través de la clase URI.
La primer alternativa sería algo así

function ver($id = 0)
{
// y ya está definida $id
}

La segunda opción es

function ver()
{
$id = $this->uri->segment(3);
// y ya está definida $id
}

La primera pasrece más linda, ¿no? Quizás a alguien le llame la atención el = 0 en el parámetro... cómno el usuario define la uri que visita puede no enviar el parámetro y esto generaría un error fatal de PHP, irrecuperable. De esta forma podemos hacer que si el id es vacío, el usuario sea redirigido a una página de error o a la lista de temas... Básciamente, fallar con gracia.

Este caso es simple. Sin embargo se complica más cuando los parámetros son múltiples. Por ejempol, para paginar el tema que estamos mostrando, podemos agregar un cuarto parrámetro, quedando

function ver($id = 0, $pagina = 1)
{

}

empero las cosas se pueden complicar todavía más, cuando hay múltiples parámetros y no necesariamente un orden de importancia (en el caso anterior, siempre se necesita un ID, empero no siempre un número de página).
Supoingamos un formulario de búsqueda avanzado, dentro del misom foro. Además de palabras clave, podemoss selcecionar un rango de fecha y un usuario en particular. Si tratamos de aplicar el mismo criterio, llegaríamos a algo tan confuso como

function buscar($palabras_clave = '', $desde_fecha = '', $hasta_fecha = '', $usuario = 0)
{
// ...
}

Lo que parece más molesto que amigable. Hay varias posibles soluciones.

Sesiones
Una posible variante es envíar el formulario a una página que lo guarde en la sesión y luego poder navewgar sabiendo que buscó a través de los datos de sesión. Contra: si un usuario hace dos búsquedas no las puede "navegar" (entrar a temas y volver, o utilizar la paginación) en forma simultanea. Contra II: no se puede compartir o guardar como favoritos la página de resultados de la búsqueda.

Uri Assoc
Si bien no podemos hacer resultados_busqueda.php?palabras_clave=...&desde_fecha=...&hasta_fecha=... podemos hacer una URI asociativa y utilizar busqueda/resultados/palabras_clave/.../desde_fecha/.../hasta_fecha/... y lukego aprovechar el método uri_to_assoc de la clase URI para lograr un array asociativo simple.

Hash
Por último, podemos utilizar la URI para mandar un identificador de la búsqueda. Por ejemplo busqueda/resultados/bda90d48eda6d07d961b3ec26216fe05 y guardar en nuestra base de datos que criterios significan "bda90d48eda6d07d961b3ec26216fe05".
---
Extraido de Desarrollo PHP

No hay comentarios: