 Bueno, vamos a dar inicio a esta charla. Originalmente, esta sesión fue propuesta como Ska Folding Model Generator, pero en el inter de que propusimos la charla y llegó la fecha del Drupalcon, muchas cosas cambiaron en el proyecto, no ha ido evolucionando más allá de una herramienta de generación de código. Entonces, creemos que un nombre más acorde a la charla sería algo como acelerando el proceso de desarrollo para Drupal 8 utilizando Drupal Console. Drupal Console es el nombre de un proyecto, el proyecto del cual vamos a platicar hoy. Bueno, entonces, probablemente algunos de ustedes han empezado a, bueno, han trabajado con Drupal 8 o con Symfony, van a haber algunos conceptos de Symfony en Drupal 8 y cómo es que se relacionan acerca de nosotros. Vamos a hablar un poquito acerca de nosotros. Yo soy David Flores, trabajo en Indaba, en la Ciudad de México. Estas son mis cuentas de GitHub y los repositorios en donde pueden seguir algunas de las cosas que estoy trabajando mi cuenta de Twitter y también otra cosa que hacemos aparte de hacer código, a veces hablamos en un podcast que se llama Drup Podcast. Entonces, los podcast son en español y tratamos de invitar a personas que están alrededor de Drupal o que tienen algo que ver con Drupal, no necesariamente que hagan de, desarrollen el CMS o que hagan el CMS. Sí, saben de alguien, te gustaría que los invitarlos, que invitaramos, nos hacen llegar, por ejemplo, mandar un mensaje a la cuenta de Twitter y con todo gusto lo invitamos. Bueno, mi nombre es Jesús Manuel Olivas. Yo trabajo para Bling Reaction y como pueden ver, también están ahí mis links, mi blog en el cual trato de escribir ocasionalmente a mi cuenta de GitHub, donde pueden ver algo del código que tengo y mi cuenta de Twitter es jmolivas y también junto con David por una parte del Drup Podcast. Entonces, ¿lo pueden encontrar en jmolivas o en Drup Podcast en Twitter? Bueno, pesamos. ¿Qué es el Drupal Console? Lo que es la consola, como lo conocemos en español. Algunos de ustedes ya, tal vez, empezaron a explorar Drupal 8 y para los que no lo han hecho, les mencionaremos en esta charla que hay muchas cosas y muchos conceptos nuevos que tendrán que conocer para poder trabajar con Drupal 8. Creemos que Drupal 8 es un poco más avanzado técnicamente que sus predecesores porque escribir un módulo en Drupal 8 es más complicado. Claro, y aparte de todos estos conceptos que tienen que aprender, no solo les van a servir en el mundo Drupal, sino también les van a servir en cualquier otra parte. No ya sea haciendo Sinfon y Laravel o haciendo Rails o Django. Los conceptos son totalmente los mismos y pueden aplicarlos en cualquier lado. ¿Qué hace un poco más complicado Drupal 8? Técnicamente que versiones anteriores es que para generar un módulo envuelve muchísimo código boilerplate o código... No encontramos en español código base o código inicial para empezar a... para poder agregar lógica de negocio. Empezar un módulo en Drupal 8 requiere mucho trabajo manual y muchas tareas repetitivas las cuales tenemos que hacer múltiples ocasiones. Entonces, esto brinda oportunidades de errores. El proyecto nace tomando un componente de Sinfonix llamado Console el cual ya brinda una interfaz en modo console, en modo CLI el cual nos permite hacer preguntas, nos permite interactuar con el usuario de manera muy sencilla. Entonces nosotros decidimos si Drupal 8 estaba tomando ventaja de otros componentes de Sinfonix nosotros decidimos como tomar ventaja a la hora de escribir comandos a la hora de hacer generación de código que era nuestro principal objetivo. Tomamos la consola y la integramos con Drupal. Sí, como comentaba prácticamente este proyecto toma ventaja del componente de Sinfonix para generar o para interactuar con nuestra integración de Drupal 8. Podríamos decir que la consola es una nueva adicional probably found elsewhere. Si recuerdan que los conceptos de not invented here o el síndrome ni la idea es dejar atrás todo esas prácticas del síndrome ni o not invented here y tomar ventaja de componentes que existen. Entonces la consola permite eso. El proyecto permite eso. Y esta herramienta genera el código que uno no necesita como inicialmente era. Gracias a este a que la consola ya está script ya tiene muchas contribuciones ya tiene mucha funcionalidad agregada nos permite desarrollar más rápido en la consola desarrollar nuevos comandos nuevas generadoras, nuevas integraciones de una manera más sencilla y solo nos estamos enfocando en desarrollar lo que nos va a ser útil para Drupal 8 vamos desarrollando consola simplemente estamos tomando ventaja de estamos aplicando el desarrollo de tus aplicaciones no tus herramientas Ok, bueno, ¿Quién empezó esto? Inicialmente vimos nosotros dos Jesús y yo iniciamos más o menos a platicar por ahí de Agosto ahora ya tenemos dos personas más que nos están aportando a mantener todo este código haciendo nuevas ideas, nuevos comandos Uno está aquí presente con nosotros Omar El otro está en Londres No pudo venir Bueno, como comentó David lo iniciamos nosotros dos nos está ayudando Omar, pero ustedes podrían culpar a esta persona del proyecto Haciendo un poco de historia Me encanta conocer esta historia El proyecto fue concebido en Drupal Camp Costa Rica en el 2013 en septiembre mientras David presente y yo platicamos con Larry Garfield acerca de Drupal 8 de los componentes que venían y en un momento Larry mencionó alguien debería aportar el componente de la consola a Symphony y eso fue el momento en que decidimos bueno, podemos hacer esto Y para todo esto ya llevábamos unos dos meses, tres meses platicando de que lo deberíamos hacer de que estábamos explorando Drupal 8 es complicado estar reescribiendo y reescribiendo y reescribiendo la misma tarea fue donde nos dimos cuenta que podría ser una herramienta muy útil Si, inició como un pet project podríamos decirlo, un site project el cual utilizamos para aprender Drupal 8 Y a partir de ahí, gente se interesaba el proyecto, hemos tenido gente que contribuye y bueno, en fin Hablando de, ya les comentamos un poco de qué es el proyecto, pero ustedes podrían pensar ¿Por qué? ¿Por qué podría importarme? La clásica gráfica que mostramos a las nuevas personas que están en Drupal, para que se espanten y piensen dos veces si quieren aprender este CMS Y como todos sabemos, Drupal es un poco más complejo que otros CMS Pero en Drupal 8 no solamente es más complejo que otros CMS sino es más complejo que versiones anteriores Esta es la gráfica de la curva de aprendizaje de Drupal 8 Si ustedes ya sabían programar en módulos en Drupal 7 Llega a Drupal 8 y volvemos a empezar de cero todos ¿Y qué? ¿Por qué razón volvemos a empezar de cero? ¿Qué es lo que hace a Drupal 8 más complejo técnicamente que otras versiones? La inserción de nuevos conceptos en Drupal 8 ha hecho que el código también sea más complejo, nosotros tenemos ahora más capacidades para conectar a Drupal los sistemas para poder extender Drupal aún todavía más que lo que ya lo hacemos ahora ¿Por esta razón es más complejo? Y hay muchos conceptos nuevos que están fuera del scope de Drupal como tales No es que Drupal haga más sinfonia, haga más complejo a Drupal 8 sino vamos a ver nuevos componentes o nuevas conceptos como namespaces, services no queremos comentar más para nosotros controladores, anotaciones y eso es lo que hace un poco más complejo ¿Por qué otra razón es por la que es más complejo Drupal 8? Porque tenemos que escribir más código que en versiones anteriores por ejemplo para escribir una simple página que lee dos argumentos del URL toma un servicio o dos servicios del contener de servicios necesitamos siete líneas de código para registrar la ruta y cincuenta y cinco líneas de código para generar la clase del controlador bueno no parece tanto pero qué tal si queremos generar una entidad si alguien ha intentado generar una entidad de contenido por ejemplo en Drupal 7 hay que hacer un montón de hooks aquí tenemos que hacer todos cuentos, catorce archivos tenemos que generar catorce archivos actualizar rutas, hacer un montón de cosas para que nuestra entidad esté disponible Catorce archivos y cientos de líneas de código tenemos un problema en cómo lo podemos solucionar cómo el proyecto podría ayudarnos ¿Qué es lo que hace el console? ahora es de paso una vez que usted la instala tenemos varios generadores ya disponibles ustedes pueden extenderlos también pueden crear los propios ya el código que genera ya es compatible con el estándar de auto loading que utiliza Drupal 8 el pcr4 también ya registra algunos archivos de configuraciones, algunas rutas que están escritos en archivos y ml ya están disponibles para ustedes registra servicios registra por ejemplo si queremos crear un controlador y utilizar un servicio del contenido de servicio se encarga de tomar ese servicio e inyectarlo en nuestro controlador como lo comentamos se encarga de las tareas repetitivas y tal vez aburridas y que pueden generar un margen de error claro y no es lo que nos interesa cuando estamos desarrollando un producto cuando estamos desarrollando un módulo nos interesa preocuparnos de dónde vivía el namespace de dónde estaba la clase, no importa eso lo que nos preocupa es completar la lógica que de verdad es lo difícil y como inicialmente mencionabamos el proyecto nació como un generador de módulos pero en el transcurso del desarrollo del mismo ocupamos interactuar con Drupal necesitamos revisar si la ruta que recién registrabamos fue correctamente registrada si el servicio que estábamos tratando de generar se registró realmente el proyecto podríamos decir que se dividen dos categorías o dos grupos los generadores de código y comandos que interactúan con la instalación de Drupal en este caso tenemos comandos que listan configuraciones comandos que interactúan con la instalación de Drupal ya sea revisar el estatus de algunos servicios de rutas y los comandos que generan código vertientes de comandos y posiblemente esto vaya a cambiar un poco en el transcurso de los a raíz de la charla de CMI que al final comentaron no existe una herramienta para mover contenidos de una instalación de Drupal a otra platicamos un poco que tal vez podría ser un buen feature para la herramienta mover contenidos de una instancia de Drupal hacia otra entonces si en algún momento saben de algún feature que podría ser interesante y quién se beneficiaría de utilizar una herramienta como esta como les comentamos al principio nosotros creamos esta herramienta para aprender Drupal 8 para saber qué estaba pasando para escribir un comando hay que saber qué es lo que va a generar entonces teníamos que entender cada una de las piezas que estábamos poniendo en los generadores permita interromperte y desafortunadamente la documentación no estaba al día la documentación estaba al día en el código y esa era la documentación entonces como inicialmente fue una herramienta concebida para aprender pues la gente que hace training la gente que da consultoría de cómo desarrollar para Drupal 8 esta herramienta podría ser muy útil porque podría enseñar fácilmente el código necesario el esqueleto necesario para comenzar a desarrollar un módulo la gente por ejemplo obviamente los desarrolladores porque pueden crear sus módulos con tributos de una manera más rápida y las agencias porque pueden reducir el tiempo de desarrollo de sus proyectos hablando un poquito de qué hace la herramienta existen algunos proyectos similares encontrarán un proyecto que se llama Model Builder el cual genera el scaffolding de módulos en ese momento ya lo hace un poco para Drupal 8 tiene algunas cosas que ya genera para Drupal 8 principalmente estaba en Drupal 7 y creo que también genera algunas cosas para Drupal 6 cuando nosotros iniciamos el proyecto ya existía una herramienta de generación de código estaba Skittenbash entonces por ahí está el link pero es un poco difícil contribuir a un proyecto que está Skittenbash existe otro proyecto que se llama Drupal Model Upgrader el cual te permite actualizar o migrar tu módulo de Drupal 7 a Drupal 8 no genera código desde cero a base de un proyecto Drupal 7 lo convierte a Drupal 8 existe otra herramienta que nos encontramos hace poco es un generador para Drupal 8 igual es escrito en el componente de Symphony pero genera módulos para Drupal 6, 7 y 8 si no me equivoco para Drupal 8 genera muy pocas cosas para Drupal 7 me parece que sí tiene bastante scaffolding, bastante escaletos ahí ya están disponibles bueno, la diferencia con algunos otros proyectos que les acabamos de mencionar una de ellas es que nosotros estamos utilizando programación orientada de objetos estamos aprovechando todos los componentes ya proveídos por Symphony y por otros proyectos si ustedes tienen curiosidad de los paquetes que estamos utilizando pueden ir al repositorio y ahí revisarlos y otra razón algo que hace muy diferentes proyectos es que no tenemos ningún plan de soportar versiones anteriores de Drupal bueno entonces estos son los links en donde ustedes pueden encontrar el proyecto tenemos una landing page Drupal console.com en donde normalmente estamos actualizando los comandos que hay y los comandos que están disponibles para la consola si quieren contribuir el proyecto está claro si no tienen una cuenta de Drupal un usuario de Drupal tenemos el proyecto en Drupal.org y si no tienen una cuenta en Drupal si son usuarios de github también lo pueden encontrar en github pueden hacer pull request y ahí le damos seguimiento al código que estamos escribiendo y por ambos los enlaces y otra cosa es la documentación tenemos una documentación que es un working process no es un proyecto terminado se está colisando constantemente lo pueden encontrar compartimos el enlace y también si tienen alguna duda con el proyecto pueden entrar al chat utilizamos una herramienta que se llama Gitter para el chat para la interacción sientas y libres de hacer preguntas vamos a hablar un poquito existen tres maneras de hacerlo la primera es utilizando el instalador no vamos a explicar en los instrucciones porque vamos a mostrar un video de cómo es que funciona la primera es el instalador la segunda podríamos utilizar Composer y la tercera podría ser manualmente cuál es la que nosotros le recomendamos nosotros le recomendamos que utilicen el instalador ya que el instalador hace un chequeo de su sistema y si les falta algo ahí se los dice vamos a ver un video de cómo es que funciona el instalador si quieres explicarlo por favor claro estamos utilizando un instalador de PHP entonces necesitan tener activa PHP el CLI simplemente correr ese comando PURP funciona el Linux y en Mac si alguien usa Windows nosotros no usamos Windows y no le hemos probado en Windows a donde llegue el soporte para si alguien utiliza Windows y quiere hacer la prueba favorita de contactarnos en cualquier momento y lo probaremos una vez que lo una vez que termine este proceso tenemos un binario el cual ya podemos ejecutar ya sea como PHP nombre del binario o dándole los permisos de ejecución de Unix otra opción es mover o querer si queremos ejecutar la consola desde cualquier parte de nuestro sistema lo que podemos hacer es moverlo moverlo a un directorio de binarios como userlocalbin o userbin en donde esté disponible en su pack para que no tengan que estar bajándolo en cada una de las instalaciones de Drupal 8 que tenga sería como hacer una instalación global del proyecto una vez que lo tenemos instalado o perdón una vez que lo tenemos instalado como es que vamos a actualizar regular hacemos releases constantemente entonces es necesario actualizar el proyecto tenemos creado un comando para actualizar el proyecto solamente es tan sencillo como ejecutar el comando es súper útil porque constantemente estamos agregando funcionalidades nuevas o corrigiendo errores de los comandos ya existentes tenemos un problema porque tratamos de tener sincronizado la consola hasta la versión beta más reciente de Drupal 8 es la 6 pero en ese transcurso cuando salga la 7 seguramente se van a romper otras cosas que hay que volver a arreglar entonces si corren este comando self update con esto ya ustedes automáticamente tienen descargar la siguiente versión es muy sencillo pero qué comandos tenemos disponibles tenemos un listado de comandos no lo vamos a mencionar todos mencionaremos que podemos generar controladores entidades de contenido entidades de configuración si quieren usar sus propios recursos para hacer un API desde aquí los pueden generar formas de configuración generar servicios incluso tenemos un comando que genera comandos ustedes quieren agregar un comando hacer una integración en su módulo tenemos un comando que genera comandos vamos a ver cómo es que funcionan algunos de ellos vamos a pasar al más básico para ver cómo genera un módulo la manera de generarlo es ejecutando por ejemplo estamos haciendo un listado de los módulos tenemos una astria el Drupal Generate Módulo en este caso Drupal es un alias que pueden llamar como ustedes quieran nos empieza surga la interacción nos pregunta el nombre del módulo el paten que lo queremos poner cuál es la descripción que le queremos asignar al módulo el paquete preguntas al final nos preguntan si queremos confirmar pero si queremos confirmar la generación nos da un reporte de los archivos que ha generado en este caso vamos a ver el contenido de los mismos en este caso el paso siguiente vamos a instalar el módulo vamos a generar un módulo que se llama example utilizamos el comando módulo instal para habilitarlo y nos vamos a ir al sitio como se van a cuenta todos los comandos son así de sencillos interactivos van haciendo preguntas las cuales ustedes simplemente van respondiendo con el nombre, con la descripción, con el pat con los atributos que quieran agregar si es el caso de que sea un formulario una entidad es muy sencillo seguir un comando en futuras versiones planeamos tener un poquito más de información acerca de qué es lo que está preguntando si es el nombre de un controlador tal vez decir qué es un controlador exacto, estamos planeando una versión con un un code un code output, verbose code output en este caso podemos ver que el módulo ha sido habilitado y genera dos archivos genera un archivo yamo que es el que hace que el módulo sea descubierto por grupo al ocho y genera un el punto módulo cual solamente tenemos el hub help implementado vamos a ver cómo es que lucen el código que hemos generado es el archivo linfo punto yamo y este es el punto módulo ¿Cómo genera un módulo? Generate módulo ¿Qué otro comando tenemos? ¿Cómo genera un servicio? otro de los conceptos 2 que van a encontrar mucho en Drupal 8 es servicios, este comando les permite generar un servicio, lo que estamos haciendo es haciendo un listado de los servicios registrados de nuestra instalación de Drupal le vamos a pasar un pipe grab para que nos diga al final el buscar el servicio que hemos generado nos pregunta el nombre del módulo en el cual se va a poner ese servicio y nos empieza a preguntar los datos que necesitan para registrar el servicio incluso nos permite agregar servicios que ya existen, pre existentes en el container de servicios o en la instalación de Drupal al nuevo servicio que estamos agregando, una vez que confirmamos la generación vemos nuevamente que nos ha generado dos archivos un archivo services punto yamo en el cual se hace el registro del servicio y una clase una clase de PHP la cual contiene la definición del módulo podemos ver el archivo de yamo que es el registro del servicio si se dan cuenta ya se hace los imports, hace los use de todas las clases que necesitamos si la clase necesita extender si necesita hacer alguna otra cosa ya nos genera también ahora vamos a confirmar que el servicio que hemos creado realmente ha sido registrado en nuestra instalación de Drupal sabemos que se llama Example, lo hacemos un container de bug para listar los servicios nos damos cuenta que no está, tenemos que hacer que hacer un catch si teníamos problemas con el cache en versiones anteriores de Drupal aquí hay muchos más cachés entonces antes de que culpen a alguien culpen el cache primero y podemos ver que el servicio ha sido registrado exitosamente ponemos el nombre del servicio y la clase a la cual ha sido registrada como servicio ok, siguiente comando hablaros un poquito de cómo generar un controlador de la misma manera que el comando del servicio nos pregunta por el módulo donde se va a crear este controlador todo va a ser dentro de modo examples y nos empieza a hacer preguntas acerca de cómo se va a llamar nuestro controlador si queremos generar una clase base de test unitario para esta clase nos permite nos permite también inyectar servicios es la tercera, la cuarta pregunta y también nos permite agregar pads para que se creen rutas en Drupal que apunten a este controlador en este caso se ha creado una ruta que responde ante un argumento del url lo va a leer y lo va a mostrar en el controlador podemos ver que en el controlador lo lee como argumento vamos a ver cómo es que luce esto no, ya no para esto no no siempre solo para los controladores los formos todavía podemos ver el url ejecutándose leyendo el parámetro Drupal y mostrando vamos a generar otro controlador vamos a demostrar que la ruta que hemos creado existe en el sistema utilizamos el comando router debug nos muestra que la nueva ruta ha sido registrada y ese es el pad al cual va a responder podemos ver la definición de la ruta utilizando el argumento de la ruta este comando también sirve mucho para aprender si ustedes van alguna url dentro de su instalación de Drupal y quieren hacer algo como lo que están viendo en pantalla la manera más sencilla de descubrir qué código está generando un form multistep o una view lo que ustedes quieran hacer sería ir al url buscar la url que están mirando y ver qué clase está resolviendo ese código vamos a generar un controlador nuevo y en este controlador vamos a reutilizar el servicio que hemos creado se agregó un método nuevo al servicio el cual solo toma un id y nos muestra el título de ese nodo agregamos una ruta definimos la ruta en la ruta podemos definir placeholders que van a hacer los argumentos que vamos a leer del url en este caso se llama nid nos pregunta si queremos generar un test vamos a decir que no para que sea menos verbosa la salida queremos consumir un servicio confirmamos la generación y podemos ver el resultado nuevamente vamos a ver cómo es que luce el código que se ha generado como comentaba David el momento en que se agrega un servicio del conteneror de servicios el proyecto console se encarga de definir exactamente la clase si la clase necesita extender o implementar otra clase podemos ver el código perfectamente generado se encarga de agregar todos los uses statements se encarga de extraer el conteneror de servicios pasarse al constructor y setearlo en una propiedad de scope de la clase como podemos ver lo único que tenemos que hacer acá es llamar nuestro servicio vamos a ver el resultado de la generación del comando la salida por defecto es que tenemos que implementar un método un método con el siguiente parámetro el parámetro nid lo único que vamos a hacer es regresar a nuestra clase controlador y inyectar un poco de código este código se encarga dentro del servicio hemos desacoplado la lógica de extraer el título del node y simplemente utilizando un servicio podemos traer el título de un node vamos a hablar un poquito de un comando bastante interesante generar una forma de configuración este comando nos permite de manera de pregunta agregar todos los fields que vamos a necesitar nos pide igual que el controlador nos pide el nombre del formulario nos pregunta que si queremos generar una estructura en la cual nosotros podemos ir escribiendo cada uno de los campos que va a tener nuestro formulario decirle label del tipo de campo que va a ser y nos permite agregar tantos como queramos en este caso vamos a agregar creo que es evento, nombre de evento y la fecha para mostrar un campo de tipo date podemos seleccionar los campos, los tipos de campo moviendo las flechas y vamos a agregar un último no se si se logró apreciar a la hora de cada vez que pide el nombre del módulo tiene un autocomplete entonces nosotros podemos, si nos acordamos como se llama nuestro módulo podemos hacer como autocomplete a la hora de estar escribiendo el nombre de nuestro módulo y los tipos de campo por ejemplo podemos ver que se ha generado registrado la ruta, la ruta apunta hacia una clase, que es el form vamos a reconstruir las rutas para que la nueva ruta sea registrada en nuestra instalación de Drupal y podemos ver como cargamos la forma y es exactamente los fields que hemos definido este comando lo que nos hizo también fue darnos la opción de que cualquier cosa que guardemos desde que mostró la forma ya está en un archivo de configuración gml ya está guardado, ya no tienen que hacer nada bueno lo que tendría que hacer sería validar los impuls pero agregamos el método para validarlo pero agregamos el método donde tienen que poner sus validaciones vamos a ver como lucen un poquito el código de esto no creo que no bueno en fin, como comentaba este código se encarga para guardar en el configuración management entonces vamos a ver, vamos a generar otra cosa que generamos, que vamos a utilizar mucho en Drupal 8 es un plugin block el tratamiento es el mismo utilizamos el comando necesario pregunto el nombre del módulo el nombre de la clase una de las características interesantes de los blogs ahora es que podemos agregar incluso formularios a nuestros blogs vamos a generar una estructura de form agregamos los campos con sus tipos de campos y vamos a ver como una vez que se ha generado el código podemos ver como los valores que introducimos en nuestro form con nuestro formulario relacionado al bloque se van a desplegar al momento de asignar el bloque en una región entonces un reporte de lo que ha sucedido en el código del plugin y como lo comentábamos, se encarga de agregar los uses, encender la clase de crear la clase en el directorio correcto de agregar el name space adecuado definir todos los métodos que necesitan implementar para que esto funcione también algo que creo que no hemos comentado es si dan cuenta ahorita que regresa a la parte del código la cantidad de directorios que se han creado en tres comandos que hemos ejecutado entonces se eliminaron los divs del markup pero por cada div eliminado hay una carpeta nueva y volvemos a reconstruir el cache una vez que hemos reconstruido el cache podemos ver que, y hacer un reload de nuestra página podemos ver que tenemos el bloque que hemos creado vamos entonces a capturar algunos campos a guardar nuestro bloque y asignarlo en una región lo cual por lo que no, es una extraña no lo hicimos en la primera ventana sino en la segunda y una vez que vemos que salva esto podemos ver como refrescamos nuestro homepage y vamos a ver, podemos ver el bloque con los valores que hemos introducido Groupalcón y Elamio nosotros como nos comentábamos, como lo comentábamos tenemos también generadores fresh pero no vamos a hablar en este momento de ellos Omar se va a encargar de hablar de ellos en su charla la cual es a las 3.45 y pueden ver el enlace uno de los comandos que más genera código es la entidad de contenido vamos a ver cómo es que sucede es uno de los comandos que tienen menor interacción y que genera más código nombre del módulo el nombre de nuestra entidad el nombre de la entidad y boom list 14 archivos 100 de líneas de código archivos de templates clases páginas y mls actualizados rutas agregadas en el configuración de las rutas vamos a ver un poco de las clases que ha generado por ejemplo, vamos a empezar a navegar en el director de stores podemos ver una increíble cantidad de directores y archivos la definición de la entidad luce algo como esto utilizando anotaciones definimos que es un plugin de tipo entidad la base en infinidad de clases ver donde definición esta clase extiende otra clase implementa otra clase podemos ver incluso métodos para hacer un crud vamos a ver cómo es que funciona esto esta es la ruta que nos ha generado y desafortunadamente cuando generamos una entidad de contenido tenemos que hacer algo si ya es un módulo que ya está instalado bueno actualmente lo que vamos a hacer es desinstalar el módulo y instalarlo nuevamente para que se registre esta nueva entidad es interesante buscar una manera más práctica de hacerlo y agregarlo en el proyecto desinstalado el módulo y al hacer un refresh en la ruta del navegador podemos ver cómo va a aparecer un listado del nuevo tipo de entidad no existe ninguna vamos a capturar alguna nos permite ver un listado de las entidades que se han agregado podemos por ejemplo ver el listado si queremos modificarla también podemos hacerlo directamente lo que vamos a hacer ahora es esta entidad y la configuramos de una manera que podemos agregar campos vamos a hacer la sección de manage fields y vamos a utilizar la parte de usuario para agregar un nuevo campo campo sencillo de tipo texto y una vez que agregamos esto vamos a agregar una nueva entidad y ver la integración que tiene Combuse al agregar esta entidad hemos agregado la parte de integración Combuse y podemos ver cómo vamos a generar una nueva view a la hora de generar todo este código es que no estamos generando ninguna lógica simplemente estamos generando la base por ahí tuvimos una una persona nos estaba comentando que los generadores de código eran muy malos que a veces metían código necesario pero en realidad no estamos generando lógica ni código que no vayan a utilizar simplemente es como un template, una base de la cual ustedes van a partir para poder escribir toda su lógica y me gustaría mencionar incluso en el desarrollo hay momentos en que no está actualizada la documentación y llegamos a actualizarla también ha sido parte del proceso de aprendizaje como podemos ver nuevamente mi integración con views pero sí como lo comentaba genera solamente el código base o scaffolding o los blueprints o como lo quieran llamar para que ustedes a partir de ese código generado puedan agregar la lógica del módulo que están generando vamos a ver vamos a salvar esta vista no vamos a hacer nada mas que simplemente mostrar que los datos que hemos introducido en nuestra entidad hemos hablado solamente de comandos que generan contenido pero que otros tipos de comandos tenemos comentamos las interacciones con a la hora de estar generando de estar generando nuevo código de estar generando un módulo necesitan interacciones como por ejemplo ver si la ruta ya está definida si lo instalamos lo desinstalamos por ejemplo también hay procesos para migraciones comandos que nos sirven para correr las migraciones desde la consola todos estos tipos de comandos han ido surgiendo por necesidad de interacción entonces si ustedes empiezan a utilizar la consola y se les ocurre algún comando nuevo que les permita no se mover algo en views mover algo en cualquier parte de Drupal puede escribirnos para platicar acerca de integración algo un modo muy práctico a la hora de estar trabajando, de estar desarrollando es el modo interactivo el modo interactivo nos permite simplemente ya nada ejecutar los comandos podrán ver? nos habían preguntado por una integración de drosh entonces nosotros para poder de una manera muy fácil utilizar drosh sin tener que salir del proyecto creamos nuestro propio comando que se llama drosh que ejecuta drosh entonces ustedes pueden estar generando código y si hay alguna tarea que no pueda hacer la consola pueden ejecutarlo directamente desde aquí existe un issue para generar una integración con drosh de drosh con la consola, el issue está en el proyecto si alguien lo que quiere hacer sienta se libra a hacerlo entonces ya podríamos ejecutar con drosh y luego nuevamente con drosh sin salirnos del mismo scope de la misma línea de flujo de trabajo desde ahí podemos ejecutar los dos quedó mal ese video bueno al final ya hemos visto el config de bug desde ahí vamos a cambiarlo al subirlo este video lo que suponía que tendría que hacer es mostrarnos la configuración que está en el sistema y podríamos ver un detalle de esa configuración por ejemplo nos va a instar todas las configuraciones todas las configuraciones registradas en nuestra instalación de Drupal y nos muestra los valores que están asignados en esa configuración una vez que lo subamos y compartamos el enlace existe otros nuevos comandos que se han agregado como interacción con módulos que nos permiten de cierta manera habilitar módulos o deshabilitar módulos lo que vamos a hacer en este momento es habilitar un módulo que es una web profiler este proyecto ya tiene una integración con la consola este módulo es un módulo contribuido de una persona que está en italia vamos a habilitar el módulo para que ustedes puedan ver que una vez que habitamos este módulo van a aparecer comandos nuevos hemos descargado el módulo aparece el módulo en el directorio con trip bueno aparece el directorio con trip y el módulo descargado una vez que tenemos esto vamos a correr grupo solamente para listar los comandos como podemos ver los últimos dos grupos es rest y router una vez que habilitemos el módulo web profiler vamos a detectar que aparecen nuevos comandos entonces si ustedes tienen una integración y agregan comandos en su módulo el proyecto consola se va a encargar automáticamente de detectarlos y ponerlos disponibles en su instancia de grupo lo que vamos a hacer ahora es movernos a la instancia de grupo hacer un refresh hemos visto que no pasa nada desafortunadamente tenemos que volver a hacer qué David primero reconstruir el caché hay mucho refresh y dos o tres refresh si que tenemos para limpiar el caché tenemos diferentes opciones de caché este caso vamos a seleccionar all que es como el cco y nuevamente vamos a ver utilizar un comando que se llama list que no nos muestra nada lo que vamos a hacer es nuevamente regresar a nuestra instancia de grupo hacer dos o tres refresh darnos cuenta que algo ha fallado que nos ha mostrado un mensaje de error un refresh y se ha abierto al módulo este módulo provee un componente que nos muestra toda la información que pasa en el desde que ustedes cargan una página lo que se llama en el ciclo de vida del HTTP desde que hacen un request hasta que hacen un response nuestra aplicación otra cosa que nos permite es nos lista todas las sentencias SQL que se ejecutaron al listar esa página entonces si tenemos varios videos, varios bloques ahí nos van a salir las sentencias que se fueron ejecutando para hacer un list, miramos dos nuevos registros en el web profiler lo que vamos a hacer aquí es correr un benchmark vamos a golpear nuestro sitio por 50 iteraciones podemos ver que hay un progress bar lo que va a suceder es que lo que va a hacer este benchmark es cargar nuestro sitio 50 veces y una vez que haya hecho eso vamos a hacer un listado nuevamente de web profiler list vamos a ver como han sido todas las iteraciones se completa el 100% vamos a mostrar un resultado con valores relacionados al status de estos requests y una vez que hemos terminado eso vamos a correr el list para ver que tal si queremos ver más podemos cambiar el limit podemos ver incluso este comando tiene benchmark list y export vamos a mostrarles por este momento pero te permite exportar la información que ha sido registrada en el web profiler con esa información que pueden exportar pueden detectar donde está un cuello de botella o donde está una sentencia SQL que es muy lenta o alguna otra falla a la hora de cargar una página es el mismo como nos comentábamos, si ustedes quieren contribuir o crear un comando para su módulo, hemos creado un comando que se llama generate command que lo que haces otra vez está en el link básicamente lo que haces es generar un comando una clase de comando la cual es una simple clase de PHP la cual nosotros podemos agregar la lógica necesaria hemos mostrado algunos de los comandos de lo que tenemos pero nos interesa que contribuyan y como pueden contribuir existen diferentes maneras de contribuir una es escribiendo una integración como ya lo comentamos la otra es escribiendo documentación de la consola, tenemos un repositorio en GitHub en donde vamos abriendo secciones o vamos alimentando las secciones que ya tenemos de documentación acerca de cómo se escribe un comando cómo utilizar la consola cómo instalar y también obviamente aportando en el código de la consola si ustedes empiezan a probar el código y detectan que hay algún error que hay algún estándar que nos está cumpliendo que falta documentación en alguna en algún cacho de código que estamos generando fácilmente pueden contribuir desde GitHub o desde Drupal.org pueden contribuir con el código pueden contribuir con documentación y pueden contribuir con las traducciones un feature que se desarrolló en este lapso de que propusimos la sesión a que llegara el Drupal.com de Bogotá puede traducir todos los mensajes y cada una de la ayuda de cada comando como podrán ustedes detectar tenemos un enlace en el cual no necesitan un ID para contribuir no necesitan saber cómo escribir código simplemente son archivos de texto llamamos los cuales hay que traducir otra manera de ayudarnos es hablando de la consola utilizando Twitter ha sido una mención a Drupal.com y hablando por ejemplo del proyecto, dándonos información tal vez les gustó o no les gustó qué cambiarían ¿Cómo contribuir? Tenemos algunos requerimientos tenemos Instangit, Composer, Bogotá y Drupal.8 vámonos rápidamente con esto la manera que para contribuir es hacer un fork clonándolo y ocurriendo Composer tienen una instalación de desarrollo en su máquina vamos hablando de la gente de contribuciones la parte más importante de este proyecto la gente que ha contribuido podrán ver quienes son los que han contribuido acá algunos reconocerán algunos de los que tenemos acá en esta página y queremos decirles que si evitarlos a contribuir vamos a estar en los durante los sprints pueden, si ustedes quieren contribuir y no saben cómo simplemente hacer, busquenos preguntenos cómo es que hacerlo y estaremos intercambiando commits por calcabonías tanto el Drupalcast como de la consola y hablamos un poquito de ¿qué es lo que sigue con la consola? El roadmap como comentaba David estamos tratando de mantenernos en sincronía con los releases beta, RC en su momento y algunos otros otra de las tareas es mejorar las traducciones, actualizar la documentación detectar errores arreglarlos, hacer merge los full requests de los que están contribuyendo y hacer una salida más del código más verbosa ¿no sé la palabra en español? ¿correctos? más amplia, muy similar a lo que ustedes pueden ver en el modo de examples con links hacia la app o hacia información de la documentación para saber qué es lo que está generando el código y por último si teníamos tiempo para preguntas bueno, yo quería agregar una cosa en la slide anterior normalmente casi el que será un 50% 70% son latinos de habla hispana y la consola no está en español solo hay unas cuantas traducciones entonces por ahí podríamos empezar en estos sprints y uno de más siéntate libres de interrumpirnos de stalkearnos durante el duro palcón si nos den caminando por el pasillo tienen alguna pregunta con toda confianza y también pueden buscarnos en nuestras cuentas de twitter y comparto el enlace el enlace de la presentación y actualizaremos justo en este momento para mostrar los dos vídeos que hace falta preguntas hay un micrófono para las preguntas creo que es esto, ¿no? creo que están grabando Hola, gracias, yo a todos preguntas ¿por qué no les hizo sentido migrar la lógica en negocios desde duro palcíete desde módulos de duro palcíete a módulos de duro palocho y la segunda pregunta es por qué nos integraron con dos la pregunta obliga ¿que lo hacía? utilizando prácticas similares Si, pasar la lógica de un módulo de duro palcíete a duro palocho y hay un módulo que ya lo están haciendo otra es que no no hay una similitud tal cual los conceptos siguen siendo los mismos es un blog, es un video pero a nivel código no hay similitud entonces no he revisado completamente el código que está haciendo el módulo grader pero hay muchas cosas que se van a quedar como incompletas o van a pasarlos a hooks que van a ser que ya están deprecating en duro palocho entonces la mejor manera de portar su módulo es escribiéndolo bien en duro palocho y eso les va a ayudar para futuras versiones y por qué no drash la base de nuestro proyecto es como lo comentamos utilizar componentes de terceros librerías de terceros no inventar nuestras herramientas sino hacer una aplicación y como lo comentamos patrón orientado a objetos estamos utilizando twig o sea, todo el código que ustedes ven generado en todos esos archivos PHP lo hizo twig entonces, si son frontend podrían hasta ayudarnos a escribir twig y ayudarnos es la razón principal bueno la pregunta es vi que utilizaron algunos comandos que son, por ejemplo, clear cache y por ejemplo, install model o uninstall model entonces, esas son implementaciones propias de su console o estado usando drash no tiene ninguna dependencia con drash ah, ok y bueno, la otra pregunta es cuando ustedes están generando un contenido un contenido de x formato, por ejemplo, trae una forma y trae ciertos ciertos campos y un blog eso, esa generación es posible hacerla a través de la interfaz de usuario, de cómo es cuál sería la ventaja de hacerlo desde su console si ya existe algo visual la rapidez los campos que estamos agregando un formulario no son los campos de un nodo sino son campos de un formulario donde tú vas a guardar la configuración de tu módulo entonces, tú generas un form en donde tu módulo va a preguntar por el username de twitter es un campo donde el usuario ponga el username de twitter, entonces, los formularios que vimos son formularios de configuraciones no son formularios para dar de alta contenido creo que otra de las razones es que es mucho más rápido hacerlo desde la interfaz por ejemplo, que escribirlo ya sea directamente en código que hacer, por ejemplo, login a tu instancia de instalación gracias una otra pregunta o no entendieron nada tal vez muchas gracias bueno, Ana Ana viendo los comandos que ustedes utilizan utilizan mucho esa aproximación de que sea como una especie de tutorial, digamos así ustedes preguntan y no van respondiendo hay alguna manera de volarse eso es decir, o sea, yo tengo todas las respuestas y hacer un script larguísimo que yo quiera de pronto duplicar mañana simplemente correr y no tener que estar escribiendo nuevamente si, claro, existen los comandos corren de dos maneras el modo interactivo que es el más educativo, como lo acabas de mencionar lo va preguntando y también existe la opción inline si ustedes ya saben todas las respuestas de lo que les va a preguntar el nombre de caja tú puedes hacerle un help al comando ponerle, por ejemplo, generate controller menos, menos name menos, menos class, menos, menos tal todo puedes hacer inline con un enter lo generas todo que hemos pensado, que incluso hay un itch en el proyecto es, tenemos, como tenemos un archivo de configuración local en nuestro home, home directory es agregar una estructura en un archivo de llamo donde nosotros podamos setear algunos valores por defecto por ejemplo, si algún parámetro tú en inline no te acordaste como se llamaba y simplemente diste enter te faltó en el parámetro en los parámetros te lo pregunta nada más te pregunta por ese el que te faltó y ya te lo genera cuando el monitor funciona existe este parámetro si, lo brinca, no existe entonces te pregunto por ese valor solo que al final como comentar es su luz de una manera más educativa mostrarlo de esta manera alguna otra pregunta, última tenemos tiempo todavía hi when you generate a controller decision ask if you want to create a test file de what if you want to create a test file right unit test we say no yes but it's possible to create a do integration with pick up a unit or other tool of a unit test at this point it generates a unit test file we've been discusing about generating beehad or PHP spec so far Drupal is using unit test PHP unit and beehad we're happy to add that that feature looks like we're open to do that we're actually open to a pull request or a patch yes but Drupal models after that don't integration with MySQL possibly it's possible yeah it's possible to add that functionality thank you feel free to tenemos tiempo vamos a cortar pero os quiero preguntar una vez que hemos terminado gracias gracias si si lo que pasa al final es que nosotros nos vemos en vivo entonces yo llegué a México antes de irnos como 3, 4, 3 y a mi hijo donde vive no estamos no, tienen que hacer videos entonces