30 de octubre de 2007

Demasiado bien para ser el primer dia

Bueno, despues de toda la chachara de ayer, hoy me dispuse a poner las manos en el fuego y empezar a hacer algo... Nada de tutoriales de blogs ni esas pavadas, no hay tiempo para eso, ¡los clientes ya se estan quejando por las demoras!

La aplicacion que tengo que crear tiene que encargarse de manejar las propiedades de una inmobiliaria, ni mas ni menos. Tengo que poder ponerlas en diferentes estados (En venta, Para alquiler, etc.), asignarle precios, y otros chiches mas.

Vamos a ver todo lo que he podido avanzar hoy...

1) Comenze por utilizar Bake para generar los modelos y los controladores. Aunque es una herramienta muy interesante, he podido comprobar, que como lei en algun escrito de Mariano Iglesias, lo mejor es poder codificar uno. Bake genera el codigo, pero nunca es como lo quiere uno, porque la idea es que le sirva a todos, cosa que es imposible. Asi todo, de guia para aprender algunas cosas anduvo perfecto.

2) Bueno, como mi "Ver todas las propiedades" estaba mas vacio que la marcha de Schiaretti cuando gano las elecciones (si hay algun cordobes, me va a entender), procedi directamente a crear la vista para agregar una propiedad. Quien diria que me llevaria toda la tarde!!!!

3) Primer escollo. No tengo ni idea como hacer funcionar el generateList que me puso Bake. Teoricamente, generateList se encarga de construirte un array con todos los datos de otro modelo, para que simplemente lo pongas en una lista de selects y se acabe el problema. Me costo horrores, pero al fin pude ponerlo en funcionamiento y hacer que mi vista lo reconozca. Basicamente, esta es la sintaxis de generateList:

generateList(string $condiciones, string $orden, int $limite, string $keyPath, string $valuePath)

Se puede llamar directamente como generateList(), pero te pierdes la posibilidad de ordenar los datos o de ponerles alguna condicion. Ah! $keyPath es el valor que se pasara a través del formulario, y $valuePath el que se mostrara en pantalla.
Despues de mucho renegar, y de no encontrar casi documentacion sobre el helper Form (en el manual no hay nada, que hago!!!!) recurri a la API y a este increible tesoro perdido y aprendi que del lado de la vista, es tan simple como poner lo siguiente:

echo $form->select('Modelo.campo,$arrayDeDatos);

siendo el primer parametro el campo del modelo a tratar, y el segundo los datos a poner en el select, que ya lo habia conseguido "magicamente" con generateList. Una verdadera pavada.

4) Ahora ya tome coraje y me agrande, voy a terminar el formulario completo me dije. Ayudado de nuevo por los documentos que liste arriba, me di cuenta que crear un input con su respectivo label es tan facil:

echo $form->input('Modelo.campo');

Algo que no pude conseguir es como hacer para que no me salga el titulo Campo (referido al valor campo que puse en el helper). Supongo que sera una de los datos que le puedo enviar al helper como segundo parametro para la creacion del input...

ACTUALIZACIÓN:

echo $form->input('Modelo.campo', array('label' => 'Mi titulo'));

5) Otra cosa a tener en cuenta es que los demas elementos que no son input no generan un label automatico, por lo tanto hay que hacerlo. De nuevo, generar un label parece un chiste:

echo $form->label('Modelo.campo','Texto en el Label');

ACTUALIZACIÓN:

Segun lo que he averiguado, lo ideal es generar todos los elementos del formulario con input, ya que en el segundo parametro, que es un array, definimos el tipo de elemento:

echo $form->input('Modelo.campo', array('type' => 'select'));

Asi, homogeneizamos todos los elementos, y no hay que utilizar mas el elemento label. Un verdadero avance.

6) Una vez terminado el formulario, me dispuse a relajarme y como sobrando el partido, aprete el boton enviar para ver que pasaba. Parecia que estaba todo mas que bien... Pero, pero, estas cosas nunca salen de una. Cuando revise mi base de datos, vi que en los lugares donde tenia que ir un ID Foraneo me habia ingresado 0 (cero). Indignado, empece a golpear la pc, buscando la forma de encontar a Larry Masters y ahorcarlo con mi mouse (mentira Larry, esta todo bien con vos) Ahi fue cuando encontre la salvacion en el grupo de Google, donde encontre un post de el usuario Pablo Ramirez (te nombro, hermano, porque sin querer me salvaste la tarde!) preguntando sobre otra cosa, mostro su controlador y lo que hacia el era realizar el generateList antes de cualquier pregunta sobre si habia datos o no. La verdad, esta parte no la entendi bien, porque se supone que el generateList es solo para la vista, pero despues a la hora de guardar los datos, en el array data deberia venir ese valor tambien (tarea para averiguar). Bueno, la cuestion es que hice este cambio, y FUNCIONO!

ACTUALIZACION:

El problema es que tenia el DEBUG en 0, por lo tanto no actualizaba la aplicacion con respecto a la base de datos. Si estan desarrollando, no se olviden de poner DEGUG en un numero mayor que 0! Y el generateList va donde tiene que ir, no al principio.

7) Me puse a saltar como si hubiese ganado la medalla de oro de Judo, no podia creer lo facil que era hacer esto, una vez que se averigua como hacerlo. Ya no mas codigo HTML insoportable para generar un formulario, esto si que es magia!


Y asi se termino mi primer round con CakePHP, creo que para ser el primer dia, mucho he podido hacer. Me faltan muchas cosas, como aprender a subir imagenes, o manejar relaciones de muchos a muchos, pero vamos por partes, como dijo mi amigo, Jack el Destripador...


Saludos a todos! Cualquier consulta me preguntan a traves de los comentarios del blog, estoy siempre dispuesto a ayudar a gente que esta en la misma que yo!

1 comentario:

José Ignacio Martín dijo...

Muy bien de a poco con los avances en cake, me gustaria saber cuanto aprendiste a usarlo para si tengo dudas consultarte...