Práctica 3.1 (Scrum) - Diseño de interfaces con JQuery y Ajax
Índice
- 1. Introducción
- 2. Objetivos de aprendizaje
- 3. Agenda de trabajo
- 4. Lista de requerimientos (Product Backlog)
- 5. Consejos
- 6. Criterios de calificación
1 Introducción
Se pretende crear una aplicación web para gestionar una biblioteca sencilla de recursos multimedia. Los tipos de elementos que gestionará la biblioteca son: películas, discos de música, libros y videojuegos. El diseño de la aplicación abarcará tanto la parte de cliente como la parte de servidor, utilizando un modelo de datos ya establecido.
La lógica de servidor estará basada en una API con arquitectura REST y modelo de intercambio de datos Collection + JSON. La base de la lógica será proporcionada por el profesor y el equipo de desarrollo tendrá únicamente que tomarla como referencia para completar las funciones restantes. Se utilizará el lenguaje PHP junto con el framework Slim para su desarrollo. La base de datos estará alojada en un servidor MySQL.
La lógica de cliente se implementará mediante una aplicación de una sola página (Single Page Application) y utilizará tecnología AJAX para comunicarse con el servidor. Se tomará como base un cliente genérico capaz de trabajar con cualquier API basada en el modelo de datos Collection + JSON y se añadirá la funcionalidad necesaria para representar de manera personalizada cada tipo de elemento de la biblioteca multimedia.
Por último, se utilizará tecnología de Integración Continua y Despliegue automático para hacer pública la aplicación en un servidor web.
Esta práctica se realizará en grupo siguiendo el framework de trabajo Scrum. Se puede consultar el flujo de trabajo y las convenciones que seguiremos en https://github.com/interfacesweb/presentacion.
Cada equipo tendrá asignado un repositorio en GitHub dentro de https://github.com/interfacesweb/ para la realización del trabajo.
2 Objetivos de aprendizaje
- Conocer la arquitectura REST para la creación de aplicaciones web.
- Implementar aplicaciones basadas en arquitectura REST.
- Conocer los fundamentos del diseño basado en Hipermedia (HATEOAS).
- Utilizar el lenguaje PHP y sus herramientas / frameworks asociadas para el desarrollo de aplicaciones.
- Utilizar un modelo de datos basado en JSON para el intercambio de datos entre cliente y servidor.
- Utilizar la librería JQuery para crear clientes web interactivos.
- Utilizar componentes prediseñados en JQuery UI para el diseño del interfaz web.
- Utilizar la tecnología AJAX para el intercambio de datos asíncrono entre cliente y servidor.
- Utilizar un sistema de integración continua para desplegar la aplicación en un servidor web.
- Aprender a trabajar en equipos de trabajo utilizando software de control de versiones.
3 Agenda de trabajo
- Martes 13/01/2015 a miércoles 14/01/2015
- Reunión de planificación (3 horas de clase).
- Jueves 15/01/2015 a miércoles 04/02/2015
- Trabajo del sprint (18 horas de clase).
- Jueves 05/02/2015
- Sprint Review / Demo (2 horas de clase).
- Viernes 06/02/2015
- Retrospectiva (1 hora de clase).
4 Lista de requerimientos (Product Backlog)
4.1 Lecturas sobre REST
Todas estas tareas deberán ser realizadas por todos los miembros del equipo.
- Lectura del artículo de Wikipedia sobre arquitectura REST: enlace.
- Lectura del artículo de Wikipedia (inglés) sobre HATEOAS: enlace.
- Lectura del artículo de Wikipedia (inglés) sobre JSON: enlace.
- Lectura de la descripción del modelo de datos Collection + JSON: enlace.
- Lectura de los ejemplos de uso de Collection + JSON: enlace.
- Definición de terminado
- Se han leído y comprendido los artículos propuestos.
4.2 Preparación del entorno de desarrollo
Todas estas tareas deberán ser realizadas por todos los miembros del equipo.
- Instalación de un entorno XAMPP (servidor Apache, PHP y MySQL) portable (archivo ZIP). Enlace
- Lectura de este artículo sobre Composer, un gestor de dependencias para PHP: enlace.
- Utilizando la consola de XAMPP, instalar Composer. https://getcomposer.org/doc/00-intro.md#manual-installation
- Utilizar GIT para clonar el repositorio de la práctica dentro de la carpeta
htdocs
de la instalación de XAMPP. - Ejecutar Composer para descargar automáticamente las dependencias del proyecto. https://getcomposer.org/doc/00-intro.md#using-composer
- Importar la base de datos en el servidor. Enlace.
- Probar la aplicación en el entorno local.
- Definición de terminado
- Se ha instalado el entorno de desarrollo junto con la herramienta Composer. Se ha incorporado el código del repositorio y se ha preparado para el trabajo. Se ha probado la aplicación en el servidor local y se ha comprobado su funcionamiento. Se ha leído el artículo propuesto.
4.3 Familiarización con Travis CI
Todas estas tareas deberán ser realizadas por todos los miembros del equipo.
- Lectura de la descripción de Travis CI: enlace.
- Análisis del fichero
travis.yml
incluido en el repositorio de la práctica.
- Definición de terminado
- Se ha analizado el archivo
travis.yml
y se ha entendido su sintaxis y función. Se ha leído y comprendido el artículo propuesto.
4.4 OpenShift
Esta tarea será realizada por todos los grupos a la vez.
- Introducción rápida a OpenShift.
- Creación de una cuenta para cada grupo de trabajo en OpenShift.
- Creación de una aplicación donde se alojará el proyecto. Para ello se creará una aplicación (Gear) Openshift PHP 5.4 con el cartucho MySQL y PHPMyAdmin.
- Carga de la base de datos en la aplicación de OpenShift utilizando PHPMyAdmin. Entender cómo está configurado el archivo
api/database.php
de la aplicación mediante variables de entorno para no tener que poner las claves de acceso al servidor MySQL en el archivo. - Modificación del archivo
travis.yml
para utilizar la cuenta de OpenShift creada anteriormente. Consultar este enlace y este otro. Opcional: ver cómo encriptar la clave de OpenShift para que no aparezca de manera pública en el archivo.travis.yml
. La información está disponible aquí. - Comprobación de que la aplicación está operativa en OpenShift.
- Definición de terminado
- Se ha comprendido la utilidad de OpenShift. Cada grupo ha creado una cuenta para alojar la aplicación. Se ha modificado el archivo
travis.yml
con la contraseña de usuario apropiada. Se ha subido la aplicación a OpenShift.
4.5 Familiarización con el código de servidor
Todas estas tareas deberán ser realizadas por todos los miembros del equipo.
- Análisis del código de servidor proporcionado en el repositorio. Familiarización con la sintaxis PHP, el framework Slim, el gestor de plantillas Twig y el ORM Eloquent.
- Análisis del fichero
.htaccess
integrado en el repositorio dentro de la carpeta/api
. - Lectura de los siguientes artículos sobre ORMs y Eloquent:
- Prueba del código de servidor a través del navegador web. Visualización de los datos devueltos.
- Definición de terminado
- Se ha analizado el código del servidor y se ha comprendido su funcionamiento de manera aceptable. Se han hecho pruebas de funcionamiento con el servidor a través del navegador web. Se han leído y comprendido los artículos propuestos.
4.6 Familiarización con el código de cliente
Todas estas tareas deberán ser realizadas por todos los miembros del equipo.
- Análisis del código de cliente proporcionado en el repositorio. Se trata de un cliente genérico capaz de trabajar con datos siguiendo el modelo Collection + JSON. Al tratarse de un cliente genérico, muestra los datos de manera fija utilizando elementos
<dd>
y<dt>
de HTML. Además, los formularios de edición y creación de elementos aparecen de una forma determinada. - Prueba del código de cliente a través del navegador web.
- Definición de terminado
- Se ha analizado el código del cliente y se ha comprendido su funcionamiento de manera aceptable. Se han hecho pruebas de funcionamiento con el cliente.
4.7 Modificación del código de servidor
El servidor está alojado en la ruta /api
. Es una aplicación basada en el formato Collection + JSON y por tanto es compatible con el cliente genérico proporcionado. Por ello, si se trabaja correctamente, el cliente funcionará sin problemas y servirá para hacer pruebas de funcionalidad.
La página principal de la API devuelve un objeto collection
con enlaces a cada uno de los tipos de elementos de la biblioteca: películas, discos, libros y videojuegos. Si se sigue alguno de esos enlaces se accederá a un nuevo objeto collection
que devolverá la lista de elementos correspondientes junto con otra serie de enlaces y opciones para poder:
- Crear un elemento nuevo.
- Realizar consultas sobre la lista.
- Acceder a un elemento determinado de la lista.
- Navegar a través de enlaces a otras listas o elementos relacionados.
Al acceder a un elemento determinado se accederá a otro objeto collection
que devolverá los datos del elemento correspondiente junto con otra serie de enlaces y opciones para poder:
- Realizar modificaciones sobre el elemento.
- Borrar el elemento.
- Navegar a través de enlaces a otras listas o elementos relacionados.
El modelo de datos de cada uno de los elementos se ha obtenido a partir de los modelos estandarizados en http://schema.org. Las propiedades de cada uno de los elementos son:
- Película (
Movie
)name
- Nombre de la película (texto)url
- URL para acceder a la película en cuestión (texto)description
- Descripción de la película (texto)director
- Director de la película (texto)datePublished
- Fecha de lanzamiento (fecha)embedUrl
- Código para incrustar el vídeo del trailer desde YouTube (texto)
- Disco (
MusicAlbum
)name
- Nombre del disco (texto)url
- URL para acceder al disco en cuestión (texto)description
- Descripción del disco (texto)datePublished
- Fecha de lanzamiento (fecha)image
- URL de la imagen de la carátula del disco (por simplicidad, esta ruta hará referencia a una imagen publicada en Internet) (texto)embedUrl
- Código para incrustar el audio de una de las canciones del álbum desde GrooveShark (u otro servicio como Spotify) (texto)
- Libros (
Book
)name
- Nombre del libro (texto)url
- URL para acceder al libro en cuestión (texto)description
- Descripción del libro (texto)isbn
- El ISBN del libro (texto)datePublished
- Fecha de publicación (fecha)image
- URL de la imagen de la portada del libro (por simplicidad, esta ruta hará referencia a una imagen publicada en Internet) (texto)
- Videojuegos (
VideoGame
)name
- Nombre del videojuego (texto)url
- URL para acceder al videojuego en cuestión (texto)description
- Descripción del videojuego (texto)gamePlatform
- Plataforma en la que está disponible (texto)applicationSubCategory
- Categoría del videojuego (plataformas, arcade,…) (texto)screenshot
- URL de la imagen de una pantalla del juego (por simplicidad, esta ruta hará referencia a una imagen publicada en Internet) (texto)datePublished
- Fecha de lanzamiento (fecha)embedUrl
- Código para incrustar el vídeo del trailer desde YouTube (texto)
Las tareas que hay que realizar son:
- Crear las rutas apropiadas para acceder a cada uno de los recursos (listas y elementos) ofrecidos por la aplicación: listas de películas, películas, listas de discos, discos, listas de libros, libros, listas de videojuegos y videojuegos.
- Para cada tipo de elemento habrá que crear la lógica apropiada para realizar las operaciones relacionadas (CRUD):
- Devolver la lista de elementos.
- Crear un nuevo elemento.
- Modificar un elemento.
- Borrar un elemento.
- De manera opcional, se puede añadir un test de validación siguiendo el ejemplo adjunto en el repositorio. Dicho test será ejecutado al realizar el Pull Request en GitHub por el sistema de integración continua Travis-CI.
- Definición de terminado
- Se ha comprobado el correcto funcionamiento de cada tipo de elemento con el cliente. Se pueden realizar las cuatro operaciones CRUD sobre cada tipo de elemento. El cliente muestra correctamente los datos en pantalla. La API está disponible en el servicio OpenShift.
4.7.1 Recogida de datos enviados con POST o PUT
El formato Collection + JSON envía datos en formato JSON al servidor siguiendo la especificación. Por tanto, el servidor debe recoger los datos en dicho formato y traducirlos a objetos (o vectores) tipo PHP. Para saber más sobre el tema se pueden consultar los siguientes enlaces:
- http://docs.slimframework.com/#Request-Body
- http://php.net/manual/en/function.json-decode.php (utilizar parámetro
true
para procesarlo como un array asociativo, ya que es más fácil). - http://stackoverflow.com/questions/15043981/how-to-access-json-decoded-array-in-php#15044030
4.8 Modificación del código de cliente
Se proporciona un cliente genérico del formato de datos Collection + JSON. Dicho cliente está disponible en https://github.com/collection-json/cjlib.
El cliente utiliza tecnología AJAX para el intercambio de datos entre cliente y servidor. En este enlace de la wikipedia se explica de manera bastante clara su funcionamiento.
El objetivo que se persigue es modificar dicho cliente para que no muestre los datos de una manera genérica, sino que los muestre de manera personalizada para cada elemento. Por ejemplo, la API devuelve un código HTML para cargar el trailer de la película desde Youtube: el objetivo es que el cliente coja esa información y en lugar de mostrar el texto con ese código muestre el reproductor de Youtube. También se pueden cambiar los campos con fechas para mostrar un widget más apropiado, o cualquier otro cambio que se crea necesario.
Para ello se deberán realizar cambios en el código del cliente (archivo cjlib.js
) para que identifique el tipo de datos devuelto en cada caso (si son libros, películas, videojuegos o discos) y ejecute una función JavaScript diferente para mostrar cada uno de ellos. Dichas funciones se definirán en ficheros JavaScript distintos para que cada miembro pueda trabajar de forma separada. Para mantener la compatibilidad del cliente con futuros tipos de datos distintos se mantendrá la funcionalidad original en el caso de que el tipo de elemento devuelto no coincida con ninguno de los cuatro elementos de la aplicación.
También se debe cambiar la manera en que se muestran los formularios de actualización o creación de elementos nuevos para que se muestren de distinta manera a como se hace por defecto.
Para todo ello se utilizará la librería JQuery, con posibilidad de utilizar la extensión JQuery UI.
Por último, se dará formato a la página de la aplicación. Para ello se pueden utilizar los widgets de JQuery UI, Bootstrap o CSS.
- Definición de terminado
- Se han realizado los cambios pedidos en el cliente. Cada tipo de elemento se muestra de manera personalizada. El cliente funciona correctamente con los cuatro tipos de elementos de la aplicación. La aplicación completa está disponible en el servicio OpenShift.
5 Consejos
- Los equipos deben ponerse de acuerdo para dedicar una sesión de clase a las tareas relacionadas con OpenShift.
- Es recomendable que cada miembro del equipo trabaje con código de cliente y código de servidor. La idea es que cada miembro del equipo trabaje con uno de los grupos de elementos de la biblioteca: películas, discos, libros y videojuegos.
- Es recomendable que cada miembro del equipo trabaje en un archivo JavaScript de cliente diferente. La página de la aplicación cargará cada uno de dichos archivos para que el cliente genérico llame a las funciones de dichos archivos.
- Dado que en la sesión de planificación el equipo no está todavía familiarizado con el código, es difícil que pueda determinar la estructura de la página principal o cómo va a modificar el cliente genérico. Por tanto, es recomendable crear una tarea destinada a hablar de estos temas durante el sprint.
- Es recomendable no trabajar más de un usuario en el mismo archivo para evitar conflictos. Para ello debería asignarse cada tarea a una funcionalidad que se implemente en archivos independientes.
- Es recomendable realizar un commit y un push como mínimo antes de que termine cada clase.
6 Criterios de calificación
- Hoja de seguimiento (20%): actualización y supervisión diaria, actualización de la estimación de las tareas, dibujo de la gráfica de Burn Down, celebración de reuniones diarias,…
- Porcentaje realizado de la lista de requerimientos (20%): porcentaje de historias implementadas que cumplan con la definición de terminado, cantidad de tareas adicionales realizadas.
- Calidad del producto generado (20%): originalidad, superación de tests de validación, correcta visualización, diseño consistente, usabilidad,…
- Realización de la retrospectiva (20%): correcta revisión de las estrategias utilizadas, identificación de puntos de mejora, análisis de equipo, análisis individual.
- Presentación de los resultados (20%): participación de todos los miembros del equipo, fluidez de la exposición, adecuación al tiempo disponible.