CAKEPHP (Parte 4)

Antes que nada:

Debido a que se explicará como realizar los mantenimientos y todo lo que conlleva, esta publicación saldrá un "poco" larga por lo que les pido disculpas y paciencia.-

Preámbulo:

El framework CAKEPHP como hemos mencionado se basa en el paradigma MVC (Modelo-Vista-Controlador) pero, qué es ? Básicamente, es una separación eficiente de las operaciones tipicas agrupadas en áreas específicas:
  • Modelos (Models): para toda la interacción con la base de datos, propiamente por cada modelo debe haber una tabla. Aqui se define toda la reglas de negocios, las validaciones de los datos, integridad referencial, etc.-
  • Vistas (Views): para todas las páginas de entrada y salida (lo que el usuario ve).-
  • Controladores (Controllers): para todos tus scripts, Aqui es donde se programa.-

Nota:
  • Por cada método o acción hecho en el Controlador debe haber una Vista.-

Pero, cómo funciona ?



  1. El Usuario Cliente (Client) envía una petición de página a la aplicación, por medio de un link o digitando la URL. Por cierto, CAKEPHP estandariza la estructura de la URL: http://{Dominio}.com/{Aplicación}/{Controlador}/{Acción o Método}/{Parámetros}
  2. Un script Despachador (Dispatcher) se encarga de verificar la estructura de la URL y determina que controlador se va a ejecutar (tomando en cuenta la acción específica y si hay parámetros).-
  3. La acción o método en el controlador podría necesitar mas datos que los que se le enviarón como parámetros, en este caso enviará una petición al modelo asociado.-
  4. El modelo determina como interactuar con la base de datos usando las peticiones enviadas por el controlador (obtención de datos, manipulación de datos, etc.).-
  5. Una vez que el modelo ha cumplido con lo suyo, devuelve la salida (datos) al controlador.-
  6. El controlador procesa todos los datos y los despliega a traves de una vista.
  7. La vista agrega cualquier diseño visual y despliega los datos enviados por la salida del controlador en una página web en el navegador del usuario cliente.-

Suficiente paja, vamos a lo nuestro.-

Creando Mantenimientos (CRUDS):

Para generar los manteniemientos adecuados, debemos llevar un orden en la elaboración de los scripts según el paradigma MVC:
  1. Generar Modelos.-
  2. Generar Controladores.-
  3. Generar Vistas.-

Nota:
  • Los servicios de MySQL y Apache deben estar arriba.-

Comencemos entonces, como se mencionó en la Parte 3, debemos abrir una consola en el subdirectorio console y digitar (según en mi máquina):

cake bake -app "c:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\eval\app"

Con lo que veremos:



Aquí nos aparece el menu principal con todas las opciones BAKE, si hubiese problemas nos pediría (al menos) configurar la conexión a la base de datos. Ya que todo esta vergón, ya podemos realizar todo lo necesario para nuestra aplicación, como vemos nos aparece:

  • Database Configuration (Configuracón de la Base de Datos): hecho en la Parte 3, aunque siempre podemos reconfigurar la conexión.-
  • Model (Modelo): para crear el script del modelo.-
  • View (Vista): para crear los scripts de las vistas.-
  • Controller (Controlador): para crear el script del controlador.-
  • Project (Proyecto): algo innecesario ya que cuando llamamos al BAKE le pasamos el parámetro -app
  • Quit (Salir): obvio, para cerrar la ejecución del BAKE.-
  • What would you like to Bake? (/D/M/V/C/P/Q): Qué es lo que te gustaría hornear? aqui solo se digita una letra para la opción que queramos.-

Lo primero que debemos hacer es crear nuestros script de modelos, o sea vincularse con una tabla de la base de datos. Cuando elijamos esta opción, debemos tener en cuenta varias ondas:
  • El nombre de la tabla con la que vamos a trabajar.-
  • Conocer los campos de dicha tabla, asi como su tipo.-
  • Si dicha tabla hace referencia a otra o si es usada como referencia.-
  • La integridad referencial para sus relaciones.-

Para nuestro caso empezaremos eligiendo la tabla Empresas. En la consola deben digitar la letra m:



Como ven les aparece todas las tablas contenidas en la base de datos (incluyendo vistas). Se les pide digitar el numero de la opción o sea la tabla a la que le desean asociar/crear el modelo, digitemos el numero 4:



Ahora les pregunta si desean generar validaciones para los campos de dicha tabla, digan que si, en este caso solo den un ENTER:



Les pregunta que validación desean para el campo id, como es la llave primaria y autonumérica hagamos caso a la sugerencia, o sea la opcion 29, o sea solo un ENTER. Para el campo nombre, pueden elegir la sugerencia (opción 20) o la opción 1 o 16 o 17. Aqui en consola solo les permite seleccionar una opción, después veremos como mezclar varias opciones, den un ENTER (nos quedamos con la sugerencia):




Para el campo dirección, den un ENTER:



En el campo departamento ya que es tipo enum, la sugerencia es la opción 29 (o sea no validar). Cuando estemos trabajando en las vistas ahondaremos en este detalle pero por el momento seleccionemos la 20 y den un ENTER:



Ya hemos terminado con las validaciónes (ya no hay más campos) por lo que ahora BAKE nos pregunta si queremos definir asociaciones, esto se referiere a las relaciones con otras tablas (o modelos), por eso nos aparecen los diferentes tipos de relaciones:
  • hasMany: una relacion tipo 1-n (uno a muchos)
  • hasOne: una relación tipo 1-1 (uno a uno)
  • belongsTo: una relación tipo n-1 (muchos a uno)
Digan que si, o sea den un ENTER:



Cuando dieron ENTER, el BAKE tardo un par de segundos ya que rastreo las posibles relaciones de la tabla Empresas verificando en la estructura de la base de datos (relaciones en si o a traves de los campos llamados empresa_id de todas las tablas). Ya después de buscar les pregunta que confirme las asociaciones, propiamente para este caso les pide si la relacion de Empresa con Plaza es de tipo 1-n o sea de uno a muchos (tengan cuidado en no confundirse, en este momento BAKE esta usando los nombres de las tablas en singular ya que BAKE asi nombra los script de los modelos). Presionen ENTER:



Les pregunta si también hay una relación hasOne o sea de uno a uno, ya que no es cierto digiten una n y presionen ENTER:



Ahora les pregunta si quieren definir más relaciones, esto BAKE lo hace debido a que puede no haber encontrado todas las relaciones y le pide a usted que las ingrese manualmente (en caso de que si hay), solo den un ENTER:



BAKE ahora nos pregunta si ya todo esta bien, avisandonos que se creará el script del modelo. Si todo esta correcto, solo den un ENTER:



Se generó el archivo del script (empresa.php) en el subdirectorio app/models. Luego nos preguntan si deseamos generar archivos de prueba para el modelo, digan que no o sea solo digiten una n y presionan ENTER.-

Terminamos de generar el script del modelo, ya que si todo salió bien después del ultimo ENTER nos apareció de nuevo el menu principal de BAKE.-

Ahora a crear el controlador, digitemos una c y presionemos ENTER:



Nos aparece el listado de las tablas a la cual le podemos generar el controlador, digitemos 4 y presionemos ENTER:



Digan que no, o sea digiten una n y presionen ENTER:



Aqui les pregunta si desean incluir métodos básicos de clase o sea acciones, las cuales son:
  • index(): acción por defecto, mostrar todos los registros.-
  • add(): acción para agregar registros.-
  • view(): acción para ver el contenido de un registro.-
  • edit(): acción para editar el contenido de un registro.-

Nota:
  • Recuerden que todo por lo maneja en ingles por default.-

Solo presionen ENTER:



Ahora nos pregunta si deseamos crear métodos para la administración del ruteo, la verdad no es necesario ya que por default CAKEPHP ya lo hace asi que solo digiten una n y presionen ENTER:



BAKE nos avisa que se creará el controlador y nos pregunta si las configuraciones son correctas, solo digiten ENTER:



Se generó el archivo correspondiente (empresas_controller.php) en el subdirectorio app/controllers y de nuevo nos pregunta si queremos generar archivo de prueba, le decimos que no y nos volverá a aparecer el menu principal de BAKE.-

Para crear las vistas, estando siempre en el menu principal de BAKE, elegimos la opción v:



Como siempre, nos muestra todas las posibles vistas a generar basandonos en la estructura de nuestra base de datos (claro siempre que exista el controlador correspondiente), elegimos la opción 4:



Ahora nos pregunta si deseamos generar las vistas: index, add, view, edit para el controlador especifico dandonos un aviso de que ya debe existir el modelo y controlador (y sus acciones). Debemos digitar una y y presionar ENTER:



Queremos vistas para la administración del ruteo, no, digiten n y le dan al ENTER:



Se crean todos los archivos de las vistas (index.ctp, add.ctp, edit.ctp, view.ctp) en el subdirectorio app/views/empresas.-

Notas:
  • La extension .ctp significa cake template page.-
  • Como se menciono antes, para cada accion del controlador debe haber una vista correspondiente de tal forma que para la acción add() debe existir la vista add.ctp
  • Las vistas a diferencia del modelo y del controlador, son generadas en un nuevo subdirectorio de app/views que tendra el nombre de la tabla (o controlador), en este caso se creó automaticamente empresas y ahi se colocaron las vistas.-

Abran su navegador y empecemos a verificar si funciona todo. Como se menciono al principio CAKEPHP estandariza la forma en como se debe accesar su aplicación, para nuestro caso se debe digitar:



Con lo que mágicamente aparecerá:



Dicha página es la vista index.ctp que por medio de la acción index() del controlador empresas_controller.php y por medio del modelo empresas.php nos presenta los datos contenidos en la tabla Empresas.-

Notas:
  • Antes ya había metido un par de datos ... sorry.-
  • Todo aparece en ingles, lo cual arreglaremos después.-
  • Los títulos que aparecen en la cabecera de la tabla son los nombres de los campos en la tabla.-

En cualquiera de los registros hagan click en:



Con lo que aparecerá:



Aquí vemos la vista view.ctp que por medio de la acción view() del controlador y modelo correspondiente, nos muestra el contenido del registro. Observen la barra de direcciones de su navegador:



Vemos:
  • El Dominio: localhost
  • La Aplicación: eval
  • El Controlador: empresas
  • La Acción: view
  • El Parámetro: 3 (el id de la empresa, los parámetros son generalmente las pk)

Fácil de usar y entender verdad ?

Regresemos a la página anterior. Por cierto, han visto lo que se despliega en la parte inferior de cada página:



Es un traza de las consultas que se hicieron a la base de datos para poder desplegar los datos o realizar acciones, obviamente no queremos que aparezca (a menos cuando estemos depurando). Para quitarlo, abran el archivo core.php en el directorio (según mi máquina):



Diriganse a la línea 41 (más o menos) y busquen:



Cambien el 2 por un 0 (cero):



Guarden el archivo, regresen a su navegador y refresquen la página (F5):



Asunto arreglado!

Ahora lo tedioso, cambiar lo que esta en inglés a buen salvadoreño; drásticamente tenenemos que abrir todos los archivos que hemos generado con el CUIDADO debido, empezaremos con el controlador. Abran empresas_controller.php (app/controllers) y busquen el bloque de código para el método view()



Y dejenlo asi:



Ahora busquen el método add()



Cambiandolo a:



Ahora vamos con el método edit()



Modifiquenlo asi:



Por ultimo el método delete()



A esto:



Guarden y cierren el archivo. Ahora diriganse al directorio app/views/empresas y abran cada una de las vistas, empecemos con index.ctp y verán que su contenido es más que todo html con secciones de código php. Busquen:



Y cambienlo a:



Ahora busquen:



Y solo hagan cambios en la línea seleccionada (amarillo):



Lo demas no lo toquen! ya que son los nombres de los campos de la tabla. Busquen ahora la línea 39 (más o menos):



Quedando después de los cambios:



En las últimas líneas:



Modifiquen para que quede así:



Guarden los cambios, cierren el archivo y volviendo a su navegador refresquen la página (F5):



Más entendible verdad ? Antes de los cambios, cuando haciamos click en Delete nos aparecía:



Ahora haciendo click en Eliminar:



Haciendo click en Ver:



En inglés no ? abramos la vista view.ctp y vamonos a las últimas líneas de código:



Cambien a:



Guarden y cierren, refrescando la página en el navegador:



Abran la vista correspondiente a editar datos (edit.ctp), con lo que veremos:



Modifiquen a esto:



Guarden y cierren, refrescando en mi navegador:



Estando de nuevo en la página donde se muestran todos los registros, hagan click en Nueva Empresa para que les aparezca:



Bueno, abran add.ctp para que vean lo siguiente:



Modifiquen para que les quede asi:



Guarden y cierren, en su navegador hagan un F5:



Solo para probar hagan click en el boton Guardar Datos:



Como ven se han disparado las validaciones para los campos, is las que estan en el modelo empresa.php en app/models, con lo que tenemos:



Modifiquemos para que quede:



Como les dije anteriormente se pueden mezclar validaciones, todo se maneja en un arreglo. Además se puede personalizar el mensage de error mediante el parámetro message. Tengan cuidado ya que se anidan varios arreglos. La página después de refrescar queda:



Por cierto, en el campo departamento (que es un enum) esta dificil (al menos para el usuario) digitar, pongamoslo fácil haciendo unas modificaciones a las vistas add.ctp y edit.ctp. Abran primero add.ctp y diriganse a la línea 8:



La línea seleccionada borrenla y agreguen lo siguiente:



Lo que se hizo fué que se cambio un textbox por combobox, desplegando en la lista todos los departamentos de la república y guardando como valor para el campo el mismo valor desplegado (observar el arreglo) y colocando como valor por defecto a Santa Ana. Lo mismo para la vista edit.ctp

Refrescando para ver la página (add):



Más Pro verdad ?

Todo el proceso descrito hasta ahora lo tienen que hacer para todas las tablas de la base de datos, pueden que lo vean algo tedioso ya que lo estan haciendo por primera vez. Eso si, ya al dominar esto, el trabajo que tendrían que hacer en una semana lo harían en una tarde, lo cual es un gran ahorro de tiempo y cerebro.-

En la Parte 5 veremos cómo hacer la página principal de su sitio, colocar disque menus y elaboraremos el control de las sesiones.-

Bueno, hasta aquí.-

1 comentarios:

EnemaDelMal dijo...

OH WOW!! Amigo acabo de descubrir tu blog Googleando y no sabes lo mucho que me serviran tu "disque tutorial" XD yo nunca le he dedicado tiempo a la programación y ahora que tengo que hacer un pequeño "sistema" usando el cake de encuestas para el desempeño y ando bien perdido. XD
Me gusta el tutorial, lo seguiré desde el principio ya que le pones imagenes y explicas paso a paso todo, estaré atento a futuras actualizaciones.
Saludos