Desarrollo Software
Desarrollo Software
Desarrollo Software
Supervisor:
Autor: Alejandro Fandos Renau
Paula Vilas Usó Tutor académico:
Dolores Marı́a Llidó Escrivá
Este documento y el desarrollo del sistema forman parte del proyecto de final de grado del
Grado de Ingenierı́a Informática. Este trabajo se ha desarrollado durante la estancia en prácticas
en Frutı́nter, S.L., una empresa dedicada al sector hortofrutı́cola.
Palabras clave
Desarrollo web, Web corporativa, Symfony 2, PHP, framework, TFG Ingenierı́a Informática
.
Keywords
Web development, Corporative web, Symfony 2, PHP, framework, Final Project Computer
Engineering Degree
Índice general
1. Introducción 5
3
4.1.4. Diagrama de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.4. Exportación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.5. Importación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6.2. Formación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6. Resultado final 57
7. Conclusiones 61
A. Introducción a Symfony 65
B. Manual de Usuarios 69
4
Capı́tulo 1
Introducción
El desarrollo del documento presentado en este documento es el resultado del trabajo reali-
zado en la asignatura EI1054 Prácticas externas y Proyecto de final de grado, es decir, durante
las 300 horas de estancia en prácticas en Frutı́nter, S.L.
Frutı́nter , S.L. es una empresa del sector hortofrutı́cola. Sus orı́genes en el antiguo ’Mercat
del Born’ de Barcelona se remontan a los años cincuenta. Aplican las novedades tecnológicas
disponibles a todos los ámbitos empresariales: desde la producción, donde hay que destacar que
poseen plantaciones propias, la gestión, tanto administrativa como comercial, incluyendo los
procesos internos de confección, calidad y trazabilidad, hasta la adquisición de nueva maquinaria
para procesar la fruta.
5
Esta empresa dispone, también en Mercamadrid, de una Plataforma de Distribución lo que
les ha permitido ampliar su oferta prácticamente toda la variedad de productos hortofrutı́colas.
Además de una flota propia de 42 camiones para el transporte directo, aspecto que además de
rapidez, garantiza un control óptimo de la temperatura asegurando en todo momento la frescura
del producto.
Frutı́nter, S.L. ya disponı́a de un web corporativa pero debido al paso del tiempo, a la
evolución de las tecnologı́as y a la necesidad de mantener un imagen para promocionar sus
productos y campañas la web que disponı́an se habı́a quedado obsoleta por ello necesitaban un
proceso de renovación.
Por tanto la motivación de este proyecto es desarrollar una nueva web corporativa a partir de
las nuevas necesidades que han surgido, como pueden ser la necesidad de acceder a la información
de forma más dinámica y adaptarla a las redes sociales del momento.
Los objetivos de este proyecto son la implementación de un portal web que permita por
una parte, mejorar la gestión de información a los clientes, haciéndola más ágil y llegando a
un público más amplio. Por otra parte, el sistema tiene que permitir la actualización de los
productos de una forma sencilla y usable. Las caracterı́sticas que el portal web debe cumplir
son las siguientes:
La autogestión del portal web, todo el contenido podrá ser modificado sin la necesidad de
conocimiento técnicos.
6
Capı́tulo 2
El proyecto deberá tener las siguientes caracterı́sticas, organizadas según el uso que puede
realizar los diferentes usuarios.
Al finalizar el proyecto este se desplegará en el servidor que dispone la empresa, éste estará
disponible en la URL: http://www.frutinter.com. Además se ofrecerá un pequeño manual
para que los gestores puedan gestionar el portal web.
Las funcionalidades del portal para los gestores, cuando estén registrados y autentificados
en el sistema, son:
Mantener información de los productos que ofrece la empresa ası́ como de la actualización
de los posibles envases en los que se pueden encontrar.
Mantener información de los envases.
Mantener la sección de noticias. Modificando e insertando noticias para mantener actua-
lizado el portal web.
Las funcionlidades del portal para los visitantes, que no requieren de autentificación, son :
7
Contactar con la empresa a través de un formulario web.
El sistema debe ser extensible, debe permitir añadir nuevos módulos a las dos partes. Por
tanto, se ha de definir cómo se debe implementar un nuevo módulo para añadirlo al sistema.
Un ejemplo de extensión: módulo de trazabilidad de productos (Si dentro de las 300h fuera
posible realizarse su diseño e implementación). Serı́a útil permitir al gestor poder realizar un
seguimiento de la trazabilidad de los productos.
8
Capı́tulo 3
En este apartado del documento se presenta la planificación del proyecto; además de la lista
de tareas y subtareas a desarrollar durante la duración del proyecto.
A continuación se listarán las diferente etapas por las que ha pasado el desarrollo del pro-
yecto:
1. Inicio
En la primera de la etapas tuvo lugar una reunión con el tutor académico y el supervisor
de la empresa donde se acordaron las fechas de inicio y fin de la estancia en prácticas,
ası́ como los requisitos del proyecto. El tutor académico recomendó utilizar el framework
Symfony como herramienta para el desarrollo del proyecto. En esta reunión se acordó la
realización de 6 horas presenciales hasta completar las 300h de la estancia en prácticas.
La jornada de la estancia en prácticas empezaba a las 8:00h y terminaba a las 14:00h,
cumpliendo con el horario la estancia en prácticas comenzó el 9 de febrero terminando el
22 de abril.
2. Planificación
En esta etapa se evaluó la situación actual de la empresa para determinar las necesidades
que habı́a que cubrir en el nuevo portal web. Además se definieron los objetivos principales
del proyecto ası́ como el alcance.
Se van a concretar las tareas a realizar y situarlas en las fases correspondientes. A partir
de ellas crearemos el diagrama de Gantt donde podremos ir observando la evolución del
proyecto. Una vez finalizada esta etapa ya se pude redactar la propuesta técnica, fue
evaluada tanto por el supervisor del proyecto como el tutor.
9
3. Definir requisitos del proyecto
Después de las reuniones realizadas con los responsables de los diferentes departamentos
de la empresa, se transforman en requisitos las peticiones que el cliente realiza sobre lo que
deberı́a cumplir el sistema o cómo lo deberı́a realizar. Para ello realizamos un diagrama
de casos de uso para describir el comportamiento del sistema. Además de la definición y
documentación del los requisitos identificados.
4. Análisis
En esta etapa se definió el diseño de la base de datos, identificando las tablas a generar
ası́ como las relaciones entre si, creando a partir de ello el diagrama de clases.
También se construyó el diagrama de actividades donde se podrá observar el funciona-
miento del sistema ası́ como las actividades que se pueden realizar.
5. Diseño
Una vez todo los requisitos y el flujo de actividades claro, se procedió a desarrollar los
diseños de las interfaces gráficas. Identificando a los diferentes usuarios para el uso del
portal web.
6. Construcción
En esta etapa se ha de instalar y configurar el framework Symfony para el desarrollo
del portal web de forma local. Se realizó el desarrollo e implementación de los diferentes
códigos a partir de las herramientas del framework ası́ como con la ayuda de JavaScript.
En secciones posteriores, se explicará de forma detallada el software empleado para el
desarrollo completo del portal web.
7. Puesta en marcha
En esta sección se ha configurado la aplicación para desplegarla en un servidor compartido,
del cual ya disponı́a la empresa.
Aunque a lo largo del proyecto, y por tanto de forma paralela, hemos ido investigando el
framework a utilizar para el desarrollo del portal web.
10
3.2. Planificación temporal de las tareas
11
3.3. Estimación y coste de los recursos del proyecto
En este apartado se va a hacer una descripción más detallada de las tecnologı́as que han
sido utilizadas para desarrollar el proyecto y por qué ha sido escogida cada una de ellas.
1. Pspad [10]
Pspad es un editor gratuito para programadores que puede ser utilizado en varios entornos
de programación. Utiliza el resaltado sintáctico para múltiples lenguajes de programación,
que ayuda a la lectura con claridad del código desarrollado.
2. XAMPP [19]
XAMPP es una distribución gratuita del servidor web apache. Está compuesto por la
base de datos MySQL, el servidor web Apache y los interpretes para los lenguajes de
programación PHP y Perl. Es un software libre y fácil de utilizar, es válido para cualquiera
de los diferentes sistemas operativos. En este caso hemos utilizado como sistema operativo
Windows y como lenguaje PHP .
3. Apache [3]
Apache es un servidor web HTTP de código abierto, es necesario para ejecutar el proyecto
de forma local.
4. MySQL [5]
MySQL es un sistema de gestión de base de datos relacional y multiusuario. Esto permite
velocidad y flexibilidad, ya que las tablas están conectadas por relaciones definidas que
hacen posible combinar datos de diferentes tablas. MySQL es muy utilizado en aplicaciones
web y está muy ligada al lenguaje de programación PHP. Es una base de datos muy rápida
aunque puede provocar problemas de integridad si el entorno tiene alta concurrencia en la
modificación de datos. Gracias a ello encaja perfectamente con proyectos web, ya que en
estos hay una baja concurrencia en la modificación de datos. Se ha escogido este lenguaje,
ya que como podremos observar posteriormente, el servidor compartido del cual dispone
la empresa posee bases de datos que se implementan con este lenguaje.
6. YAML [8] Los archivos de configuración de Symfony2 se pueden escribir en PHP, en XML
o en YAML. YAML es probablemente el formato más equilibrado, ya que es mucho más
conciso que XML y es bastante flexible. Su gran desventaja es que no se puede validar
automáticamente, por lo que la mayorı́a de los errores sólo puedes descubrirlos al ejecutar
la aplicación. Hemos decido realizar los archivos de configuración de YAML al ser el
formato más equilibrado.
12
7. Doctrine [6]
Doctrine es un mapeador de objetos-relacional escrito en PHP que proporciona una capa
de persistencia para objetos PHP. El componente que se encarga por defecto de gestionar
el modelo en Symfony es una capa de tipo ORM (object/relational mapping). En las
aplicaciones Symfony, el acceso y la modificación de los datos almacenados en la base de
datos se realiza mediante objetos; ası́ que nunca se accede de forma explı́cita a la base
de datos. Este comportamiento permite un alto nivel de abstracción y permite una fácil
portabilidad. La principal ventaja que aporta el ORM es la reutilización, permitiendo
llamar a los métodos de un objeto de datos desde varias partes de la aplicación e incluso
desde diferentes aplicaciones. La capa ORM también encapsula la lógica de los datos. La
utilización de objetos en vez de registros y de clases en vez de tablas, tiene otra ventaja:
permite añadir métodos accesores en los objetos que no tienen relación directa con una
tabla.
8. Git [12]
Git es 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.
9. HTML 5 [17]
HTML hace referencia al lenguaje de marcado para la elaboración de páginas web. Es
un estándar que sirve de referencia para la elaboración de páginas web en sus diferentes
versiones, define una estructura básica y un código para la definición de contenido de una
página web, como texto, imágenes, videos, entre otros. Es un estándar a cargo de la W3C,
organización dedicada a la estandarización de casi todas las tecnologı́as ligadas a la web,
sobre todo en lo referente a su escritura e interpretación.
13
13. PHP [11]
Lenguaje de programación del lado del servidor para la creación de páginas web de con-
tenido dinámico. Se considera uno de los lenguajes más flexibles, potentes y de alto ren-
dimiento conocidos a dı́a de hoy, ası́ como fácil de aprender. Este puede ser utilizado en
la mayorı́a de los servidores web y en casi todos los sistemas operativos y plataformas.
Acceso FTP.
Soporte PHP, ASP, ASP.Net, JavaScript, VB Script, HTML 4/5, Flash, ActiveX.
14
Sistema Operativo: Windows 8.1 Pro
Disco Duro: 1 TB
Hay algunos aspectos o situaciones a tener en cuenta a la hora del desarrollo del portal web
como son la caı́da del sistema, algún fallo en la web o la seguridad. En cuanto a la caı́da del
sistema Frutı́nter, S.L. debe contactar con la empresa alojadora del host, ya que es una empresa
externa a la empresa la que suministra el servicio de hosting y correo electrónico.
Para finalizar, la seguridad de un portal web es uno de los aspectos más importantes a la
hora de realizar un proyecto por tanto en este caso lo controlaremos con las herramientas que
nos proporciona el framework Symfony2.
Para obtener el coste de recursos humanos debemos dividir las horas del proyecto entre
los dos roles citados anteriormente. El trabajo del analista tendrı́a una duración de 170 horas
mientras que el trabajo del programador constarı́a de 128 horas. 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, Bureau of Labor Statics y U.S. News. En la Figura 3.2 encontramos el
presupuesto estimado para los recursos humanos.
En la Figura 3.3 vemos el presupuesto para los recursos hardware. A partir del precio de los
equipos que utilizamos y de la vida útil de cada uno, calculamos el precio proporcional según
las horas de uso del equipo en el proyecto. El coste de los recursos software es de 0 edebido a
que todas las licencias utilizadas son libres.
15
Figura 3.2: Presupuesto recursos humanos
Por último, en la Figura 3.4 podemos observar el coste total del proyecto.
16
Capı́tulo 4
En este apartado se realiza un análisis de los requisitos del sistema. Se exponen las carac-
terı́sticas que la aplicación debe cumplir. Estos requisitos se acordaron con el cliente antes de
empezar con el desarrollo del proyecto. De esta manera logramos comprender mejor el problema
a resolver y podemos definir la solución informática más adecuada.
17
4.1.1. Diagrama de casos de uso
En esta sección se muestra el diagrama de casos de uso, donde se puede observar las activi-
dades que deben realizar cada uno de los roles definidos.
Cómo hemos podido observar en el anterior diagrama de casos de uso, los requisitos funcio-
nales que se pueden identificar son los más numerosos. A continuación se muestran de forma
detallada.
18
19
20
21
22
23
4.1.3. Requisitos de datos
El portal web debe devolver información especı́fica para cada sección. Por ello, a continua-
ción, se definen los diversos tipos de datos que se pueden requerir en el portal web.
24
4.1.4. Diagrama de clases
Llegados a este punto, es necesario identificar las clases del portal web. Debido a que sola-
mente requiere guardar información que se mostrará en la parte pública, no se requerirá una
gran cantidad de tablas en la base de datos. Se necesitarán las tablas Productos y Envases que
guardarán la información de la fichas que se mostrarán en la parte pública.
Para relacionar los envases en que se encuentra disponible un producto se define la tabla
Envasado, donde se localizará los envases disponibles para cada producto.
Para finalizar, se requerirá una tabla Usuarios para guardar la información necesaria para
entrar en la parte privada, es decir, autentificarse. Como existen diversos usuarios hemos creado
un campo donde se identifica si es gestor o administrador.
25
Figura 4.2: Diagrama de clases
Producto
Tipo:Clase
26
Atributos
Operaciones
Envase
Tipo: Clase
Atributos
27
Operaciones
Envasado
Tipo: Clase
Atributos
Operaciones
Conexiones
Noticia
Tipo: Clase
28
Atributos
Operaciones
Conexiones
Usuario
Tipo: Clase
Atributos
29
Operaciones
En la figura 4.3 podemos observar los procesos que pueden suceder durante la navegación
del portal web, representado en un diagrama de actividades. Desde el inicio de la navegación del
portal web hasta que obtenemos la información o resultado requerido pueden acontecer diversos
eventos, por lo que la mejor forma de visualizar estos eventos de forma simplificada es a través
de un diagrama UML.
30
el cliente y php en el servidor. Para diseñar el portal web se han definido dos partes: la privada y
la pública. Como podemos observar en el mapa del portal web figura 4.4, se deberán diseñar las
secciones especificadas, además de una serie de páginas estáticas que en los diagramas definidos
anteriormente no se hace referencia.
31
Figura 4.4: Mapa del portal web
32
4.3. Diseño de la interfaz
Para diseñar la interfaz del portal web uno de los aspectos más importantes es haber iden-
tificado la jerarquı́a del sitio web. Una vez definido y revisado con el supervisor y la empresa
se empezó a concretar que sección contenı́a que información. Teniendo todos los aspectos de la
jerarquı́a vista en la figura 4.4 y donde ha de aparecer la distinta información, se empezó con el
diseño de las interfaces realizando prototipos de algunas de las principales pantallas del portal
web. Para realizar estos prototipos, se ha utilizado el programa balsamiq Mockups [1], ya que
se trata de un programa de diseño de pantallas utilizado anteriormente.
En primer lugar se mostrarán los prototipos diseñados para la parte pública. En la figu-
ra 4.5 podemos observar el primer prototipo de la página principal del portal web, ésta está
estructurada en tres bloques:
Imágenes cambiantes
Caja de autentificación
Tras analizar este prototipo, finalmente se decidió sustituir dos de las tres noticias por un
vı́deo corporativo y los últimos tweets publicados, siendo las secciones de la página principal las
siguientes:
Imágenes cambiantes
Última noticia
Vı́deo corporativo
Últimos tweets
Caja de autentificación
33
Figura 4.5: Prototipo página de inicio
A continuación, se muestran las secciones disponibles en el menú, que son las páginas Pro-
ductos (figuras 4.7 y 4.8), Noticias (figuras 4.6 y 4.9) y Envases.
34
Figura 4.6: Prototipo página Noticias
Estos prototipos diseñados cumplen con los apartados que solicitaba la empresa. Las pági-
nas se han estructurado las páginas de la siguiente forma. Cómo observaremos en todos los
prototipos, el menú principal se sitúa en la parte superior derecha, seguidamente se listarán ya
sean los productos, noticias o envases. Este listado muestra un resumen del contenido, además
de la imagen que contiene. Para acceder al contenido completo, se ha diseñado un botón que
aparecerá en la parte inferior derecha de cada item. Una vez se acceda a las pantallas con más
detalle aparecerá una nueva pantalla, cómo podemos observar en las figuras 4.8 y 4.9.
35
Figura 4.8: Prototipo página de detalle de un producto
36
En el siguiente prototipo que podemos observar en la figura 4.10 muestra el menú de la
sección Empresa se ha diseñado como un menú de imágenes cambiantes. Posteriormente se
explicará como se ha desarrollado.
Para finalizar con el diseño de la parte pública, en la figura 6.4 aparece el diseño de la
pantalla de la sección Contactos. En ésta se ha diseñado un formulario de contacto en la parte
derecha.
37
de Gestión. En este caso se trata de la pantalla de Gestión de Productos. Donde se mostrará una
lista con todos los productos. Para cada producto se darán dos posibilidades: la de modificación
y la de visualización. En la parte inferior izquierda se visualizará un botón para añadir ya sea
productos, envases o noticias.
El último prototipo, figura 4.13, muestra la pantalla diseñada para insertar nuevas Noticias.
El diseño de las pantallas para añadir productos y envases será el mismo. Se visualizará un
formulario donde completar la información a insertar, para finalizar con el proceso se muestra
un botón para finalizar la operación.
38
Figura 4.13: Prototipo página Añadir Noticia
39
40
Capı́tulo 5
Implementación, pruebas y
documentación
Una vez diseñados los prototipos, el siguiente paso es empezar a implementar el sitio web.
Para ello utilizaremos el framework Symfony. Éste utiliza el modelo vista-controlador, como
podemos observar en la figura 5.1.
Este portal web dispondrá de una parte privada, a la que se accederá a través de la caja
de autentificación que aparece en la parte inferior de la página, a petición de la empresa. A
parte del acceso a la parte privada el portal web ofrece la posibilidad de navegación por la parte
pública. A estos usuarios no se les permite el acceso a la parte privada, por lo que los gestores
de la aplicación poseerán un nombre de usuario y una contraseña para el acceso. Por todo ello,
a la hora de implementar el portal web deberemos distinguir entre las dos partes el backend y
frontend.
41
5.1. Detalles de implementación
En este apartado se realiza un recorrido por los pasos más importante que se han realizado
para la implementación del portal web. Para una mejor comprensión de los conceptos principales
del framework Symfony se puede consultar el anexo A.
En segundo lugar, se crean las páginas. Para ello se ha de seguir los siguientes pasos:
1 ayuda :
2 path : / ayuda
3 defaults :{ _controller : PublicoBundle : Default : ayuda }
Para que sea más fácil el enrutamiento en páginas estáticas se ha creado un archivo de
configuración llamado routingpaginas. Éste nos permite que todas las rutas definidas en el
archivo routing.yml se sirvan mediante el controlador especial FrameworkBundle utilizado en
las páginas estáticas. Se han seguido los siguientes pasos:
1 ayuda :
2 path : / ayuda
3 defaults :{ template : ’ PublicoBundle : Sitio : ayuda . html . twig ’}
42
Añadir la función al fichero SitioController, sólo una vez.
Seguidamente, se ha iniciado con la creación de las tablas seguiremos los siguientes pasos:
Primero ejecutamos la siguiente consulta, en la que iremos introduciendo los datos para crear
las clases:
Una vez creadas las entidades hay que crear la base datos con la siguiente consulta:
Una vez creada la base de datos se ha de crear el esquema con la siguiente consulta:
Para finalizar hay que actualizar la estructura de la tablas con la siguiente consulta:
Una vez implementadas las páginas estáticas, empezamos a desarrollar las páginas dinámicas,
aquellas páginas que necesitan hacer una consulta a la base de datos. En el portal web de la
empresa Frutı́nter S.L., las páginas dinámicas son:
Productos
Noticias
Envases
Se seguirán los siguientes pasos para el desarrollo de estas páginas, por ejemplo la página
Productos:
Añadir en el controlador la función necesaria que recoge los datos y los muestra por
pantalla.
43
1 public function productosAction () {
2 $em = $this - > getDoctrine () -> getManager () ;
3 $productos = $em - > getRepository ( ’ PublicoBundle : Producto ’) ->
f in d P ro d u ct o s Ac t u al () ;
4 return $this - > render ( ’ PublicoBundle : Default : productos . html .
twig ’ ,
5 array (
6 ’ productos ’ = > $productos
7 )
8 );
Crear una función en ProductoRepository que mediante una consulta SQL selecciona
aquellos datos que interesan.
1 public function f in d P ro du ct o s Ac t u al () {
2 $em = $this - > getEntityManager () ;
3 $consulta = $em - > createQuery ( ’
4 Select p . id , p . nombre , p . descripcion , p . categoria , p .
fechaInicio , p . fechaFin , p . rutaImagen
5 From PublicoBundle : Producto p
6 Where CURRENT_DATE () BETWEEN p . fechaInicio AND p . fechaFin
7 ’) ;
8 return $consulta - > getResult () ;
9 }
44
24 { % endif %}
25 < div id = " boton " >
26 <a href = " {{ path ( ’ producto ’ ,{ ’ producto ’: producto . id })
}} " class = " boton - style " > Mostrar detalles </ a >
27 <br >
28 </ div >
29 </ div >
30 </ div >
31 { % endfor %}
Ya finalizada la parte pública, se empieza a desarrollar la parte privada del portal web o
backend. Para ello se utiliza el admin generator que es un conjunto de utilidades que facilita la
creación de la parte de administración de un sitio web. Hay varias opciones para el desarrollo
de esta parte utilizando el admin generator:
Esta tarea genera un controlador, un archivo de rutas y cuatro plantillas para utilizar con la
entidad indicada. Una vez ejecuta esta sentencia se deben modificar los siguientes archivos:
Una vez implementadas las dos partes el backend y el frontend, ya se puede desarrollar la
autentificación en la parte privada para ello se debe realizar las siguientes operaciones:
45
Añadir en el fichero security.yml la configuración siguiente:
1 security :
2
3 firewalls :
4 # partes de la aplicación mostraran el formulario de login
5 frontend :
6 pattern : ^/*
7 provider : usuarios
8 anonymous : ~
9 form_login :
10 login_path : / login
11 check_path : / login_check
12 d ef a u lt _ t a rg e t _p a t h : / privado
13 failure_path : /
14 logout :
15 path : usuario_logout
16 access_control :
17 # permisos
18 - { path : ^/ privado / usuario , roles : ROLE_ADMIN }
19 - { path : ^/ privado /* , roles : [ ROLE_USER , ROLE_ADMIN ] }
20 - { path : ^/ usuario / login , roles :
IS_AUTHENTICATED_ANONYMOUSLY }
21
22 encoders :
23 # codificacion passwords
24 Frutinter \ UsuarioBundle \ Entity \ Usuario : { algorithm :
sha512 , iterations : 10 }
25
26 providers :
27 # De donde provienen los usuarios
28 usuarios :
29 entity : { class : UsuarioBundle : Usuario , property : email
}
1 usuario_usuario :
2 resource : " @UsuarioBundle / Resources / config / routing / usuario . yml "
3 prefix : / privado / usuario
4
5 # Ruta para la acción de login de de los usuarios del frontend
6 login :
7 path : / login
8 defaults : { _controller : UsuarioBundle : Security : login }
9
10 # Ruta para la acción que comprueba el login del frontend
11 login_check :
12 path : / login_check
13
14 # Ruta para la acción de logout de los usuarios del frontend
15 usuario_logout :
16 path : / logout
46
Crear las funciones loginAction y loginCheckAction en el fichero UsuarioBundle/Contro-
ller/
SecurityController.php.
1 /* *
2 * @Route ("/ login " , name =" login_route ")
3 */
4 public function cajaLoginAction ( Request $request )
5 {
6
7
1 /* *
2 * @Route ("/ loginCkeck " , name =" check_route ")
3 */
4 public function loginCheckAction () {
5
6 }
47
2 { # Caja de login #}
3 { % if not app . user %}
4 { # Si no estas logueado #}
5 <h2 >{{ " Accede a tu cuenta " | trans }} </ h2 >
6 < form action = " {{ path ( ’ login_check ’) }} " method = " post " >
7 < label for = " login_user " >{{ " Email " | trans }} </ label >
8 < input id = " login_user " type = " text " name = " _username " value = "
{{ last_username | default ( ’ ’) }} " / >
9
10 < label for = " login_pass " >{{ " Contrase~n a " | trans }} </ label >
11 < input id = " login_pass " type = " password " name = " _password " / >
12
13 < input type = " submit " value = " {{ " Entrar " | trans }} " / >
14 < input type = " checkbox " id = " remember_me " name = " _remember_me "
checked / >
15 < label for = " remember_me " >{{ " No cerrar sesión " | trans }} </
label >
16 </ form >
17 { % else %}
18 { # Si estas logueado #}
19 <p >
20 Conectado / a como {{ app . user . username }} |
21 <a href = " {{ path ( ’ privado_portada ’) }} " >{{ " Acceder zona
privada " | trans }} </ a > |
22 <a href = " {{ path ( ’ usuario_logout ’) }} " >{{ " Cerrar sesión " |
trans }} </ a >
23 </p >
24 { % endif %}
25 </ section >
Una vez finalizada la implementación principal del portal web, se va a desarrollar otras
funcionalidades necesarias para el completo funcionamiento.
En primer lugar la carga de imágenes al servidor. Para ello se deben hacer modificaciones
en la entidad y en el controlador.
1 /* *
2 * @ORM \ Column ( type =" string " , nullable = true )
3 */
4 protected $rutaImagen ;
5
48
6 /* *
7 * @Assert \ Image ( maxSize = "500 k ")
8 */
9 protected $imagen ;
Añadir una nueva función donde se mueve la imagen del directorio actual a la carpeta
web/uploads.
Por último es necesario añadir las siguientes lı́neas al controlador para añadir y modificar.
Para enlazar los archivos web ya sea tanto los scripts, css como las imágenes se debe utilizar la
siguiente ruta.
1 encoders :
2 # codificacion passwords
3 Frutinter \ UsuarioBundle \ Entity \ Usuario : { algorithm :
sha512 , iterations : 10 }
49
Añadir la siguiente lı́nea en la función createAction del controlador:
Modificar con el siguiente código la función updateAction, para que cada vez que se
modifique cualquier dato del usuario no se codifique la contraseña.
50
Para finalizar, los pasos seguidos para el envı́o de un correo electrónico a través del formulario
creado en la página Contacto son los siguientes:
1 mailer_transport : smtp
2 mailer_host : smtp . frutinter . com
3 mailer_user : r e c ep c i on @ f r ut i n te r . com
4 mailer_password : xxxxxxxxxxxxxxx
5 locale : es
6 secret : e 2 3 d 1 1 e c 8 5 3 6 1 b e a 1 5 b 3 8 d c 1 5 c 0 8 f d 0 8 2 5 e 8 a f b b
Barra de depuración web: se incluye en la parte inferior de todas las páginas que se ejecutan
en el entorno de desarrollo. Muestra mucha información importante sobre la página actual.
51
Figura 5.2: Barra de depuración de Symfony2
Los archivos de log: guardan toda la información sobre la ejecución interna de la aplicación
y que permiten realizar un análisis exhaustivo en los casos que ası́ lo requieran.
Después de valorar varias técnicas para validar la usabilidad del portal web hemos decido
seguir las preguntas propuestas por “InterGraphicsDesigns”[13]. Este test está compuesto por
preguntas referentes a, (estas preguntas podemos observar en el anexo C) :
Página de inicio
Orientación de tareas
Navegabilidad
52
Formularios
Confianza y credibilidad
Búsquedas
Usuarios expertos
53
Usuarios con algunos conocimientos
Usuarios inexpertos
Por tanto los resultados obtenidos son la estimación de los resultados de los diferentes test.
5.4. Exportación
Para la puesta en producción debemos poder instalar todo el portal en otro servidor y
mantener todos los datos de nuestra BD. Para ello necesitamos poder exportar/importar nuestro
sistema. Para exportar el portal web es necesario realizar los siguientes pasos:
Modificación del archivo app.php situado en la carpeta pública cambiando las siguiente
lı́nea
por
5.5. Importación
Para poder instalar o importar el portal web en el servidor deberemos realizar los siguientes
pasos:
Modificar los parámetros del archivo app/config/parametre.yml con los datos de la base
de datos del servidor, definiendo el host, name, user y password. En este caso:
54
1 parameters :
2 database_driver : pdo_mysql
3 database_host : mysql03
4 database_port : null
5 database_name : DBM3575DOM2
6 database_user : udb3575plg
7 data base_p asswor d : xxxxxxxxxxxx
8 mailer_transport : smtp
9 mailer_host : smtp . frutinter . com
10 mailer_user : r e c ep c i on @ f r ut i n te r . com
11 mailer_password : xxxxxxxxxxxxxxx
12 locale : es
13 secret : e 2 3 d 1 1 e c 8 5 3 6 1 b e a 1 5 b 3 8 d c 1 5 c 0 8 f d 0 8 2 5 e 8 a f b b
Crear una carpeta en la carpeta pública del servidor donde almacenar todo el proyecto,
excepto la carpeta web.
Volcar el contenido de la carpeta web en la carpeta pública del servidor en este caso la
carpeta httpdocs.
5.6.2. Formación
Una vez finalizada la implementación se formó a varios empleados sobre el uso del portal
web. Los departamentos en los que se va utilizar la parte privada del portal web van a ser el
departamento de Informática y el departamento de Marketing. Ası́ que se realizó una formación
de 3 horas en la que se explicó el funcionamiento y se indicó las partes del manual de usuarios.
55
56
Capı́tulo 6
Resultado final
57
Figura 6.2: Submenú Empresa
58
Figura 6.4: Página de contacto
59
Figura 6.6: Página añadir nueva noticias
60
Capı́tulo 7
Conclusiones
En este apartado final se describen las conclusiones del trabajo realizado durante la estancia
en prácticas, tanto a nivel técnico como a nivel personal.
Después de los meses de trabajo integrada en el equipo de la empresa Frutı́nter S.L. po-
demos concluir que los objetivos que se plantearon al inicio del proyecto se han cumplido de
forma satisfactoria. Para que esto sucediera, además de trabajar conjuntamente con el equipo
informático, se ha mantenido contacto con los otros departamentos de la empresa para obtener
la mejor adaptación posible a los requisitos requeridos y necesidades de la empresa actualmen-
te; para ello se ha mantenido contacto con los departamentos de Marketing, Importaciones y
Exportaciones. Finalmente se ha conseguido crear un portal web al gusto de la empresa a través
del framework Symfony. La mayor barrera que he tenido durante la realización de proyecto ha
sido la inexperiencia con la utilización de un framework y el desconocimiento de Symfony, para
solucionar esta barrera he tenido que realizar un trabajo de búsqueda y documentación; por lo
que ha absorbido mas tiempo del esperado del proyecto.
Capacidad de comunicación
Trabajo en equipo
Compromiso organizacional
61
Como trabajo futuro para la empresa queda el modulo de trazabilidad, ya que este modulo
está a expensas de la implantación de un sistema RFID para la automatización de la tarea.
62
Bibliografı́a
[2] Desarrollo web agil con Symfony2. 2014. [Consulta: 15 de Abril de 2015].
63
[18] Libros web. Javascript. http://librosweb.es/libro/javascript/. [Consulta: 4 de Mayo
de 2015].
64
Anexo A
Introducción a Symfony
Bundles[2]
Un bundle simplemente es un conjunto estructurado de archivos que se encuentran en un direc-
torio y que implementan una sola caracterı́stica. Cada directorio contiene todo lo relacionado
con esa caracterı́stica, incluyendo archivos PHP, plantillas, hojas de estilo, archivos Javascript,
tests y cualquier otra cosa necesaria.
Los bundles son la parte más importante de Symfony2. Permiten utilizar funcionalidades
construidas por terceros o empaquetar tus propias funcionalidades para distribuirlas y reutili-
zarlas en otros proyectos. Además, facilitan mucho la activación o desactivación de determinadas
caracterı́sticas dentro de una aplicación.
Entidades[2]
Se denomina entidades a los objetos PHP utilizados para manipular la información de la base
de datos. Generalmente cada tabla de la base de datos se representa mediante una entidad. No
obstante, en ocasiones Doctrine2 crea tablas adicionales para representar la relación entre dos
entidades.
Anotaciones[2]
Las anotaciones son un mecanismo muy utilizado en lenguajes de programación como Java.
Aunque PHP todavı́a no soporta anotaciones (al menos hasta la versión PHP 5.6), las aplica-
ciones Symfony2 pueden hacer uso de ellas gracias a una librerı́a desarrollada por el proyecto
Doctrine2. Técnicamente las anotaciones no son más que comentarios incluidos en el propio
código fuente de la aplicación. A diferencia de los comentarios normales, las anotaciones no sólo
no se ignoran, sino que se tienen en cuenta y pueden influir en la ejecución del código.
Enrutamiento[2]
El sistema de enrutamiento transforma URLs en controladores. Más en concreto, determina
cuál es el controlador que se debe ejecutar para cada URL solicitada por los usuarios. Esta
transformación se realiza mediante la información de las rutas, normalmente configurada en
archivos YAML.
65
Controlador[2]
El controlador es la parte de la aplicación que contiene lo que se llama la lógica de negocio, que
es una forma elegante de decir que cada controlador se encarga de una funcionalidad completa
de la aplicación.
66
Entornos [9]
Symfony dispone de diversos entornos. Los diferentes entornos comparten el mismo código PHP
pero usan una configuración diferente. El entorno de desarrollo dev guarda las advertencias y
errores, mientras que un entorno de producción prod sólo registra los errores. Algunos archivos
se vuelven a generar en cada petición en el entorno dev (para mayor comodidad de los desa-
rrolladores), pero se cachean en el entorno prod. Todos los entornos se encuentran en la misma
máquina y ejecutan la misma aplicación.
Un proyecto Symfony2 normalmente comienza con tres entornos (dev, test y prod), aunque
resulta sencillo crear nuevos entornos. Puedes ver tu aplicación en diferentes entornos con sólo
cambiar el controlador frontal en tu navegador.
Como el entorno prod está optimizado para ser muy rápido, la configuración, el enrutamiento
y las plantillas Twig se compilan en clases PHP simples y se guardan en caché.
Si haces cualquier cambio en las plantillas, no lo verás en el entorno prod a menos que borres
la cache de la aplicación y ası́ fuerces a Symfony a volver a compilar las plantillas.
Configuración [9]
El proyecto estará formada por una colección de bundles que representan todas las caracterı́sticas
y capacidades de la aplicación. Cada bundle se puede personalizar a través de archivos de
configuración escritos en YAML. De forma predeterminada, el archivo de configuración principal
se encuentra en el directorio app/config/ y se llama config.yml.
Algunos aspectos que se tiene que tener diferenciados para obtener la información de la base
de datos a través del controlador y repository son:
findBy(): obtiene los registros encontrados pudiendo pasar como argumentos los valores
que irı́an dentro del WHERE. Retorna un array.
findOneBy(): obtiene un registro pudiendo pasar como argumentos los valores que irı́an
dentro del WHERE.
67
68
Anexo B
Manual de Usuarios
En este anexo se incluye el manual de usuario desarrollado para explicar la manera de utilizar
cada una de las opciones del portal web.
69
Manual de Usuarios Portal Web
Frutı́nter S.L.
Realizado por:
Paula Vilas Usó
20 de abril de 2015
Índice
1. Introducción 2
4. Descripción de contenidos 4
5. Administración 22
1
1. Introducción
Logo de la empresa.
2
3. Mapa del sitio
3
4. Descripción de contenidos
Logo de la empresa
Pie de página
Menú superior
4
Figura 4: Menú
5
Empresa
¿Quiénes somos?
Filosofı́a
Calidad
Sedes
6
Noticias
7
Productos
8
Confecciones
9
Contacto
10
4.2. Secciones zona Privada
11
Aparecerá un formulario que se deberá rellenar con los datos del
nuevo producto.
12
Aparecerá un formulario con los datos del producto seleccionado para
modificar.
3. Eliminar un producto
13
Aparecerá una pantalla mostrando la información del producto. En
la parte posterior aparecerá un botón con la opción de eliminar. Una vez
borrado aparecerá el listado de los productos existentes por pantalla.
4. Asignar envases
14
Nos mostrará todos los envases disponibles para un producto, clicare-
mos en el botón Modificar. Seguidamente nos mostrará unos desplega-
bles donde podemos modificar la selección del producto y el envase.
15
Para añadir una nueva noticia se debe clicar en el botón de la Fi-
gura 22
16
2. Modificar una nueva noticia
17
Para eliminar una noticia el usuario deberá clicar en el botón Mos-
trar. Aparecerá una pantalla mostrando la información de la noticia.
En la parte posterior aparecerá un botón con la opción de eliminar. Una
vez borrado aparecerá el listado de las noticias existentes por pantalla.
18
Figura 28: Formulario insercción nuevo envase
3. Eliminar un envase
19
borrado aparecerá el listado de los envases existentes por pantalla.
20
Figura 32: Formulario insercción nuevo Usuario
3. Eliminar un usuario
21
Nota: Un usuario sólo podrá ser eliminado si no ha escrito ninguna
noticia.
5. Administración
22
5.2. Textos estáticos del sitio web
Para cambiar los textos estáticos del sitio web se deberá acceder a la
carpeta /frutinter/src/Frutinter/PublicoBundle/Resources/views/Sitio,
donde se encontrarán todos los ficheros correspondientes.
23
94
Anexo C
En este anexo se incluyen las preguntas contestadas en el test de usabilidad realizado para
la validación del portal web.
95