TFG 2103-Pibernatm
TFG 2103-Pibernatm
TFG 2103-Pibernatm
Supervisor:
Autor: Manuel Garcı́a del Ojo
Marina Pibernat Segarra Tutor académico:
Antonio Morales Escrig
Tanto el desarrollo del sistema como el presente documento forman parte del proyecto de
final de grado del Grado en Ingenierı́a Informática. Este trabajo ha sido desarrollado durante
una estancia en practicas en Culturaweb, una empresa de Castellón dedicada al desarrollo de
software. El proyecto ha sido desarrollado para uno de sus clientes: Tungaloy, una empresa
japonesa dedicada a la producción y venta de metal y herramientas.
Palabras clave
Keywords
Índice de figuras 7
1. Introducción 11
1.1. Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.1. Metodologı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4.3. Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3
4.2.2. Historias de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.5. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.1. Front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2. Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3. Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4. Documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6. Resultados y conclusiones 57
6.2. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Glosario 61
4
A.2.1. Teaser shortcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
B. Estructura de ficheros 87
5
6
Índice de figuras
4.2. Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7
4.10. Diseño lógico de la página Products . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8
A.5. Código HTLM para teaser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
A.12.Shortcode tabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
A.18.Panel de administración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9
10
Capı́tulo 1
Introducción
El desarrollo del proyecto que se presenta en este documento es el resultado del trabajo
realizado para la asignatura EI1054 Prácticas en Empresa y Proyecto de Fin de Grado del
Grado en Ingenierı́a Informática en la Universidad Jaume I de Castellón.
En el resto del documento describimos el proceso de desarrollo llevado a cabo. Tomando como
base el sistema de gestión de contenidos WordPress, hemos desarrollado un sistema web en PHP
totalmente personalizado. Para el desarrollo del sitio hemos partido de un diseño proporcionado
por el cliente para desarrollar un sistema que permite gestionar toda la información que la
empresa desee poner a disponibilidad del público.
Al final del documento podemos encontrar un glosario donde incluimos términos técnicos
utilizados en este escrito.
1.1. Contexto
El PFG (Proyecto de Final de Grado) lo hemos desarrollado durante una estancia en prácti-
cas en una empresa de acogida. Se trata de un proyecto encargado a esta empresa por uno de
sus clientes.
11
Figura 1.1: Empresa de acogida
Empresa de acogida
Culturaweb es una empresa joven de cuatro trabajadores. Fue creada en 2011 con el objetivo
de ayudar a otras empresas a diseñar y construir sus marcas y productos en internet. Entre
los servicios que ofrece la empresa encontramos: diseño gráfico, desarrollo de páginas web,
aplicaciones para móviles, tiendas virtuales, posicionamiento en buscadores y asesoramiento
para startups.
La empresa empezó su recorrido realizando trabajos para empresas locales, pero al poco
tiempo amplió su mercado y en la actualidad trabaja con agencias publicitarias de Madrid y
Barcelona.
La infraestructura técnica de la empresa está formada por una red local, un servidor Debian,
un switch, un router y un servidor remoto CentOS. Por último, los equipos con los que cuenta
la empresa para el desarrollo del trabajo son: cuatro iMacs, un MacBook Pro y un PC con
Windows 8, el cual utilizamos durante la estancia en prácticas y para el desarrollo del proyecto.
Empresa cliente
Tungaloy fue fundada en 1934, con su sede principal en Japón, fue la primera empresa
del paı́s en tener éxito en el desarrollo de aleación superduro. La empresa es miembro de la
IMC (International Metalworking Companies), una de las compañı́as metalurgicas más grandes
del mundo. La empresa, propiedad de Berkshire Hathaway, actualmente cuenta con plantas y
oficinas en más de 25 paı́ses.
12
1.2. Antecedentes y motivación
La empresa cliente ya contaba con una web corporativa pero debido al paso del tiempo y a
la necesidad, cada vez más fuerte, de las empresas de mantener una imagen digital cuidada y
adecuada, se les hizo imprescindible renovar su web corporativa.
Por un lado, el uso de dispositivos móviles para navegar por Internet está creciendo a un
ritmo increı́ble, y los dispositivos móviles ya generan casi un tercio del tráfico web [25]. Por este
motivo cada vez más empresas están renovando sus sitios web para adaptarlas a la multitud de
dispositivos desde los que pueden ser consultadas.
Por otro lado, la interacción con los clientes a través de redes sociales se ha vuelto muy impor-
tante para las empresas y se hace necesario contar con sitios web que permitan esta interacción
con funcionalidad para compartir y comentar.
13
14
Capı́tulo 2
El cliente pidió que a partir de un diseño que ellos nos proporcionarı́an se crease un si-
tio web responsive, es decir, que se adapte al tamaño del dispositivo con el que se accede, y
completamente gestionable.
En el Anexo C Diseño proporcionado por el cliente hemos incluido impresiones de cada una
de las páginas del diseño, por si no se dispone de conexión a Internet o por si en un futuro el
enlace deja de estar operativo.
Se trata de un mockup creado a partir de imágenes que muestra todas las páginas principales
del sitio y ejemplos de algunas páginas secundarias.
El principal objetivo de este proyecto es crear una nueva web corporativa para la empresa
que tenemos como cliente. Las caracterı́sticas que el sitio web debe cumplir son las siguientes:
15
Diseño a medida proporcionado por el cliente.
Esta es la única información que nos ha proporcionado el cliente, a partir de ella, en los puntos
4.1. Visión general del sistema y 4.2. Análisis de requisitos, se definen los objetivos técnicos
concretos y los requisitos del sistema que nos llevarán a conseguir el objetivo principal del
proyecto.
Una vez logrado el objetivo y construido el sistema, el cliente espera un beneficio llegando
a los siguientes puntos:
No se han proporcionado más datos o requisitos del tipo: como usuario necesito añadir
productos, estos han de ser extraı́dos como parte del proyecto a partir del diseño proporcionado.
En el apartado 4.1. Análisis y diseño de software detallamos los requisitos extraı́dos, que si bien
podrı́an haber sido incluidos en la descripción del proyecto, los hemos incluido en el apartado
de análisis ya que son el resultado de un estudio y análisis del prototipo del cliente.
16
Capı́tulo 3
Para toda la planificación y el desarrollo del proyecto diferenciamos dos grandes partes
del proyecto:
Parte front-end, traducible al español como interfaz, es la parte del software que interactúa
con el usuario, haciendo referencia a la parte que visualiza el usuario navegante.
Parte back-end, traducible como motor, es la parte que procesa la entrada desde el front-
end, también hace referencia a la parte de administración del sitio.
Estas dos partes dividen el desarrollo del proyecto en dos fases. Una primera fase de desarrollo
front-end en la que replicamos el mockup del cliente utilizando HTML, CSS y JavaScript. Y
una segunda fase back-end en la que agregaremos un panel de administración y una base de
datos a la web para que pueda ser modificada por usuarios sin conocimientos técnicos. Para
esta segunda fase utilizamos PHP, y MySql para la base de datos.
3.1. Metodologı́a
Aunque el desarrollo del proyecto ha sido llevado a cabo por un único miembro, y por tanto
no se ha podido seguir una metodologı́a de desarrollo ágil al completo, hemos utilizado una
metodologı́a basada en en los principios de desarrollo ágil. Uno de los puntos en los que se hace
mayor incidencia en cualquier metodologı́a ágil es en la gestión del trabajo en equipo, nosotros
17
hemos dejado de lado este aspecto y hemos creado nuestra propia metodologı́a adoptando parte
de varios métodos de desarrollo ágil.
Basándonos en los principios del Manifiesto por el Desarrollo Ágil del Software[20] en nues-
tra metodologı́a tenemos especialmente en cuenta los siguientes puntos que coinciden con el
manifiesto:
Como en todas las metodologı́as ágiles, los requisitos son muy flexibles. En lugar de intentar
definir todos los requisitos al comienzo del proyecto e invertir esfuerzos después en controlar los
cambios en los requisitos, intentamos una aproximación más realista que nos permita adaptar-
nos a los cambios en cualquier momento. Poniendo más énfasis en la adaptabilidad que en la
previsibilidad.
Como hemos dicho anteriormente el proyecto se desarrolla en dos fases: programación front-
end y programación back-end.
En la primera fase, programación front-end, copiamos el diseño del cliente y obtenemos una
web completa de cara al usuario final pero no modificable, es decir, sin panel de administración.
En esta fase tenemos en cuenta los siguientes puntos acordados con el cliente:
18
Desarrollo utilizando HTML5, CSS3 y JavaScript.
Compatibilidad con todos los navegadores móviles actuales: Safari, Google Chrome, Fire-
fox, etc.
Además de estas ventajas, la empresa cuenta con experiencia utilizando este CMS y posee
un know-how que nos permite desarrollar un sistema de calidad de forma rápida y eficiente.
En esta fase unimos la web creada en la primera fase con el panel de administración que nos
proporciona Wordpress. Los puntos a tener en cuenta son:
19
Módulo de últimas entradas: permite incluir las últimas entradas del blog por categorı́as
en la barra lateral de cada página.
Módulo de contacto: permite a los usuarios comunicarse con la empresa, el módulo en-
viará respuestas automáticos a los usuarios, y las consultas serán enviadas a diferentes
destinatarios en función del departamento seleccionado.
Módulo de entradas relacionadas: este módulo mejora la navegación entre las entradas del
blog y ayuda a reducir el rebote de la página.
Módulo de feedback: permite a los usuarios hacer comentarios sobre las entradas del blog.
Una vez terminadas las dos fases de desarrollo ya tenemos el sistema completo, entonces,
pasamos a desplegar el proyecto en el servidor de producción, para ello llevamos a cabo las
siguientes tareas:
En la Figura 3.1 podemos observar un diagrama de Gantt con la estimación del esfuerzo en
horas para cada fase. En la Figura 3.3 detallamos la planificación y la mostramos con mayor
20
Figura 3.1: Diagrama de Gantt de fases del proyecto
detalle. Indicamos la estimación en horas para cada tarea y las fechas de realización previstas.
Para realizar las estimaciones hemos utilizado el método basado en el juicio experto[18]. En
la figura vemos que estimamos 40 horas para el desarrollo de la propuesta técnica, incluyendo
tareas como la definición del proyecto, los métodos de trabajo, etc. El resto de las 300 horas se
prevé dedicarlas al desarrollo del sistema, utilizando 80 horas para la parte de front-end y 140
horas para las tareas de back-end.
CSS3[38]: para controlar el estilo y los layouts de múltiples páginas HTML a la vez,
separando ası́ la estructura del diseño.
21
Figura 3.3: Planificación inicial de tareas
22
que nos proporciona Bootstrap adaptándolos a los requerimientos de diseño del cliente.
Hemos escogido Bootstrap sobre otras opciones porque, aunque no es tan avanzado como
otros, es el framework de su tipo que ofrece mayor compatibilidad con versiones antiguas
de navegadores.
PHP[33]: un lenguaje de programación del lado del servidor que utilizaremos para el desa-
rrollo web de contenido dinámico. Es el lenguaje que se utiliza para programar Wordpress.
Respecto a las herramientas que hemos utilizado para desarrollar el proyecto son las siguien-
tes:
Prepros[28]: una herramienta para el desarrollo web que hemos utilizado para compilar
código de LESS a CSS y para la concatenación de ficheros JavaScript.
Git[12]: un sistema de control de versiones distribuido que permite mantener una gran
cantidad de código caracterizándose por su eficiencia. Git realiza el control de versiones
en repositorios locales.
Por último, para la elaboración de este documento hemos hecho uso de las siguientes herra-
mientas:
23
Cacoo[8]: es una herramienta online para la creación de diagramas.
Libreoffice[30]: una suite ofimática libre y de código abierto. Hemos utilizado sus hojas de
cálculo para generar tablas.
Para el desarrollo del proyecto nos hemos servido de un ordenador de sobremesa, un servidor
local para almacenar el proyecto y una tableta para pruebas. A continuación detallamos las
caracterı́sticas principales de cada equipo.
Ordenador de sobremesa:
Disco duro: 1TB 7200 RPM SATA Hard Drive 6.0 Gb/s.
Servidor:
Sistema Debian.
Tableta:
Gráficos SGX544MP2.
24
Figura 3.5: Presupuesto recursos humanos
3.4.3. Presupuesto
El presupuesto estimado para el desarrollo del proyecto incluye las horas de trabajo a dedicar
y el precio proporcional a las horas de uso de los equipos que utilizamos según su tiempo de
vida útil. Todo el software que utilizamos es libre o gratuito, por tanto no necesitamos licencias
que debamos incluir en el presupuesto.
Para establecer el presupuesto necesario para los recursos humanos partimos del precio por
hora para cada una de las funciones que desempeñamos. Hemos recogido el precio por hora para
cada función de varias estadı́sticas realizadas por InfoJobs[13], Bureau of Labor Statics[7] y U.S.
News[37]. En la Figura 3.5 encontramos en presupuesto estimado para los recursos humanos.
En la Figura 3.6 vemos el presupuesto para los recursos tecnológicos. A partir del precio de
los equipos que utilizamos y de la vida útil de cada uno[9], calculamos el precio proporcional
según las horas de uso del equipo en el proyecto.
Por último, en la Figura 3.7 podemos observar el presupuesto total, suma de las dos esti-
maciones anteriores.
25
26
Capı́tulo 4
En este capı́tulo presentamos el análisis de requisitos del sistema y el diseño lógico del mismo,
los detalles técnicos y de implementación quedan para el siguiente capı́tulo.
Antes de empezar ofreceremos una visión general del sistema mediante un diagrama de casos
de uso. La Figura 4.1 nos da una idea general de la funcionalidad del sistema.
27
4.2. Análisis de requisitos
Como parte del proyecto realizamos un análisis de requisitos donde identificamos todas las
caracterı́sticas o condiciones que el sistema ha de cumplir. De esta manera logramos comprender
mejor el problema a resolver y podemos definir la solución informática más adecuada.
Los requisitos los extraemos a partir del análisis del mockup proporcionado por el cliente
(disponible en el Anexo B ). Se trata de un proceso de ingenierı́a inversa en el obtenemos
información a partir de un diseño del producto ya construido. En los siguientes apartados
presentamos los requisitos obtenidos.
En este proyecto los requisitos de interfaz y navegación están muy claros: la interfaz del
sistema tiene que ser exactamente como se muestra en el diseño, del mismo modo, la navegación
por el sistema en la parte del usuario ha de copiar la navegación que se muestra en el mockup.
Además, la interfaz ha de ser responsive.
• Sólo se podrán modificar los enlaces de la parte inferior del header (Figura 4.2).
HU2 Como administrador necesito añadir, modificar y eliminar elementos del footer.
28
Figura 4.3: Partes modificables del footer
29
Figura 4.6: Ejemplo de menú desplegable
HU8 Como administrador necesito crear, modificar y eliminar sliders y añadirlos a una
página.
HU9 Como administrador necesito crear, modificar o eliminar eventos que se muestren
automáticamente en la sección de eventos.
HU10 Como administrador necesito crear, modificar o añadir productos y que se muestren
automáticamente en la sección de productos.
HU13 Como administrador necesito añadir, modificar o eliminar destinatarios del formu-
lario de contacto.
HU14 Como usuario necesito contactar con la empresa a través de un formulario que
envié un mensaje al destino seleccionado.
HU15 Como usuario necesito acceder a redes sociales de la empresa y compartir sus
noticias en mis redes sociales.
Módulo mod rewrite de Apache. Es un módulo del servidor web que permite crear direc-
ciones URL alternativas a las dinámicas generadas por la programación del sitio web, de
esta manera podemos hacerlas más legibles y fáciles de recordar.
30
4.2.4. Requisitos de calidad
Compatible con todos los navegadores móviles actuales: Safari, Google Chrome, Firefox,
Opera, etc.
Seguro.
4.2.5. Restricciones
La principal restricción para el desarrollo del proyecto es temporal, las 300 horas de las que
disponemos.
Analizando el contenido de cada página del mockup observamos que el sistema está compues-
to tanto de paginas estáticas como de páginas con contenido dinámico. En nuestro diseño, las
páginas con contenido estático almacenan toda la información utilizando la funcionalidad que
por defecto Wordpress nos ofrece. Para las páginas con contenido dinámico necesitamos crear
estructuras de almacenamiento que hagan uso de lecturas en una base de datos para seleccionar
el contenido a mostrar.
A continuación detallamos el diseño de cada página con contenido dinámico. Partimos del
diseño para crear la estructura lógica, en el punto 5.2.2 Implementación en Wordpress detalla-
mos cómo usar los recursos del gestor de contenidos Wordpress para desarrollar un sistema con
el diseño especificado.
Página: Home
En la Figura 4.7 podemos ver la parte del diseño de la Home que nos lleva al diseño lógico
de la Figura 4.8. Observamos que se necesitan tres entidades independientes: Slider, Noticia y
Prensa.
31
La entidad Slider está formada por un nombre como identificador, un conjunto de imágenes
y el contenido o texto que se visualiza sobre cada una de ellas.
Respecto a las entidades Noticia y Prensa, aunque a simple vista las dos entidades son
iguales las hemos separado porque destinamos cada entidad a una finalidad. En el diseño no se
aprecia debido a que los textos que aparecen son de relleno pero la entidad Noticia se destina
a la publicación de cualquier tipo de novedad y la entidad Prensa a la publicación de noticias
periódicas de carácter más periodı́stico.
Página: Products
En la Figura 4.9 vemos parte del diseño de la página Products, de ella extraemos la estructura
lógica detallada en la Figura 4.10. Si observamos la página completa disponible en el Anexo B
Diseño proporcionado por el cliente la necesidad de cada entidad se hace más evidente.
32
Figura 4.9: Captura de parte de la página Products
Como podemos apreciar en la Figura 4.10, se trata de una jerarquı́a vertical en la que
cada entidad tiene un único padre y múltiples hijos. Cada elemento contiene determinados
atributos necesarios para la correcta visualización de la página. Por ejemplo, la entidad Categorı́a
almacena el color de la barra que se muestra a su derecha. Por otro lado, la entidad Producto
almacena datos que se mostrarán al entrar en el enlace de cada producto.
El resto de elementos del diseño de la Figura 4.9 no necesitan estructuras de datos especı́ficas,
los almacenamos como contenido estático de la página ya que no corresponden a ninguna entidad
que podamos abstraer conceptualmente.
33
Página: Worldwide Network
En la Figura 4.11 observamos la parte del diseño que nos conduce al diseño lógico. En la
Figura 4.12 vemos que cada subsidiaria tiene varios distribuidores y cada distribuidor pertene-
ce a una subsidiaria. Cada entidad almacena los datos que vemos en el diseño que se desean
mostrar.
34
Página: Publications
Página: About Us
En la página About Us encontramos una sección donde se muestran los últimos eventos
programados (Figura 4.15), por cuestiones de comodidad deseamos que estos eventos se muestren
automáticamente en lugar de tener que ir modificando la página manualmente cada vez que un
evento ya ha pasado. Ası́ que creamos una estructura que almacene los eventos y ası́ cuando se
muestra la página se mostrarán sólo los próximos eventos. En la Figura 4.16 vemos el diseño
lógico necesario, es muy simple, una única entidad que contiene toda la información del evento
y la fecha con la que se comprobará si el evento ya ha pasado o no.
35
Figura 4.15: Captura de parte de la página About Us
36
Capı́tulo 5
Implementación, pruebas y
documentación
5.1. Front-end
Empezamos con una implementación de todas las páginas sin cuidar demasiado el detalle, de
esta manera, como si de los cimientos de una construcción se tratase, el cliente puede ir viendo
el desarrollo del esqueleto del sitio y como vamos agregando detalles a este esqueleto inicial.
En esta fase también tenemos especial cuidado con el código escrito para optimizarlo para
posicionamiento SEO. Con esta finalidad, tenemos en cuenta los siguientes puntos:
Escribir HTML válido, es decir código que cumpla con los estándares del World Wide
Web Consortium.
Utilizar las nuevas etiquetas de HTML5.
Utilizar correctamente etiquetas: title, meta description, h1, h2, h3...
No usar JavaScript dentro del archivo HTML.
Usar CSS3 en lugar de JavaScript siempre que se pueda.
Escribir el mı́nimo código HTML posible.
Utilizar nombres semánticos y descriptivos para variables.
Finalmente revisamos todas las páginas para programar la funcionalidad responsive. En las
Figuras 5.1 y 5.2 encontramos un ejemplo del aspecto de la Home para dos tamaños distintos de
37
Figura 5.1: Home para escritorio
pantalla. Se trata de revisar cada página y programar distinto aspecto dependiendo del tamaño
de la pantalla.
5.2. Back-end
38
Figura 5.2: Home para móviles
caracterı́sticas y funciones como: gestión de varios idiomas, servicio anti-spam, funciones para
eCommerce, etc. Al igual que con las plantillas, también podemos desarrollar nuestros propios
plugins.
WordPress nos ofrece varios mecanismos para modificar y gestionar nuestro sitio web, enu-
meremos y expliquemos los más relevantes o los que a nosotros nos han sido de mayor utilidad:
Taxonomias.
Shortcodes.
Plantillas.
Widgets.
Post types
Un post type es un tipo de datos en WordPress. Este tiene cinco tipos de posts por defecto[46]:
1. Entradas: normalmente son utilizadas como elemento de contenido básico en los blogs y
suelen mostrarse en orden cronológico inverso.
39
2. Páginas: otro elemento de contenido pero que en lugar de mostrarse junto a los demás de
su tipo en determinado orden se muestran individualmente como elemento único, suelen
utilizarse para mostrar información estática del sitio. Por ejemplo, podrı́amos dedicar una
página para mostrar todas las entradas que existan o para mostrar información estática
como información de contacto. Cada página puede utilizar distintas plantillas para mostrar
la información de manera diferentes.
3. Adjuntos: este post type almacena los archivos subidos a través de WordPress.
Además de estos posts types se pueden crear nuevos tipos de posts. Los custom post types
son nuevos tipos de posts personalizados que podemos crear con los campos y caracterı́sticas
que nosotros queramos. En el Anexo A Ejemplos de código WordPress podemos consultar cómo
crearlos.
Taxonomias
Las taxonomı́as[50] permiten agrupar cosas, como por ejemplo: entradas, páginas, adjuntos,
etc. Una taxonomı́a es como una etiqueta que le damos a varios elementos para identificarlos,
organizarlos y poder hacer búsquedas.
Shortcodes
Los shortcodes[49] son pequeños códigos que podemos utilizar desde el editor de WordPress.
Permiten ahorrar tiempo en labores repetitivas y preprogramar funciones para añadir al conte-
nido de entradas o páginas sin necesidad de que el usuario tenga conocimientos técnicos. Son
como tags HTML que usan corchetes ([ ]) en vez de los sı́mbolos de mayor y menor qué (< >).
Tienen un aspecto ası́:
[ shortcodedeejemplo ]
40
Plantillas
Wordpress permite asignar fácilmente a las páginas una plantilla[45] de página, de esta
manera conseguimos que la página tenga determinada estructura o aspecto.
Widgets
Un widget[53] es un pequeñı́simo programa que nos da acceso a funciones que usamos normal-
mente. Este mecanismo nos permite definir una zona de widget y colocar en esa zona cualquier
tipo de widget.
Una vez introducidos a los mecanismos que Wordpress nos ofrece para adaptar su panel
de administración a nuestra web, vamos a repasar página por página y ver cómo utilizamos
estos mecanismos para desarrollar nuestro sitio web. Antes de ello, la Figura 5.3 nos muestra
un esquema general de los mecanismos que utilizamos para cada parte de la web.
Página: Home
En la Figura 5.4 podemos observar todas las herramientas de Wordpress que empleamos
para el desarrollo de la Home.
En el header hacemos uso del post type menu, de esta manera permitimos que desde el
panel de administración, en la sección de menus se puedan añadir o quitar elementos. La parte
izquierda del footer también tiene un menú asociado, de igual manera, se podrá modificar desde
la sección de menus del panel de administración. El post type menu de Wordpress nos permite
añadir elementos, del tipo nombre con su respectivo enlace, es el mecanismo perfecto para hacer
modificables estas dos zonas.
En la parte derecha del footer encontramos una zona modificable a través de un widget. Para
hacerla modificable desde el panel señalamos el espacio como zona para widgets. Los widgets y
los menús son los único mecanismos que nos permite modificar partes de la página que no son
del contenido principal y no pertenecen a ningún post type.
Tanto el header como el footer son elementos que están presentes en todas las páginas de la
web, para lograrlo los incluimos en todas las plantillas del tema.
Continuamos con la Figura 5.4, debajo del header encontramos un slider. Para poder guardar
distintos sliders e intercambiarlos cuando queramos sin necesidad de crear una copia completa
de la página con un slider diferente creamos un custom post type slider. Este está formado por
los campos que se describen en el apartado 4.3. Diseño del sistema, un nombre identificativo,
todas las imágenes del slider y el contenido que se muestra sobre cada imagen. De esta manera,
41
Figura 5.3: Tabla resumen de implementación
42
configurando el panel para ello, cuando creemos una página podemos indicar si queremos que
se le añada un slider y cuál de todos los que haya almacenado en el sistema.
Más abajo en el diseño encontramos dos cuadros en los que se muestra los titulares de
noticias y prensa, crearemos un custom post type para la prensa y utilizaremos el post type por
defecto entradas para las noticias o novedades. A su vez, estas noticias se encuentran dentro de
un recuadro que muestra sólo las tres últimas registradas en el sistema con determinado diseño,
para mostrar estos recuerdos creamos dos shortcodes que realizan una consulta a la base de
datos y muestran la información con la apariencia deseada. De esta manera escribiendo en el
editor: [whatsnew] o [pressrelease] obtenemos el recuadro de la figura mostrando las últimas
noticias y la última prensa.
Recordemos el motivo de utilizar post types, shortcodes, widgets, etc. Podemos lograr toda la
apariencia que se muestra en la Figura 5.4 sólo con código HTML y CSS, pero la página no serı́a
editable sin modificar el código, no podrı́a ser modificada sin conocimientos técnicos. Por este
motivo adaptamos el código HTML que ya tenı́amos al panel de administración de Wordpress,
para que cualquier usuario sea capaz de editar el contenido de la web.
Página: About us
En la Figura 5.5 vemos los mecanismos que utilizamos para adaptar la página About us al
panel de Wordpress.
Arriba del todo vemos un tı́tulo que se muestra en color negro, junto a un subtı́tulo en
color rojo, con otra fuente y entre dos rayas. Para que el usuario pueda poner este tipo de
tı́tulos en cualquier página creamos el shortcode teaser, de esta manera el usuario podrı́a lograr
el resultado de la figura escribiendo en el editor:
[ acordeongroup ]
[ teaser title = ‘ ‘ events ’ ’ subtitle = ‘ ‘ Exhibitions \& Seminars ’ ’]
Destaquemos un pequeño detalle, este tipo de tı́tulos se utilizan en todas las páginas de la web,
en todas las páginas el subtı́tulo aparece siempre completamente rojo, a excepción de este caso
en el que el sı́mbolo & aparece en color negro y con el mismo tipo de letra que el tı́tulo principal.
Implementar una solución editable para este pequeño detalle complicarı́a bastante la solución
de modo que le recomendamos al cliente dejar de lado ese pequeño detalle de diseño y poner el
subtı́tulo siempre todo en rojo, con el visto bueno del cliente llevamos a cabo la solución más
sencilla. Esto es un ejemplo de la comunicación cliente-desarrollador que nos enseña como el
desarrollador ha de aconsejar al cliente para poder llegar a la mejor solución.
Sigamos con la Figura 5.5, a la izquierda vemos una lista de eventos, para almacenar estos
eventos creamos un custom post type events con la fecha, nombre y lugar. Para mostrarlos con
el aspecto del diseño, desarrollamos un shortcode events que realiza una consulta a la base de
datos de Wordpress y muestra los próximos eventos.
Más abajo en la figura encontramos un desplegable con un botón que muestra una serie
de opciones, al seleccionar una opción y clocar sobre el botón el navegador debe redirigirnos a
43
Figura 5.4: Implementación conceptual de la Home
44
determinada página. Para que el usuario final pueda crear este tipo de desplegables creamos un
shortcode dropdown. De esta manera el cliente puede obtener un desplegable funcionando con
el siguiente código:
Página: Industries
Página: Products
A la derecha vemos una barra lateral que implementamos mediante un widget. Para lograr
una página con esta barra lateral el usuario tendrá que seleccionar la plantilla sidebar y editar
los elementos que desee desde la sección de widgets del panel WordPress.
Como podemos apreciar más abajo, la página está compuesta por una lista de productos,
para almacenar y gestionar todos los productos creamos un custom post type products. Tam-
bién abrimos la posibilidad de crear taxonomı́as para este nuevo post type. Desde el panel de
Wordpress se podrán crear categorı́as o taxonomı́as indexables. A cada producto se le tendrá
que añadir una categorı́a, ésta determinará el lugar en el que se mostrará el producto. El nivel
de la categorı́a determinará como se muestre ésta. Por ejemplo, las taxonomı́as de nivel dos se
muestran como aparece en la Figura 5.7, con un tamaño más grande y con una barra de color
a su lado; las taxonomı́as de nivel tres aparecen en un tamaño de fuente menor y sin la barra a
su derecha; las taxonomı́as de nivel cuatro en un tamaño aún menor.
Esta página la encontramos en la Figura 5.8. En ella tenemos un desplegable de paı́ses, una
zona gris en la que se muestra la subsidiarı́a de un paı́s y abajo una zona blanca en la que
aparecen todos los distribuidores del paı́s. Al cambiar entre los paı́ses del desplegable cambian
los datos de estas dos zonas.
Para implementar esta página hemos creamos un custom post type distributors que alma-
cene todos los datos necesarios (en el punto 4.3. Diseño del sistema ya detallamos qué datos
necesitarı́amos guardar). También hemos creamos dos taxonomı́as cerradas para este cueto post
type: distributor y subsidiarie y una taxonomı́a abierta countries para que el usuario pueda
45
Figura 5.5: Implementación conceptual de la página About us
46
Figura 5.6: Implementación conceptual de la página Industries
Página: Publications
En la Figura 5.9 vemos el diseño de la página Publications. Para esta página creamos las
estructuras y algoritmos para que la información se muestre automáticamente como en la página
Products y también preparamos los mecanismos para que el usuario pueda hacer uso de pestañas
y acordeones en otras partes de la web.
Implementamos dos shortcodes que permiten crear pestañas y acordeones del aspecto del
diseño desde el panel de edición de WordPress. De esta manera, utilizando la siguiente expresión
de shortcodes podemos obtener unas pestañas como el del diseño:
[ tabgroup ]
[ tab title = ‘ ‘ Tungaloy Reports ’ ’] Tab 1 content goes here . [/ tab ]
[ tab title = ‘ ‘ Brochures ’ ’] Tab 2 content goes here . [/ tab ]
[/ tabgroup ]
47
Figura 5.7: Implementación conceptual de la página Products
48
Figura 5.8: Implementación conceptual de la página Worldwide Network
49
Figura 5.9: Implementación conceptual de la página Publications
Para añadir el acordeón dentro de la primera pestaña como se muestra en la Figura 5.9
tendrı́amos que incluir los shortcodes necesarios donde pone Tab 1 content goes here. Utilizando
la siguiente expresión de shortcodes podemos obtener un acordeón como las del diseño:
[ acordeongroup ]
[ acordeon title = ‘ ‘ MillLine ’ ’] Acordeon 1 content goes here . [/ acordeon ]
[ acordeon title = ‘ ‘ TurnLine ’ ’] Acordeon 2 content goes here . [/ acordeon ]
[ acordeon title = ‘ ‘ DrillLine ’ ’] Acordeon 3 content goes here . [/ acordeon ]
[ acordeon title = ‘ ‘ ToolLine ’ ’] Acordeon 4 content goes here . [/ acordeon ]
[/ acordeongroup ]
Ya hemos visto los dos shortcodes que hemos creado para usos futuros del usuario en otras
páginas. Veamos cómo hemos implementado esta página.
Como podemos observar en la Figura 5.9 esta página está destinada a mostrar publicaciones.
Para almacenarlas y gestionarlas creamos un custom post type publications con taxonomı́as
abiertas. La implementación es muy parecida a la de la página Products. Las taxonomı́as que
se creen serán indexables desde el panel de administración, para mostrarlas, las de primer nivel
se mostrarán como pestañas, las de segundo nivel como acordeones y las de tercer nivel como
tı́tulos dentro del acordeón.
50
Figura 5.10: Implementación conceptual de la página Contact
Página: Contact
La última página aparece en la Figura 5.10. Se trata de un formulario de contacto que debe
enviar el mensaje a distintos destinatarios dependiendo de la destinación y del paı́s que se escoja.
Para la implementación de este formulario utilizamos el plugin Contact Form 7 [29]. Este plugin
nos permite administrar múltiples formularios de contacto personalizando su aspecto y conte-
nido, permite modificar los mensajes dándoles determinada estructura, programar respuestas
automáticas, captchas, filtrado de spam, etc.
Por último mencionamos algunos recursos que hemos utilizado para el sitio web completo,
sin ser especı́ficos de ninguna página.
Utilizamos los post type por defecto Adjuntos para almacenar imágenes y PDFs. Y el post type
Revisiones y para mantener borradores de cualquier post type (páginas, entradas, publicaciones,
etc.).
También creamos algunos shortcodes de edición general para la creación de columnas dentro
de una página y la incrustación de vı́deos.
51
Antispam Bee[27]: un plugin antispam que detecta y elimina los comentarios spam.
WPML[23]: un plugin para la traducción de sitios web WordPress, nos facilita la creación
de páginas hermanas en diferentes idiomas.
Regenerate Thumbnails[2]: permite regenerar las miniaturas de todas las imágenes al-
macenadas, muy útil cuando por ejemplo modificamos el tamaño por defecto para las
miniaturas o cambiamos de tema.
5.3. Pruebas
Pruebas de compatibilidad.
Existen otro tipo de pruebas que podrı́amos pensar necesarias como pruebas de seguridad,
de estrés, de desempeño, de volumen, etc. sin embargo estás serı́an pruebas más para verificar
el funcionamiento de WordPress que para verificar nuestro sitio web. Este tipo de pruebas ya
han sido realizadas por el equipo de desarrollo de WordPress.
Para verificar la interacción del usuario con el sistema realizamos pruebas de GUI y na-
vegación. El objetivo es asegurar que la interfaz en la parte front-end cumple los requisitos
del diseño y que la navegación entre páginas funciona correctamente. También verificamos que
toda la web sea responsive y se adapte a cualquier tamaño. Estas pruebas consisten en verificar
página a página todo el sistema. Las repetimos distintas personas para que no se nos escape
ningún detalle.
Para comprobar y testear la funcionalidad del sistema realizamos tests de aceptación. Es-
tas pruebas corresponden a las historias de usuario explicadas en el punto 4.2.2. Historias de
52
usuario. Al añadir nueva funcionalidad al sistema repasamos con el usuario estos tests de acep-
tación para comprobar que todo funciona correctamente y que el cliente está conforme con el
funcionamiento del sistema.
Id Historia de usuario
HU1 Como administrador necesito añadir y eliminar enlaces del header.
HU2 Como administrador necesito añadir, modificar y eliminar elementos del footer.
HU3 Como administrador necesito crear, modificar y eliminar páginas.
HU4 Como administrador necesito crear pestañas.
HU5 Como administrador necesito crear acordeones.
1. Añadir enlace: al añadir un enlace, cuando no existe un enlace igual el sistema, el sistema
añade el enlace y podemos verlo en el menú.
3. Añadir muchos enlaces: al añadir un enlace, cuando ya hay muchos enlaces y no caben
más en la pantalla de la web, el sistema añade el enlace y lo muestra en una segunda lı́nea
del menú.
1. Añadir enlace: al añadir un enlace al menú del footer, cuando no existe un enlace igual
el sistema, el sistema añade el enlace y podemos verlo en el menú.
2. Añadir enlace repetido: al añadir un enlace al menú del footer, cuando ya existe un
enlace igual en el sistema, el sistema añade el enlace y podemos verlo en el menú.
3. Eliminar enlace: al eliminar un enlace del menú del footer, el sistema elimina el enlace
y ya no podemos verlo en el menú.
4. Eliminar todos los enlaces: al eliminar un enlace del menú del footer, cuando es el
único enlace en el sistema, el sistema elimina el enlace y se muestra el menú vacı́o.
53
5. Añadir elemento: al añadir un elemento en la parte derecha del footer, cuando no existe
un elemento igual en el sistema, el sistema añade el elemento y podemos verlo en el footer.
6. Añadir elemento repetido: al añadir un elemento en la parte derecha del footer, cuando
ya existe un elemento igual en el sistema, el sistema añade el elemento y podemos verlo
en el footer.
8. Eliminar todos los elementos: al eliminar un elemento de la parte dereecha del footer,
cuando es el único elemento en el sistema, el sistema elimina el elemento y la zona se
muestra vacı́a.
1. Añadir pestaña: al añadir una pestaña a una página, cuando todavı́a no existe ninguna
pestaña en el sistema, el sistema muestra una única pestaña en la que el usuario no puede
hacer clic.
2. Añadir dos pestañas: al añadir una pestaña, cuando ya existe otra pestaña en el sistema,
el sistema muestra dos pestañas en las que el usuario puede hacer clic.
3. Añadir muchas pestañas: al añadir una pestaña, cuando ya existen muchas pestañas
en el sistema y no caben en la pantalla de la web, el sistema muestra la pestaña en una
segunda linea de pestañas.
4. Hacer clic sobre pestaña: al hacer clic sobre una pestaña, cuando se está mostrando
el contenido de otra pestaña, el sistema cambia el contenido mostrado.
1. Añadir acordeón: al añadir un acordeón a una página, cuando todavı́a no existe ningún
acordeón en el sistema, el sistema muestra un único acordeón que se despliega y encoge
cuando el usuario hace clic sobre él.
54
3. Hacer clic sobre acordeón: al hacer clic sobre un acordeón, cuando otro acordeón está
abierto, el sistema despliega el acordeón y encoge el resto de acordeones.
Para verificar la compatibilidad con todos los navegadores web realizamos pruebas de com-
patibilidad, tanto de PC como móviles, probamos el sistema con distintos navegadores para
detectar posibles pequeñas diferencias de visualización o comportamiento. Realizamos prue-
bas con Chrome, Firefox e Internet Explorer para Windows y para Mac. También realizamos
pruebas desde navegadores de dispositivos móviles.
5.4. Documentación
Por último, esta memoria queda a disposición de la empresa a modo de documentación del
proyecto.
55
56
Capı́tulo 6
Resultados y conclusiones
En este capı́tulo presentamos los resultados y conclusiones finales del proyecto: qué hemos
conseguido, qué ha ido como esperábamos, qué no ha ido como esperábamos, qué hemos hecho
mal, qué podrı́amos haber hecho mejor, etc.
La planificación temporal frente al resultado final no ha estado del todo ajustada. Planifica-
mos en base a una estimación del esfuerzo necesario para cada tarea con horas de trabajo como
métrica. Después del desarrollo del proyecto hemos observado que estimamos más tiempo del
que realmente luego necesitamos para la mayorı́a de las tareas. Como probable causa de este
desajuste señalamos el desconocimiento inicial de las tecnologı́as y la inexperiencia.
57
Figura 6.1: Planificación temporal inicial vs. Desarrollo temporal real
Por otro lado, no incluimos en la planificación una fase necesaria antes de la puesta en
marcha: la introducción de datos en el sistema. No es una tarea que forme parte del desarrollo
de un sistema web, pues ésta se realiza cuando el sistema ya está acabado, pero sı́ que es una
tarea que se ha de realizar antes de la puesta en marcha. Se pactó con el cliente que la tarea
estarı́a incluida dentro del proyecto y por tanto, una vez terminado el sistema y antes de ponerlo
en marcha, habı́a que introducir en el sistema todos los datos que nos proporcionase el cliente. El
tiempo necesario para llevar a cabo esta tarea tendrı́a que haber sido incluido en la planificación.
Aún ası́, cabe destacar que esta es una tarea de muy difı́cil estimación ya que existe una enorme
dependencia con el cliente: llegados a esta fase, hasta que el cliente no proporcione toda la
información a introducir el proyecto queda estancado. Por este mismo motivo no conseguimos
llegar a la puesta en marcha del sistema desarrollado.
Por último, añadir que las trescientas horas de proyecto las terminamos el 12 de agosto en
lugar del 4 de agosto como habı́amos estimado. Este dato no tiene mayor relevancia ya que para
la estimación supusimos jornadas de 8 horas ya sabiendo que podrı́an ser variables según las
necesidades de la empresa de acogida. Hubo dı́as con jornadas más cortas y como consecuencia
acabamos las trescientas horas unos dı́as más tarde de lo estimado inicialmente.
58
6.2. Conclusiones
El objetivo principal de este proyecto era el de crear un sito web autogestionable, adaptable
a todos los dispositivos, con gestión de idiomas sencilla y siguiendo el diseño proporcionado por
el cliente. Una vez terminado el desarrollo del sistema podemos afirmar que hemos conseguido
el objetivo. Repasando los requisitos y objetivos concretos que establecimos hemos logrado la
consecución de todos ellos.
Todo el contenido puede ser modificado desde un panel de control sin necesidad de co-
nocimientos de programación o HTML, hemos llegado a este objetivo haciendo uso del
panel de administración de WordPress desde el cual podemos modificar la mayorı́a de los
elementos de la web.
El sitio web permite una gestión de idiomas sencilla, cada página tiene páginas hermanas
de los diferentes idiomas. Para conseguir esta funcionalidad multiidioma hemos hecho uso
de un plugin de WordPress.
La web que hemos obtenido tras el desarrollo tiene la apariencia exacta del diseño que
proporcionó el cliente. Mediante HTML, CSS y Bootstrap hemos replicado el diseño.
Hemos conseguido crear un sitio web al gusto del cliente y añadirle el panel de administración
de WordPress para hacer posible su modificación. La utilización de WordPress también nos ha
permitido beneficiarnos de la seguridad, fiabilidad y escalabilidad que este gestor de contenidos
nos proporciona.
Como trabajo futuro para la empresa queda la introducción de los datos restantes del cliente
y la puesta en marcha del sistema web. Llegados a ese punto la empresa cliente podrá empezar
a beneficiarse de la mejora de imagen y presencia en Internet.
59
60
Glosario
APC Es una librerı́a que implementa una caché alternativa para PHP. [32], pág. 30.
captcha Es una prueba automática para diferenciar computadoras de humanos, pág. 51.
CSS3 Es el último estándar de CSS, también conocida como hoja de estilo en cascada,
es un lenguaje usado para definir la presentación de un documento estructurado en
HTML o XML. [38], pág. 21.
61
F
framework Es una estructura conceptual y tecnológica de soporte definido. Puede incluir so-
porte de programas o bibliotecas entre otras herramientas, su finalidad es ayudar a
desarrollar y unir los diferentes componentes de un proyecto, pág. 21.
Git Es un sistema de control de versiones distribuido que permite mantener una gran
cantidad de código caracterizándose por su eficiencia, realiza el control de versiones
en repositorios locales. [12], pág. 23.
Google Analytics Es un servicio gratuito de estadı́sticas de sitios web del buscador de Google,
pág. 20.
Google Webmaster Es un servicio de Google que permite a los creadores de páginas web com-
probar el estado de la indexación de sus sitios en internet y optimizar su visibilidad,
pág. 20.
hosting Web hosting (en español alojamiento web) es el servicio que provee a los usuarios de
Internet un sistema para poder almacenar información, imágenes, vı́deo, o cualquier
contenido accesible vı́a web, pág. 20.
HTML5 Es la quinta revisión del conocido lenguaje de etiquetas HTML (HyperText Markup
Language), el lenguaje básico de la World Wide Web. [40], pág. 21.
JavaScript Es un lenguaje interpretado integrado en las páginas webs y ejecutado por los
navegadores modernos. [14], pág. 23.
JQuery Es una biblioteca JavaScript que permite simplificar la manera de interactuar con los
documentos HTML, nos facilita la manipulación del árbol DOM, manejar eventos,
etc. citebib:jquery, pág. 23.
62
L
licencia GPL La Licencia Pública General garantiza a los usuarios finales la libertad de usar,
estudiar, compartir y modificar software, pág. 38.
MailChimp Herramienta para WordPress que permite incorporar al sitio web un formulario
de suscripción y la gestión de suscripciones [34], pág. 19.
mockup Es un modelo o diseño que se utiliza para mostrar el aspecto que tendrá un sistema,
pág. 15.
newsletter Publicación digital más bien informativa que se distribuye a través del correo
electrónico con cierta periodicidad, pág. 19.
PHP Es un lenguaje de programación del lado del servidor, es el lenguaje utilizado para
programar WordPress. [33], pág. 23.
Piwik Es una aplicación gratuita y de código abierto que genera estadı́sticas de sitios web,
pág. 20.
plugin También conocido como complemento, es una aplicación que se relaciona con otra
para aportarle una función nueva y generalmente muy especı́fica, pág. 39.
Portable Object files Son archivos de texto plano que contienen traducciones. Cada idioma
ha de tener su propio archivo PO en el que se traduzca cada expresión al idioma
del archivo. [51], pág. 72.
Prepros Es una herramienta para el desarrollo web, entre sus funciones encontramos la com-
pilación de código de LESS a CSS y la concatenación de ficheros JavaScript en
tiempo real. [28], pág. 23.
63
R
Redirección 301 Es un código de respuesta HTTP para indicar una redirección. Indica que la
petición actual y todas las futuras deberán ser dirigidas a una dirección dada. Un
uso correcto de la redirección 301 influye favorablemente en el posicionamiento de
la web. [3], pág. 20.
responsive El término hace referencia a un diseño web adaptativo o adaptable, cuyo objetivo
es adaptar la apariencia de las páginas web al dispositivo que se esté utilizando para
visualizarla, pág. 15.
shortcode Es un pequeño código que podemos utilizar desde el editor de WordPress para
preprogramar funciones. [49], pág. 40.
slug Hace referencia a un tı́tulo en el que se han sustituido los espacios en blanco por
guiones y se han eliminado todos los caracteres que no sean letras o números. En
Wordpress no puede haber dos slugs iguales y se utilizan a modo de referencias,
pág. 72.
taxonomı́a Es una categorı́a o etiqueta que se le da a una instancia de post type. [50], pág. 40.
widget Es un pequeñı́simo programa que nos da acceso a funciones que usamos normal-
mente. [53], pág. 41.
wysiwyg Es el acrónimo de What You See Is What You Get (en español, “lo que ves es lo
que obtienes”). Se aplica a los procesadores de texto y otros editores de texto con
formato (como los editores de HTML) que permiten escribir un documento viendo
directamente el resultado final, pág. 72.
64
X
XML Sitemaps Google Sitemaps es una herramienta de Google que permite una mejor búsque-
da y posicionamiento en su buscador. El sitemap no es más que un archivo con un
listado de páginas e información sobre su contenido, actualizaciones, etc. el archi-
vo puede tener varios formatos pero el más utilizado en la actualidad es el XML,
pág. 20.
65
66
Bibliografı́a
[15] Jonathan Sampson. Unexpected results while styling wordpress menus. http://
sampsonblog.com/tag/menu_class. [Consulta: 24 de Octubre de 2014].
67
[16] Joost de Valk. Wordpress seo by yoast. https://wordpress.org/plugins/
wordpress-seo/. [Consulta: 30 de Octubre de 2014].
[18] Juan Palacio. Mejorando las estimaciones basadas en juicio de expertos. http://www.
navegapolis.net/content/view/347/99/. [Consulta: 30 de Octubre de 2014].
[19] Justin Sternberg. Custom metaboxes and fields for wordpress. https://github.com/
WebDevStudios/Custom-Metaboxes-and-Fields-for-WordPress/wiki/Basic-Usage.
[Consulta: 24 de Octubre de 2014].
68
[35] Toni Santo-Regis. Latex. http://www.latex-project.org/. [Consulta: 24 de Octubre de
2014].
69
[54] WordPress StackExange. Wordpress nav menu’s items wrap ar-
gument. http://wordpress.stackexchange.com/questions/19245/
any-docs-for-wp-nav-menus-items-wrap-argument. [Consulta: 24 de Octubre de
2014].
70
Anexo A
En este anexo vemos ejemplos de cómo crear: custom post types, shortcodes y menús. Utili-
zamos HTML, CSS y PHP, el lenguaje usado para programar WordPress.
Para explicar la creación de customs posts types vamos ver dos ejemplos en los que mostra-
remos paso a paso cómo hemos creado el post type Events, uno de los más simples, y el post type
Product, uno de los más complejos.
Para crear un custom post type tenemos que llamar al método register post type() y pasarle
como argumentos el nombre del nuevo post type y un vector con los atributos que ha de tener.
El código de la Figura A.1 crea un nuevo post type llamado Events identificado como
cw events. Primero se crea una función encargada de la creación del post type y luego (en
la lı́nea 14) se indica que esta sea llamada junto a otros procesos de inicialización, justo después
de que WordPress termine de cargar[26].
1 function cw_events_init () {
2 $args = array (
3 ’ public ’ = > true ,
4 ’ label ’ = > __ ( ’ Events ’ , ’ culturaweb ’) ,
5 ’ hierarchical ’ = > true ,
6 ’ supports ’ = > array (
7 ’ title ’
8 ),
9 ’ rewrite ’ = > array ( ’ slug ’ = > ’ event ’) ,
10 );
11 register_post_type ( ’ cw_events ’ , $args ) ;
71
12 f l us h _ re w r it e _ ru l e s () ; // Check out
13 }
14 add_action ( ’ init ’ , ’ cw_events_init ’) ;\ label { fig : eje }
1. El primer elemento del vector, public true, indica que el nuevo post type esté disponible
desde el panel de administración de WordPress.
2. El segundo elemento, label, indica el nombre que se mostrará en el panel de administración
para el post type. Para que se muestre diferente dependiendo del idioma hemos utilizado
la función de traducción (texto, dominio) que devolverá el texto que hayamos indicado
como traducción dentro de un determinado dominio. Las traducciones a cada texto han
de ser indicadas en Portable Object files.
3. En la lı́nea 5 se indica que se permitirán jerarquı́as entre eventos, de manera que un evento
pueda tener eventos hijos.
4. En el cuarto elemento, el array supports indica qué caracterı́sticas habilitar para la edición
del post type. Por ejemplo: title hace que tengamos disponible una caja de texto para editar
nuestros atributos, aquı́ no se asigna ningún método de edición, simplemente se dice que
cualquiera de sus atributos podrá usar los métodos de edición que aquı́ se incluyan.
5. Por último, rewrite permite modificar algunos parámetros[48], en este caso indicamos que
el slug para el post type sea event en lugar del de por defecto.
Al final de la función, en la lı́nea 11, llamamos a la función flush rewrite rules para forzar
el refresco de las reglas de enlaces permanentes. Estas reglas permiten que podamos hacer
referencia a post types y otros elementos. Al forzar el refresco conseguimos que el nuevo post
type aparezca en estas reglas y ası́ podamos hacer referencia a él en otras partes de nuestro
código.
Una vez creado el custom post type tenemos que indicar cómo queremos que este pueda ser
editado, es decir, si queremos que nos permita editar determinado atributo con una caja de texto,
con una caja para edición de fechas, números, con una caja con funciones de edición avanzadas,
etc. Para ello tendremos que crear metaboxes personalizados. Un metabox nos permite añadir
campos extra a la página de edición. En la Figura A.2 podemos ver un metabox de ejemplo, en
el ejemplo se permite la edición de un tı́tulo mediante una caja de texto simple y la edición del
cuerpo mediante una caja de edición con funciones avanzadas del tipo wysiwyg.
En la Figura A.3 encontramos el código que añade las cajas de edición que necesitamos para
la edición de nuestro nuevo post type events[19].
72
Figura A.2: Ejemplo de metabox.
73
22 ’ type ’ = > ’ text_medium ’ ,
23 ),
24 array (
25 ’ name ’ = > __ ( ’ Event Stand ’ , ’ culturaweb ’
),
26 ’ desc ’ = > __ ( ’ ’ , ’ culturaweb ’) ,
27 ’ id ’ = > $prefix . ’ cw_event_stand ’ ,
28 ’ type ’ = > ’ text_medium ’ ,
29 ),
30 array (
31 ’ name ’ => __ ( ’ Event URL ’ , ’ culturaweb ’) ,
32 ’ desc ’ => __ ( ’ ’ , ’ culturaweb ’) ,
33 ’ id ’ => $prefix . ’ cw_event_url ’ ,
34 ’ type ’ => ’ text_url ’ ,
35 ),
36 ),
37 );
38 return $meta_boxes ;
39 }
40 add_filter ( ’ cmb_meta_boxes ’ , ’ cw_event_metaboxes ’) ;
Figura A.3: Código para añadir metaboxes al custom post type events
Como vemos en la lı́nea 1 (Figura A.3) en esta función también se sigue con la convención
de la empresa para la definición de nombres de funciones. Más adelante, en la lı́nea 3 definimos
un prefijo que se añade al identificador de todos los campos del metabox que creemos para este
post type. En la lı́nea 4 empezamos a crear un vector con la información del metabox y a partir
de la lı́nea 11 definimos todos los campos de edición de nuestro metabox. Para cada campo se
establece:
1. El nombre del campo, mediante el parámetro name y utilizando una función de traducción
para darle el nombre deseado según el idioma.
2. La descripción del campo que se muestra al usuario como ayuda.
3. Un id para utilizarlo nosotros dentro del código y hacer referencia al campo del metabox.
4. Y por último, el tipo de edición para el campo (caja de texto simple, caja wysiwyg, etc.).
En este caso hemos utilizado para todos los campos cajas de texto de tamaño mediano es-
pecificando el tipo text medium y una caja del tipo text url que automáticamente muestra
su contenido con un enlace y comprueba que el texto introducido tenga forma de URL[42].
Finalmente, en la lı́nea 40, añadimos la función que hemos creado para personalizar el
metabox del custom post type events al vector de metaboxes de WordPress [19].
Podemos utilizar shortcodes para fines muy variados, por este motivo, en los siguientes
puntos hemos explicado la creación de tres shortcodes diferentes, uno muy simple y dos algo
74
más complejos.
Sin este shortcode no podrı́amos añadir un tı́tulo como el de la Figura A.4 a nuestro sitio
a no ser que utilizásemos una herramienta externa, pasásemos el tı́tulo a imagen y entonces lo
añadiésemos al editor. Este shortcode facilita la tarea al usuario y permite conseguir tı́tulos con
este formato simplemente mediante la introducción de texto.
Veamos cómo hemos creado el shortcode. El código HTML necesario para el resultado de la
Figura A.4 es el siguiente:
Aunque no es relevante para la creación del shortcode, las clases CSS que se utilizan en el
código anterior se definen a continuación en la Figura A.6.
75
8 margin - top : 60 px ;
9 text - align : center ;
10 text - transform : uppercase ;
11
12 . line - big - red {
13 background : @corporate - red ;
14 bottom : 10 px ;
15 height : 1 px ;
16 left : 10 %;
17 position : absolute ;
18 width : 80 %;
19 z - index : 5;
20 }
21
22 . text - big - red {
23 background : white ;
24 color : @corporate - red ;
25 display : inline - block ;
26 font - family : @font - subtitle ;
27 font - size : 55 px ;
28 font - weight : 400;
29 letter - spacing : -1 px ;
30 padding : 0 10 px ;
31 position : relative ;
32 text - transform : capitalize ;
33 z - index : 10;
34
35 &: before { content : " \201 C " ; }
36 &: after { content : " \201 D " ; }
37 }
38
39 @media ( max - width : @screen - sm ) {
40 font - size : 50 px ;
41 . text - big - red { font - size : 35 px ; }
42 }
43 }
Una vez visto el código que necesitamos para crear el tı́tulo que queremos hacer disponible
mediante shortcodes, veamos cómo implementar el shortcode teaser.
76
Figura A.7: Código PHP para crear el shortcode teaser
El siguiente shortcode que vamos a implementar muestra las tres últimas entradas del post
type por defecto: entrada, o post en inglés. Para ello hacemos una consulta a la base de datos
de WordPress y mostramos la información con el aspecto de la Figura A.8.
El objetivo de crear este shortcode es que el usuario pueda colocar en cualquier lugar del sitio
web un cuadro de noticias como el de la Figura A.8, sin un shortcode serı́a imposible hacerlo,
en cambio permitimos al usuario esta tarea de modo que pueda lograrlo introduciendo el código
que se muestra a continuación en el editor de WordPress.
[ whatsnew ]
El código HTML necesario para mostrar un cuadro com el de la Figura A.8 es el siguiente:
77
6 </ div >
7 < div class = " col - lg -6 col - md -6 col - sm -12 " >
8 < ul class = " list - unstyled " >
9 < li > <p > < time class = " box " datetime = " 2001 -05 -15 19:00 " > May 15 </ time
>
10 Titulo entrada </ p > </ li >
11 < li > <p > < time class = " box " datetime = " 2001 -05 -15 19:00 " > May 15 </ time
>
12 Titulo entrada 2 </ p > </ li >
13 < li > <p > < time class = " box " datetime = " 2001 -05 -15 19:00 " > May 15 </ time
>
14 Titulo entrada 3 </ p > </ li >
15 </ ul >
16 </ div >
17 </ div >
18 < div class = " bar - grey " > <a href = " # " > more </ a > </ div >
En esta ocasión omitiremos las clases CSS que se utilizan en el HTML de la Figura A.9 ya
que no son relevantes para la creación del shortcode y lo importante de este no es su resultado
visual, sino la consulta que se realiza a la base de datos.
78
25 < div class =" col - lg -6 col - md -6 col - sm -12" >
26 < ul class =" list - unstyled " > ’ . implode ( " \ n " , $news )
. ’ </ ul >
27 </ div >
28 </ div >
29 < div class =" bar - grey " > < a href ="#" > ’. __ ( ’ more ’ , ’
culturaweb ’) . ’ </a > </ div > </ br > ’;
30 }
31 add_shortcode ( ’ whats_new ’ , ’ cu l t u r a w e b _ w h a t s _ n e w ’) ;
Figura A.11: Bucle para leer datos de una consulta a la BDD de WordPress
Volvamos a la Figura A.10. Dentro del bucle de lectura de la consulta, en la lı́nea 11, vemos
el tratamiento que le hemos dado a cada fila de la consulta. Para cada fila hemos añadido una
fila al vector news con el código HTML necesario para mostrar la información de la fila. Para
generar el HTML con los valores de cada fila hemos utilizado funciones[47] de WordPress (como
get the date(), get the title(), etc.) que nos permiten acceder a los campos del post type o de la
fila. Por último, en la lı́nea 15 empieza el return de la función con todo el código estático a cada
ejecución y con la función implode en la lı́nea 26 que añade el contenido que hayamos añadido
al vector news con la información dependiente de la base de datos, es decir, con la información
obtenida de la consulta. En la lı́nea 19, 21 y 29 se utiliza una función que ya hemos nombrado
con anterioridad, función encargada de la traducción de pequeñas cadenas. Por último, al igual
que en el shortcode anterior, en la última lı́nea se añade el shortcode a WordPress.
El último shortcode que vamos a programar permite al usuario crear pestañas, un elemento
de la interfaz gráfica que permiten cambiar rápidamente lo que se está viendo sin cambiar de
79
ventana. Las pestañas tendrán el aspecto que se muestra en la Figura A.12.
Para que el usuario pueda crear tantas pestañas como quiera necesitaremos un shortcode
compuesto. El código a escribir en el editor de WordPress para obtener unas pestañas como las
de la Figura A.12 es el siguiente:
[ tabgroup ]
[ tab title = ‘ ‘ Tab 1 ’ ’] Tab 1 content goes here . [/ tab ]
[ tab title = ‘ ‘ Tab 2 ’ ’] Tab 2 content goes here . [/ tab ]
[ tab title = ‘ ‘ Tab 3 ’ ’] Tab 3 content goes here . [/ tab ]
[/ tabgroup ]
El código HTML necesario para implementar las pestañas se muestra en la Figura A.13.
Las clases CSS que se utilizan son clases de Bootstrap que, junto a sus librerı́as JavaScript,
nos ofrecen la funcionalidad de cambiar de contenidos al clicar cada pestaña, nosotros hemos
modificado estas clases para adaptar su visualización a nuestro diseño.
El cambio de contenidos se realiza a partir de los ids del contenido y la referencia de las pestañas,
en las lı́neas 2 y 7 vemos un ejemplo. Al crear el shortcode hemos de prestar especial atención
a los ids, ya que no pueden existir dos elementos HTML con el mismo id. Si queremos que el
shortcode permita la creación de más de un conjunto de pestañas que funcionen correctamente
tendremos que asignar ids diferentes para cada ejecución del shortcode.
1 < ul class = " nav nav - tabs " role = " tablist " data - tabs = " tabs " >
2 < li class = " active " > <a href = " # tab1 " data - toggle = " tab " > Tab 1 </ a > </ li >
3 < li class = " " > <a href = " # tab2 " data - toggle = " tab " > Tab 2 </ a > </ li >
4 < li class = " " > <a href = " # tab3 " data - toggle = " tab " > Tab 3 </ a > </ li >
5 </ ul >
6 < div class = " tab - content " >
7 < div class = " tab - pane active " id = " tab1 " > Tab 1 content goes here . </ div >
8 < div class = " tab - pane " id = " tab2 " > Tab 2 content goes here . </ div >
9 < div class = " tab - pane " id = " tab3 " > Tab 3 content goes here . </ div >
10 </ div >
Para programar nuestro shortcode compuesto necesitamos crear dos shortcodes que trabajen
80
juntos. Veamos como quedan las funciones que implementan estos dos shortcodes:
4 $randomid = rand () ;
5 $GLOBALS [ ’ tab_count ’] = ( isset ( $GLOBALS [ ’ tab_count ’ ]) )
6 ? $GLOBALS [ ’ tab_count ’] + 1
7 : 0;
8
9 do_shortcode ( $content ) ;
10
11 if ( is_array ( $GLOBALS [ ’ tabs ’ ]) ) {
12 $i = 0;
13 foreach ( $GLOBALS [ ’ tabs ’] as $tab ) {
14 $active = ( reset ( $GLOBALS [ ’ tabs ’ ]) == $tab ) ? ’
active ’ : ’ ’;
15
16 $tabs [] = ’ < li class =" ’ . $active . ’" > < a href
="# tab ’ . $randomid . $i . ’" data - toggle =" tab
" > ’ . $tab [ ’ title ’] . ’ </a > </ li > ’;
17 $panes [] = ’ < div class =" tab - pane ’ . $active .
’" id =" tab ’ . $randomid . $i . ’" > ’ . $tab [ ’
content ’] . ’ </ div > ’;
18
19 $i ++;
20 }
21
22 $return = ’
23 < ul class =" nav nav - tabs " role =" tablist " data -
tabs =" tabs " >
24 ’ . implode ( " \ n " , $tabs ) . ’
25 </ ul >
26 < div class =" tab - content " >
27 ’ . implode ( " \ n " , $panes ) . ’
28 </ div >
29 ’;
30 }
31 return $return ;
32 }
33 add_shortcode ( ’ tabgroup ’ , ’ cul tu r a we b _ ta b g ro u p ’) ;
81
11 add_shortcode ( ’ tab ’ , ’ culturaweb_tab ’) ;
Veamos primero el shortcode más corto: tab. En la definición del método de la Figura A.15
(lı́nea 1) encontramos la primera diferencia respecto a los shortcodes que hemos visto anterior-
mente. En la cabecera no definimos solamente el parámetro atts para los atributos que nos pasen
con el shortcode, también se define el parámetro content, este parámetro indica que el shortcode
tendrá código de cierre y que la información contenida entre el código de apertura y el código
de cierre será pasada al método a través de esta variable. En la segunda lı́nea del método, como
en los shortcodes anteriores, definimos los campos que se le podrán pasar como argumentos.
Este shortcode será siempre utilizado en conjunto al shortcode tabgroup, ambos comparten varia-
bles utilizando las variables globales de PHP que podemos almacenar en el vector GLOBALS.
En la lı́nea 3 extraemos de la variable global tab count el número de pestaña para la que se esta
ejecutando este shortcode interno. A continuación, en la lı́nea 4, creamos una variable global
para la pestaña donde almacenamos su contenido para que el otro shortcode (tabgroup) pueda
extraerlo y utilizarlo. Después incrementamos la variable global tab count para que este lista con
el valor de la posible próxima pestaña, y en la última lı́nea añadimos el shortcode a WordPress.
Fijémonos en la lı́nea 6, utilizamos la función do shortcode() sobre la variable con el contenido,
el objetivo de esto es permitir que dentro del contenido que se muestra en cada pestaña también
se puedan utilizar otros shortcodes.
82
A.3. Creación de menús personalizados
En este punto vamos a ver un ejemplo de cómo crear menús personalizables para nuestra
plantilla, de modo que los usuarios puedan añadir y eliminar los elementos que quieran.
En nuestro ejemplo queremos crear el menú de la Figura A.16. En este menú el usuario tiene
que poder modificar los elementos de la barra gris: añadir y eliminar elementos.
El código HTML simplificado para obtener el menú se muestra en la Figura A.17, a este
código le faltarı́an algunas clases y etiquetas más para lograr el aspecto de la Figura A.16 pero
vamos a obviarlas por simplicidad.
Cómo ya podremos imaginar necesitamos un código PHP que añada o elimine elementos
<li> al código HTML de la Figura A.17. WordPress ofrece funcionalidad para esto. En su
panel de administración (Figura A.18) hay un apartado para la gestión de menús, sólo hemos
de crear el menú desde el asistente gráfico, desde donde el usuario podrá añadir y eliminar
elementos, y escribir el código PHP que imprima en código HTLM todos los elementos del
menú. Para imprimir los elementos <li> de un menú WrodPress nos proporciona la función
wp nav menu.
En la Figura A.19 vemos cómo hemos utilizado esta función para leer nuestro menú de la base
de datos de WordPress. En la lı́nea 4 llamamos al método encargado de la extracción de datos
de menús creados a través de la interfaz gráfica, veamos el significado de cada argumento[52]:
En la lı́nea 4, al parámetro menu le pasamos el id, slug o nombre (se buscará el menú en
este orden) del menú deseado.
El parámetro container nos permite añadir una etiqueta externa al <il>, en este caso no
añadimos ninguna.
83
Figura A.18: Panel de administración
Lı́nea 8, items wrap para indicar qué argumentos o elementos se deben imprimir en
HTML[54], en este indicamos que sólo se imprimirá el contenido de los <il>.
84
menú.
85
86
Anexo B
Estructura de ficheros
En este anexo mostramos la estructura de ficheros del proyecto. Para simplificar partimos
de capturas de la estructura de ficheros de la plantilla vacı́a que tomamos como base para
desarrollar el proyecto. Esto nos será útil como documentación, para documentar dónde se
encuentra cada fichero y qué contiene, y para diferenciar el trabajo previo de las aportaciones
propias.
En la Figura B.1 encontramos el árbol de archivos del tema del proyecto, primero explicamos
el contenido de cada fichero, después pasamos al contenido de las carpetas.
404.php: página de error HTTP 404 o página no encontrada, contiene el HTML que se
mostrará como página de error cada vez que no se encuentre un contenido. En nuestra
plantilla contiene un mensaje de error simple y sin formato.
archive.php: este documento es la plantilla que muestra el archivo de la web y que lista
todos los posts. En nuestra plantilla el fichero consulta todos los posts de la base de datos
y los muestra en formato plano.
category.php: muestra todos los posts de una categorı́a. El fichero de nuestra plantilla
muestra todos los posts de una categorı́a dada en formato plano.
footer.php: pie común del tema, se muestra al final de todas las páginas, en este fichero se
cierra el código HTML. En el fichero de nuestra plantilla únicamente contiene las etiquetas
de cerrar el HTML.
header.php: es la cabecera común a todas las páginas del tema, el contenido de este fichero
se muestra en todas las páginas, también contiene las etiquetas que dan información a la
87
web, el enlace a la hoja de estilos, la apertura del body, etc. En la plantilla contiene
importaciones, dependencias y un menú simple que se muestra a modo de lista.
index.php: este archivo es el que WordPress asignará como página inicial. En nuestra
plantilla contiene un tı́tulo y una llamada al archivo loop.php que mostrará los últimos
posts, todo en formato plano.
page.php: contiene lo necesario para mostrar una página completa, hace llamadas a los
ficheros header.php, sidebar.php, footer.php, etc. En nuestra plantilla se hacen todas las
importaciones tı́picas de otros ficheros.
search.php: con esta plantilla se muestran los resultados de las búsquedas realizadas. En
nuestra plantilla encontramos código que muestra los resultados de una consulta en la
base de datos en formato plano.
sidebar.php: contiene una barra lateral para la web donde se suelen cargar widgets, enlaces
de interés o cualquier cosa que el usuario quiera añadir. En nuestra plantilla el fichero
contiene una barra lateral compuesta por la importación de dos widgets que habrı́a que
configurar desde el panel de administración de WordPress.
single.php: este archivo se utiliza para mostrar los posts individualmente, es el que se
abrirı́a cuando desde un listado de posts hiciéramos clic sobre leer más. En la plantilla
contiene código para mostrar el tı́tulo de un post, la fecha, el contenido y sus categorı́as,
todo se muestra en un formato plano de texto.
style.css: contiene los estilos del tema, determina el aspecto del tema. En la plantilla
encontramos este arvhivo vacı́o.
tag.php: fichero para mostrar el archivo de etiquetas (taxonomı́as) para posts. En nuestro
fichero se llama al loop.
template-xxx.php: los ficheros que empiezan con el prefijo template- contienen plantillas
que se le pueden asignar a cada página. Son ficheros que distribuyen la información de
formas distintas y realizan llamadas a los ficheros explicados anteriormente en distintas
partes de su código para mostrar información.
La carpeta assets que mostramos en la Figura B.2 puede contener una serie arbitraria de
ficheros o carpetas para ser utilizados por la aplicación. A partir del nombre de todas sus
subcarpetas podemos intuir su contenido. La carpeta flags contiene miniaturas de banderas
88
Figura B.1: Jerarquia de ficheros completa
89
Figura B.2: Jerarquia de la carpeta assets
para mostrar en la selección de idiomas, la carpeta fonts los archivos de las fuentes que se
utilizan en la web, images es el lugar donde se almacenan todas las imágenes, javascripts para
almacenar este tipo de ficheros y stylesheets para hojas de estilo. En la plantilla que utilizamos
todas estas carpetas se encuentran vacı́as listas para ser llenadas de contenido.
Carpeta customs: destinada a incluir todos nuestros custom post types y taxonomı́as. La
plantilla ya contiene algunos posts personalizados y un fichero para incluir la definición
de taxonomı́as.
Carpeta metabox : contiene archivos para la construcción de las metaboxes del panel de
administración de WordPress.
shortcodes.php: este archivo es donde programamos todos los shortcodes del tema. En
nuestra plantilla contiene algunos shortcodes básicos para tareas como la incrustación de
vı́deos en páginas o la creación de columnas.
Carpeta tinymce: esta carpeta contiene imágenes en miniatura para crear atajos para los
shortcodes.
Por último la carpeta languages (Figura B.4) contiene archivos de traducción. En la plantilla
observamos dos archivos para la traducción al español. El archivo .po es un archivo que nosotros
escribimos manualmente para la traducción de cadenas, y el archivo .mo es una compilación del
otro archivo, es el que utiliza el sistema para realizar las traducciones.
90
Figura B.3: Jerarquia de la carpeta framework
91
92
Anexo C
En este anexo incluimos una impresión de las páginas principales del diseño proporcionado
por el cliente. Mostramos las siguientes páginas:
1. Home
2. About Us
3. Industries
4. Products
6. Worldwide Network
7. Publications
8. Contact
93
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
converted by W eb2PDFConvert.com
Anexo D
Informes quincenales
En este anexo incluimos los informes quincenales desarrollados durante el proyecto, en estos
se puede observar la evolución del proyecto y el trabajo desarrollado durante cada quincena de
la estancia en prácticas.
El primer informe quincenal que se realizó consistió en la propuesta técnica, todo el contenido
de la propuesta está ya incluido y extendido en este documento, por tanto no lo hemos incluido
en el anexo.
111
Informe de la segunda quincena
Marina Pibernat Segarra
1. Quincena anterior
2. Quincena actual
Como el proyecto estaba bastante avanzado y la empresa necesitaba una aplicación sencilla
para Android también he dedicado varios dı́as al desarrollo de ésta app dejando de lado por
unos dı́as el proyecto principal. He utilizado el entorno de desarrollo Android Studio con Git
para el control de versiones.
3. Quincena siguiente
Modificando las previsiones iniciales debido al adelanto del proyecto, en la quincena próxima
está previsto terminar con la programación back-end y presentar un primer prototipo al cliente.
4. Observaciones
2
Informe de la tercera quincena
Marina Pibernat Segarra
1. Quincena anterior
2. Quincena actual
Una vez terminada la programación back-end he empezado a introducir datos del cliente a
la web. Para ello hemos utilizado una carpeta compartida Dropbox dónde el cliente va subiendo
toda la información que debemos introducir con una estructura acordada.
En esta quincena también he dedicado dos dı́as al desarrollo de un sitio web sencillo a partir
de una plantilla, y durante una tarde he dado una master class de Java a los miembros de la
empresa para introducirlos al lenguaje.
3. Quincena siguiente
El proyecto está prácticamente acabado a falta de pequeños detalles que el cliente nos
pida que modifiquemos. La introducción de datos será a lo que necesitaremos dedicar más
tiempo. También nos encargaremos de revisar cada detalle para comprobar que todo funciona
correctamente y que el código no necesita modificaciones.
4. Observaciones
Llegados a este punto del proyecto necesitamos mucha comunicación con el cliente. Esto hace
que el desarrollo del proyecto no sea todo lo fluido que nos gustarı́a debido a la ligera dificultad
para la comunicación. Muchas veces la comunicación escrita no es suficiente y la diferencia
horaria entre España y Japón, junto con la dificultad para que dos empresas encuentren un
momento para reunirse hacen que el proyecto se quede estancado algún que otro dı́a.
2
Informe de la cuarta quincena
Marina Pibernat Segarra
1. Quincena anterior
2. Quincena actual
Durante esta quincena he realizado pequeñas modificaciones que el cliente nos ha ido pi-
diendo, tanto de de la parte front-end como back-end. Por ejemplo, el cliente ha pedido que
añadamos al sitio un selector de idiomas: en la parte de front-end, hemos añadido el selector
con el aspecto deseado por el cliente y en la parte de back-end, lo hemos integrado con los
idiomas de WordPress para que los idiomas aparezcan en el selector automáticamente.
Como la cantidad de trabajo a hacer dependı́a mucho de la información que nos fuese pasando
el cliente, ha habido dı́as en los que el proyecto no podia avanzar. He invertido estos dı́as en
otras tareas como el desarrollo de un minisite para la promoción de un producto mediante un
concurso.
3. Observaciones
Ésta ha sido la última quincena. Mirando la planificación inicial no hemos llegado a la última
parte planificada de puesta en marcha del proyecto. Tampoco hemos tenido tiempo para realizar
todas las modificaciones pedidas por el cliente. Como ya comentamos en un informe anterior,
esto no fué incluido en la planificación, este tiempo necesario deberı́a haberse tenido en cuenta,
con la dificultad para la estimación debido a la gran dependencia del cliente en estas fases finales
de modificaciones y subida de información.
Anexo E
Pruebas de aceptación
Id Historia de usuario
HU1 Como administrador necesito añadir y eliminar enlaces del header.
HU2 Como administrador necesito añadir, modificar y eliminar elementos del footer.
HU3 Como administrador necesito crear, modificar y eliminar páginas.
HU4 Como administrador necesito crear pestañas.
HU5 Como administrador necesito crear acordeones.
HU6 Como administrador necesito crear formularios.
HU7 Como administrador necesito crear menús desplegables.
HU8 Como administrador necesito crear, modificar y eliminar sliders y añadirlos a
una página.
HU9 Como administrador necesito crear, modificar o eliminar eventos que se mues-
tren automáticamente en la sección de eventos.
HU10 Como administrador necesito crear, modificar o añadir productos y que se
muestren automáticamente en la sección de productos.
HU11 Como administrador necesito añadir, modificar o eliminar distribuidores y
subsidiarias que se muestren automáticamente en el mapa de distribuidores.
HU12 Como administrador necesito añadir, modificar o eliminar publicaciones que
se muestren automáticamente en la sección de publicaciones.
HU13 Como administrador necesito añadir, modificar o eliminar destinatarios del
formulario de contacto.
HU14 Como usuario necesito contactar con la empresa a través de un formulario que
envı́e un mensaje al destino seleccionado.
HU15 Como usuario necesito acceder a redes sociales de la empresa y compartir sus
noticias en mis redes sociales.
1. Añadir enlace: al añadir un enlace, cuando no existe un enlace igual el sistema, el sistema
añade el enlace y podemos verlo en el menú.
117
2. Añadir enlace repetido: al añadir un enlace, cuando ya existe un enlace igual en el
sistema, el sistema añade el enlace y podemos verlo en el menú.
3. Añadir muchos enlaces: al añadir un enlace, cuando ya hay muchos enlaces y no caben
más en la pantalla de la web, el sistema añade el enlace y lo muestra en una segunda lı́nea
del menú.
4. Eliminar enlace: al eliminar un enlace, el sistema elimina el enlace y ya no podemos
verlo en el menú.
5. Eliminar todos los enlaces: al eliminar un enlace, cuando es el único enlace en el
sistema, el sistema elimina el enlace y se muestra el menú vacı́o.
1. Añadir enlace: al añadir un enlace al menú del footer, cuando no existe un enlace igual
el sistema, el sistema añade el enlace y podemos verlo en el menú.
2. Añadir enlace repetido: al añadir un enlace al menú del footer, cuando ya existe un
enlace igual en el sistema, el sistema añade el enlace y podemos verlo en el menú.
3. Eliminar enlace: al eliminar un enlace del menú del footer, el sistema elimina el enlace
y ya no podemos verlo en el menú.
4. Eliminar todos los enlaces: al eliminar un enlace del menú del footer, cuando es el
único enlace en el sistema, el sistema elimina el enlace y se muestra el menú vacı́o.
5. Añadir elemento: al añadir un elemento en la parte derecha del footer, cuando no existe
un elemento igual en el sistema, el sistema añade el elemento y podemos verlo en el footer.
6. Añadir elemento repetido: al añadir un elemento en la parte derecha del footer, cuando
ya existe un elemento igual en el sistema, el sistema añade el elemento y podemos verlo
en el footer.
7. Eliminar elemento: al eliminar un elemento de la parte derecha del footer, el sistema
elimina el elemento y ya no podemos verlo en el footer.
8. Eliminar todos los elementos: al eliminar un elemento de la parte dereecha del footer,
cuando es el único elemento en el sistema, el sistema elimina el elemento y la zona se
muestra vacı́a.
1. Añadir pestaña: al añadir una pestaña a una página, cuando todavı́a no existe ninguna
pestaña en el sistema, el sistema muestra una única pestaña en la que el usuario no puede
hacer clic.
118
2. Añadir dos pestañas: al añadir una pestaña, cuando ya existe otra pestaña en el sistema,
el sistema muestra dos pestañas en las que el usuario puede hacer clic.
3. Añadir muchas pestañas: al añadir una pestaña, cuando ya existen muchas pestañas
en el sistema y no caben en la pantalla de la web, el sistema muestra la pestaña en una
segunda linea de pestañas.
4. Hacer clic sobre pestaña: al hacer clic sobre una pestaña, cuando se está mostrando
el contenido de otra pestaña, el sistema cambia el contenido mostrado.
1. Añadir acordeón: al añadir un acordeón a una página, cuando todavı́a no existe ningún
acordeón en el sistema, el sistema muestra un único acordeón que se despliega y encoge
cuando el usuario hace clic sobre él.
3. Hacer clic sobre acordeón: al hacer clic sobre un acordeón, cuando otro acordeón está
abierto, el sistema despliega el acordeón y encoge el resto de acordeones.
2. Enviar datos correctos: al pulsar sobre el botón para enviar los datos, cuando todos
los datos introducidos en el formulario son correctos, el sistema envı́a los datos al destino
especificado y muestra un mensaje indicando que los datos han sido enviados correcta-
mente.
3. Enviar datos incorrectos: al pulsar sobre el botón para enviar los datos, cuando alguno
de los datos introducidos en el formulario es incorrecto, el sistema no envı́a los datos y
muestra un mensaje indicando que alguno de los datos introducidos no es correcto.
4. Enviar datos incompletos obligatorios: al pulsar sobre el botón para enviar los datos,
cuando falta algún dato marcado como obligatorio por introducir en el formulario, el
sistema no envı́a los datos y muestra un mensaje indicando que faltan datos requeridos
por introducir.
119
5. Enviar datos incompletos no obligatorios: al pulsar sobre el botón para enviar los
datos, cuando falta algún dato no marcado como obligatorio por introducir en el formu-
lario, el sistema envı́a los datos y muestra un mensaje indicando que los datos han sido
enviados correctamente.
1. Añadir menú desplegable: al añadir un menú desplegable a una página, cuando todavı́a
no existe ningún menú desplegable en el sistema, el sistema muestra el menú desplegable
junto a un botón.
2. Seleccionar elemento del desplegable: al pulsar sobre el botón del desplegable, cuando
hemos seleccionado alguna de sus opciones, el sistema nos redirige a la página establecida.
1. Crear slider : al crear un slider, cuando no existe un slider igual en el sistema, el sistema
crea el slider, lo almacena y lo muestra en la lista de sliders.
2. Crear slider con datos repetidos: al crear un slider, cuando ya existe un slider con
los mismos datos en el sistema, el sistema crea el slider, lo almacena y lo muestra en la
lista de sliders.
5. Añadir slider a una página: al añadir un slider a una página, cuando la página no
tiene aún ningún slider asignado, el sistema asigna el slider a la página y lo muestra
después del header.
6. Añadir slider a una página con slider : al añadir un slider a una página, cuando la
página ya tiene un slider asignado, el sistema asigna el nuevo slider a la página, desvincula
el slider anterior y muestra el nuevo slider después del header.
7. Eliminar slider de una página: al eliminar un slider de una página, cuando la página
tiene un slider asignado, el sistema desvincula el slider de la página y ya no muestra el
slider en la página pero continua mostrándolo en la lista de sliders.
120
PRUEBAS DE ACEPTACIÓN HU9
2. Crear evento con datos repetidos: al crear un evento, cuando ya existe un evento con
los mismos datos en el sistema, el sistema crea el evento, lo almacena y lo muestra en la
lista de eventos del panel de administración.
3. Crear evento pasado: al crear un evento, cuando la fecha del evento es anterior a la
actual, el sistema crea el evento, lo almacena y lo muestra en la lista de eventos del panel
de administración pero no lo muestra en la lista pública de eventos.
4. Crear evento futuro: al crear un evento, cuando la fecha del evento es posterior a la
actual, el sistema crea el evento, lo almacena y lo muestra en la lista de eventos del panel
de administración y en la lista pública de eventos.
121
distribuidores del panel de administración y en el lugar correcto de la lista pública de
distribuidores.
1. Crear publicación: al crear una publicación, cuando no existe una publicación igual en el
sistema, el sistema crea la publicación, la almacena y la muestra en la lista de publicaciones
del panel de administración y en el lugar correcto de la lista pública de publicaciones.
2. Crear publicación con datos repetidos: al crear una publicación, cuando ya existe
una publicación con los mismos datos en el sistema, el sistema crea la publicación, la
almacena y la muestra en la lista de productos del panel de administración y en la lista
pública de publicaciones.
122
PRUEBAS DE ACEPTACIÓN HU14
La funcionalidad de esta historia de usuario ya la hemos probado con los tests de aceptación
de la HU6 Como administrador necesito crear formularios.
1. Botones header : al hacer clic sobre los botones de redes sociales situados en el header,
el sistema redirige la página a la red social correspondiente de la empresa.
2. Botones footer : al hacer clic sobre los botones de redes sociales situados en el footer, el
sistema redirige la página a nuestra cuenta de la red social para seguir o compartir.
123