Symfony Parte 5 Rodrigo Miranda [email_address] [email_address] http://www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear Módulos de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Crear  Módulos en aplicación Administrador: </li></ul><ul><li>Vamos a ...
Rodrigo Miranda Blog: www.rodrigomiranda.cl Módulos en aplicación Administrador <ul><li>Podríamos ocupar los siguientes co...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Podemos agregar las siguientes opciones a ese comando . </li></ul><ul>...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Probamos los módulos en las sgtes URLs: </li></ul><ul><li>http://encue...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Si intentas agregar una nueva encuesta verás que Symfony muestra una e...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Si intentamos guardar una nueva encuesta el formulario nos indica que ...
Rodrigo Miranda Blog: www.rodrigomiranda.cl Datos Iniciales, Prueba y de Usuarios
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Aunque hemos creado una estructura de base de datos básica, todas sus ...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Datos iniciales:  Son datos que necesita la aplicación para funcionar....
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando realizas el proceso de construir a mano el schema.yml y posteri...
Rodrigo Miranda Blog: www.rodrigomiranda.cl YAML
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML: </li></ul><ul><li>Formato para serializar datos que es fácil de ...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Nos permite describir los datos como en XML, pero con una sintaxis muc...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML utiliza la tabulación para indicar su estructura, los elementos q...
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML además nos provee de una notación abreviada. Los arreglos simples...
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Sintaxis:
Rodrigo Miranda Blog: www.rodrigomiranda.cl Arreglos Simples :
Rodrigo Miranda Blog: www.rodrigomiranda.cl Arreglos Asociativos :
Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear algunos Datos Iniciales
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Crearemos archivos formato YAML y los guardaremos en el directorio dat...
Rodrigo Miranda Blog: www.rodrigomiranda.cl Organizacion:     Modelo primer_elemento:     Etiqueta nombre único   etique...
Rodrigo Miranda Blog: www.rodrigomiranda.cl TipoEncuesta:  primer_elemento:  etiqueta: Pregunta por Pregunta segundo_eleme...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando una cadena de texto contiene saltos de línea se utiliza el símb...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>El prefijo numérico de cada archivo es opcional, lo que buscamos es co...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Una vez creados los archivos de datos ejecutamos: </li></ul>#./symfony...
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Arquitectura MVC
Rodrigo Miranda Blog: www.rodrigomiranda.cl Antes:
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Organiza el código en base a su función.  </li></ul>MVC (Modelo – Vist...
Rodrigo Miranda Blog: www.rodrigomiranda.cl MVC
Rodrigo Miranda Blog: www.rodrigomiranda.cl El MVC se aloja
Rodrigo Miranda Blog: www.rodrigomiranda.cl Layout
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>En toda aplicación web existe código HTML o PHP que se repite . </li><...
Rodrigo Miranda Blog: www.rodrigomiranda.cl Solución Ineficiente
Rodrigo Miranda Blog: www.rodrigomiranda.cl Opción Eficiente
Rodrigo Miranda Blog: www.rodrigomiranda.cl Parte Importante de un Layout
Rodrigo Miranda Blog: www.rodrigomiranda.cl Hojas de estilos, imágenes y archivos JavaScript
Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/miaplicacion/config/ view.yml
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Un subdirectorio CSS
Rodrigo Miranda Blog: www.rodrigomiranda.cl Agregando atributo media
Rodrigo Miranda Blog: www.rodrigomiranda.cl Acciones
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Se definen como métodos de una clase. </li></ul><ul><li>El nombre de l...
Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/administrador/modules/encuesta/actions/actions.class.php
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Symfony utiliza una convención para deducir el nombre de una plantilla...
Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/administrador/modules/encuesta/templates/ indexSuccess.php
Rodrigo Miranda Blog: www.rodrigomiranda.cl Revisamos códigos
Rodrigo Miranda Blog: www.rodrigomiranda.cl Petición y Respuesta
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando accedes a una página como  encuesta/show/id/1  tú navegador env...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Symfony encapsula la petición en un objeto llamado  sfWebRequest  y la...
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Objeto sfWebRequest </li></ul>
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Métodos sfWebRequest </li></ul>
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Objeto sfWebResponse </li></ul>
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Métodos sfWebResponse </li></ul>
Rodrigo Miranda Blog: www.rodrigomiranda.cl Sistema de Enrutamiento
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl ‘ encuesta/show?id=‘ .$encuesta->getId() encuesta/show/id/1
Rodrigo Miranda Blog: www.rodrigomiranda.cl URI
Rodrigo Miranda Blog: www.rodrigomiranda.cl Configurando Enrutamiento
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Las conversiones entre URI internas y URL externas se define en el arc...
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Personalizando el enrutamiento
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando se modifica la configuración de enrutamiento, los cambios se ap...
Rodrigo Miranda Blog: www.rodrigomiranda.cl URI abreviada
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificaciones al sistema.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Preguntas?
Próxima SlideShare
Cargando en…5
×

Symfony parte 6

1.354 visualizaciones

Publicado el

Estudios de códigos de Symfony. Modelo de Datos, controlador y comenzando la revisión de formularios.

Publicado en: Tecnología
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
1.354
En SlideShare
0
De insertados
0
Número de insertados
10
Acciones
Compartido
0
Descargas
3
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.
  • El nombre único es imprescindible para relacionar objetos entre sí, sin tener que definir claves primarías (que normalmente son valores que se auto-incrementan y por tanto, no se pueden establecer)
  • El sf_content imprime el contenido generado por las acciones.
  • Podríamos tener un config a nivel de proyecto, aplicaciones y modulos.
  • En el código de la plantilla anterior, se emplea una sentencia foreach para recorrer la lista de objetos de tipo encuesta (almacenados en la variable $encuesta_list) y para cada oferta de trabajo, se muestra el valor de todas sus columnas. Para acceder al valor de cada columna, puedes utilizar un método generado automáticamente y que se construye uniendo la palabra get junto con el nombre de la columna en formato camelCase.
  • Métodos de accesos públicos, puedo en las clases de las acciones crear métodos de accesos privados, pero recuerden que provienen de una petición.
  • Métodos de accesos públicos, puedo en las clases de las acciones crear métodos de accesos privados, pero recuerden que provienen de una petición.
  • Métodos de accesos públicos, puedo en las clases de las acciones crear métodos de accesos privados, pero recuerden que provienen de una petición.
  • Métodos de accesos públicos, puedo en las clases de las acciones crear métodos de accesos privados, pero recuerden que provienen de una petición.
  • Cuando accedes a la portada de, la URL es /encuesta, por lo que la primera ruta cuyo patrón coincide con la URL es default_index. En los patrones, cuando una palabra empieza por dos puntos (:) se considera que es una variable, por lo que el patrón /:module significa: cualquier URL que sea una barra / seguida de cualquier contenido. En este ejemplo, la variable module tendrá como valor la palabra encuesta. Después, este valor se puede obtener en la acción mediante $request-&gt;getParameter(&apos;module&apos;). La ruta default_index también define un valor por defecto para la variable llamada action. Por tanto, cuando una URL cumple con el patrón de esta ruta, a la petición se le añade un parámetro llamado action que vale index. Si ahora accedes a la página /job/show/id/1, Symfony detecta que el patrón que se cumple es el de la última ruta /:module/:action/*. En los patrones, un asterisco (*) es equivalente a una sucesión de pares clave/valor separados por barras (/). Por tanto, la URL /job/show/id/1 se intepreta de la siguiente forma:
  • Symfony parte 6

    1. 1. Symfony Parte 5 Rodrigo Miranda [email_address] [email_address] http://www.rodrigomiranda.cl
    2. 2. Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear Módulos de la Aplicación
    3. 3. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Crear Módulos en aplicación Administrador: </li></ul><ul><li>Vamos a generar algunos módulos de la aplicación administrador. Para comenzar, vamos a construir dos: encuesta y grupo-pregunta. </li></ul><ul><li>Nos interesa generar el CRUD de cada uno de ellos; que es el acrónimo de las palabras inglesas “Creation/Retrieval/Update/Deletion (Crear, Obtener, Actualizar y Borrar). </li></ul>
    4. 4. Rodrigo Miranda Blog: www.rodrigomiranda.cl Módulos en aplicación Administrador <ul><li>Podríamos ocupar los siguientes comandos que ya conocemos. </li></ul><ul><li>Los cuales generan módulos llamados encuesta y grupo-pregunta en la aplicación administrador, basados en los modelos Encuesta y GrupoPregunta encontrados en el directorio lib/model del proyecto. </li></ul>#./symfony propel:generate-module administrador encuesta Encuesta #./symfony propel:generate-module administrador grupo-pregunta GrupoPregunta
    5. 5. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Podemos agregar las siguientes opciones a ese comando . </li></ul><ul><li>--with-show: Permite generar una acción y una plantilla específicas para visualizar los datos de un objeto. Esta plantilla solamente permite visualizar los datos, no modificarlos. </li></ul><ul><li>--non-atomic-actions: Dado que el flujo de trabajo de los formulario de este módulo se controla mediante métodos create , edit y update . Podríamos crear un único método que se encargue de estas funcionalidades </li></ul>Módulos en aplicación Administrador
    6. 6. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Probamos los módulos en las sgtes URLs: </li></ul><ul><li>http://encuesta.localhost/administrador_dev.php/encuesta </li></ul><ul><li>http://encuesta.localhost/administrador_dev.php/grupopregunta </li></ul><ul><li>Nota: Los problemas que puedes encontrar ya estás en condiciones de solucionarlos. </li></ul>Módulos en aplicación Administrador
    7. 7. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Si intentas agregar una nueva encuesta verás que Symfony muestra una excepción, ya que no se ha indicado una representación en forma de texto de los objetos referenciados. </li></ul><ul><li>Para solventarlo utiliza el método mágico __toString. En las clases que indica Symfony ( TipoEncuesta y Organizacion ) que se encuentran en lib/model . </li></ul>Módulos en aplicación Administrador
    8. 8. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Si intentamos guardar una nueva encuesta el formulario nos indica que existen campos requeridos que debo llenar. En los campos textos puedo colocar algo de información, pero no puedo hacer lo mismo en los campos tipo Select. Es necesario al parecer tener datos iniciales en el sistema. </li></ul>Módulos en aplicación Administrador
    9. 9. Rodrigo Miranda Blog: www.rodrigomiranda.cl Datos Iniciales, Prueba y de Usuarios
    10. 10. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Aunque hemos creado una estructura de base de datos básica, todas sus tablas están vacías. En cualquier aplicación web siempren existen tres tipos de datos, por lo tanto comenzaremos a solucionarlo. </li></ul>Módulos en aplicación Administrador
    11. 11. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Datos iniciales: Son datos que necesita la aplicación para funcionar. Para este caso, necesitamos nombres de algunas categorías y tipos que son fk en otras tablas. </li></ul><ul><li>Datos de pruebas: Son los datos para probar la aplicación. Los buenos programadores crean pruebas unitarias para asegurar que la aplicación se comporta tal y como se describe en los escenarios. La mejor forma de probar la aplicación consiste en realizar pruebas unitarias automáticas. </li></ul><ul><li>Datos de usuarios: Son los datos reales creados por lo usuarios que utilizan la aplicación. </li></ul>Módulos en aplicación Administrador
    12. 12. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando realizas el proceso de construir a mano el schema.yml y posteriormente desde él generar la estructura de la base de datos, debes considerar que symfony al generar las tablas elimina toda la información en ellas. Sin embargo, como nosotros generamos el schema desde la estructura de la base de datos ya creada, realizando el proceso inverso, no nos preocuparemos ;-) . </li></ul>Módulos en aplicación Administrador
    13. 13. Rodrigo Miranda Blog: www.rodrigomiranda.cl YAML
    14. 14. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML: </li></ul><ul><li>Formato para serializar datos que es fácil de leer por las personas, computadores o máquinas y es compatible con todos los lenguajes de programación . </li></ul>
    15. 15. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Nos permite describir los datos como en XML, pero con una sintaxis mucho más sencilla. Es útil para describir datos que pueden ser transformados en arrays simples y asociativos . </li></ul>
    16. 16. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML utiliza la tabulación para indicar su estructura, los elementos que forman una secuencia utilizan un guión medio y los pares clave/valor de los array asociativos se separan con dos puntos. </li></ul>
    17. 17. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    18. 18. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>YAML además nos provee de una notación abreviada. Los arreglos simples se definen con [ ] y los arreglos asociativos con { } . </li></ul>
    19. 19. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    20. 20. Rodrigo Miranda Blog: www.rodrigomiranda.cl Sintaxis:
    21. 21. Rodrigo Miranda Blog: www.rodrigomiranda.cl Arreglos Simples :
    22. 22. Rodrigo Miranda Blog: www.rodrigomiranda.cl Arreglos Asociativos :
    23. 23. Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear algunos Datos Iniciales
    24. 24. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Crearemos archivos formato YAML y los guardaremos en el directorio data/fixture . </li></ul>
    25. 25. Rodrigo Miranda Blog: www.rodrigomiranda.cl Organizacion:  Modelo primer_elemento:  Etiqueta nombre único etiqueta: Poodu  Columna a llenar segundo_elemento: etiqueta: Conicyt tercer_elemento: etiqueta: Google data/fixtures/010_organizacion.yml
    26. 26. Rodrigo Miranda Blog: www.rodrigomiranda.cl TipoEncuesta: primer_elemento: etiqueta: Pregunta por Pregunta segundo_elemento: etiqueta: Sección por Sección tercer_elemento: etiqueta: Todos en Uno data/fixtures/020_tipoencuesta.yml
    27. 27. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando una cadena de texto contiene saltos de línea se utiliza el símbolo | para indicar que la cadena de texto ocupa varias líneas. </li></ul>
    28. 28. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>El prefijo numérico de cada archivo es opcional, lo que buscamos es controlar el orden en el que se cargan los datos. Y además, por si más adelante creamos archivos que se deben cargar entre medio de dos ya existente . </li></ul>
    29. 29. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Una vez creados los archivos de datos ejecutamos: </li></ul>#./symfony propel:data-load
    30. 30. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    31. 31. Rodrigo Miranda Blog: www.rodrigomiranda.cl Arquitectura MVC
    32. 32. Rodrigo Miranda Blog: www.rodrigomiranda.cl Antes:
    33. 33. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Organiza el código en base a su función. </li></ul>MVC (Modelo – Vista – Controlador)
    34. 34. Rodrigo Miranda Blog: www.rodrigomiranda.cl MVC
    35. 35. Rodrigo Miranda Blog: www.rodrigomiranda.cl El MVC se aloja
    36. 36. Rodrigo Miranda Blog: www.rodrigomiranda.cl Layout
    37. 37. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>En toda aplicación web existe código HTML o PHP que se repite . </li></ul>
    38. 38. Rodrigo Miranda Blog: www.rodrigomiranda.cl Solución Ineficiente
    39. 39. Rodrigo Miranda Blog: www.rodrigomiranda.cl Opción Eficiente
    40. 40. Rodrigo Miranda Blog: www.rodrigomiranda.cl Parte Importante de un Layout
    41. 41. Rodrigo Miranda Blog: www.rodrigomiranda.cl Hojas de estilos, imágenes y archivos JavaScript
    42. 42. Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/miaplicacion/config/ view.yml
    43. 43. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    44. 44. Rodrigo Miranda Blog: www.rodrigomiranda.cl Un subdirectorio CSS
    45. 45. Rodrigo Miranda Blog: www.rodrigomiranda.cl Agregando atributo media
    46. 46. Rodrigo Miranda Blog: www.rodrigomiranda.cl Acciones
    47. 47. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Se definen como métodos de una clase. </li></ul><ul><li>El nombre de la clase que contiene a cada una de las acciones o métodos, comienza con el nombre del módulo seguida por la palabra Actions. </li></ul>Acciones
    48. 48. Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/administrador/modules/encuesta/actions/actions.class.php
    49. 49. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Symfony utiliza una convención para deducir el nombre de una plantilla asociada a cada acción, que consiste en la acción seguida de la palabra Success . </li></ul>Plantilla o templates
    50. 50. Rodrigo Miranda Blog: www.rodrigomiranda.cl apps/administrador/modules/encuesta/templates/ indexSuccess.php
    51. 51. Rodrigo Miranda Blog: www.rodrigomiranda.cl Revisamos códigos
    52. 52. Rodrigo Miranda Blog: www.rodrigomiranda.cl Petición y Respuesta
    53. 53. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando accedes a una página como encuesta/show/id/1 tú navegador envía una petición y el servidor web devuelve una respuesta . </li></ul>Petición y Respuesta
    54. 54. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Symfony encapsula la petición en un objeto llamado sfWebRequest y la respuesta en un objeto sfWebResponse. </li></ul>
    55. 55. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Objeto sfWebRequest </li></ul>
    56. 56. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Métodos sfWebRequest </li></ul>
    57. 57. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    58. 58. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Objeto sfWebResponse </li></ul>
    59. 59. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Métodos sfWebResponse </li></ul>
    60. 60. Rodrigo Miranda Blog: www.rodrigomiranda.cl Sistema de Enrutamiento
    61. 61. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    62. 62. Rodrigo Miranda Blog: www.rodrigomiranda.cl ‘ encuesta/show?id=‘ .$encuesta->getId() encuesta/show/id/1
    63. 63. Rodrigo Miranda Blog: www.rodrigomiranda.cl URI
    64. 64. Rodrigo Miranda Blog: www.rodrigomiranda.cl Configurando Enrutamiento
    65. 65. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Las conversiones entre URI internas y URL externas se define en el archivo de configuración routing.yml dentro del directorio config de las aplicaciones. </li></ul>
    66. 66. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    67. 67. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    68. 68. Rodrigo Miranda Blog: www.rodrigomiranda.cl Personalizando el enrutamiento
    69. 69. Rodrigo Miranda Blog: www.rodrigomiranda.cl
    70. 70. Rodrigo Miranda Blog: www.rodrigomiranda.cl <ul><li>Cuando se modifica la configuración de enrutamiento, los cambios se aplican instantáneamente en el entorno de desarrollo. Para el entorno de producción es necesario borrar las caché. </li></ul>
    71. 71. Rodrigo Miranda Blog: www.rodrigomiranda.cl URI abreviada
    72. 72. Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificaciones al sistema.
    73. 73. Rodrigo Miranda Blog: www.rodrigomiranda.cl Preguntas?

    ×