patternlab

Emulsify Drupal | Storybook

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Ya que tenemos arrancando y funcionando, todo lo que vamos a necesitar, para comenzar con nuestra implementación usando diseño de patrones, empezaremos por realizar los primeros cambios que marcarán el estilo y apariencia de nuestra web. Para ello, realizaremos la exploración de los archivos del Storybook o guía de estilos, para ir conociendo las opciones disponibles y sacar el mayor provecho de ello.

     Paso 1 - Definición de la paleta de colores:

        El primer lugar donde comienza nuestro viaje hacia la personalización de nuestra guía de estilos, será la definicición de la paleta de colores que vamos a utilizar en nuestra web. Para ellos tendremos que abrir varios archivos, que iremos explicando paso a paso.

        Si abrimos nuestra guía de estilos, encontraremos la Paleta de colrores, dentro del menú Colors, tal y como muestro en la siguiente imagen, desde aquí podremos comprobar en tiempo real, cada uno de los cambios que realicemos relacionados con este apartado.

Story book Emulsify | www.drupaladicto.com - Consultor especializado en drupal y symfony

      Ahora que ya tenemos claro, dónde comprobaremos los cambios aplicados, abriremos el primero de los archivos de configuración, relacionados con esta parte, que encontraremos, dentro de "NUESTRO-THEME-PERSONALIZADO/components/00-base/01-colors/_00-colors-vars.scss". Se trata de un archivo, en formato SASS, donde se definen todos los colores, utilizando variables.

     Una vez entiendas el concepto, será fácil comenzar a aplicar los cambios, aunque no tengas conocimientos previos de SASS, ya que al ejecutar el comando para arrancar la guía de estilos (npm run develop), ésta se encargará de realizar las compilaciones para que todo se vea de acuerdo a lo que se ha definido.

Story book Emulsify | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Vamos a realizar una rápida comprobación de que todo funciona correctamente, y de que no tendremos que ejecutar comando de SASS, para ver los resultados inmediatamente; en la última línea del archivo encontraremos la variable "$blue: #005de0;", vamos a cambiar el código del color por el de uno completamente diferente ($blue: #ff6600;) y guardaremos los cambios, sin hacer nada más, a continuación, volveremos a la guía de estilos y veremos de inmediato el cambio, en el color llamado PRIMARY.

Story book Emulsify | www.drupaladicto.com - Consultor especializado en drupal y symfony

     El otro de los archivos, relacionado con la paleta de colores, ubicado justo debajo el anterior, es el llamado _01-colors-used.scss, si lo abrimos, veremos que existen dos variables principales, que definen dos Perfiles de color ($defaultColors y $darkColors), para nuestra instalación, que se mostrarán en función del navegador, el modo default se muestra para todos navegadores en general y el modo Dark, sólo en aquellos navegadores que soporten este tipo de presentación, como los dispositivos MAC. 

     Dentro de cada uno de estos perfiles, están todas las variables que se encuentran definidas en el anterior archivo, con el nombre que se muestra dentro de la paleta. Esta es una de las razones por las cuales al realizar el cambio código de color en el archivo de variables, se aplica automáticamente al resto de archivos relacionados.

     Esto quiere decir, que además de los colores existentes, podremos agregar nuestros nombres personalizados y asignarles las variables que hayamos definido en otro archivo para poder emplearlas al momento de aplicar nuestros estilos.

Story book Emulsify | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Aplicando lo colores dentro de nuestra hoja de estilos

      Durante el proceso de creación de nuestro proyecto, puede que en algún caso necesitemos utilizar, alguno de estos colores, en un elemento en concreto, para que el color se aplique correctamente, en lugar de llamar a la variable de forma directa, tendremos que emplear la función clr(), de esta foma, mantendremos el concepto de "centralizar" y obtendremos mejores resultados al utlizar el diseño de patrones.

     El siguiente código, muestra la forma en que se aplica el color a los enlaces del menú principal, dentro del archivo _00-main-menu.scss, ubicado en "NUESTRO-THEME-PERSONALIZADO/components/02-molecules/menus/main-menu/ _00-main-menu.scss.

&--open {
  background-color: clr(background);
  display: block;
  left: 0;
  overflow-y: scroll;
  position: absolute;
  top: 134px;
  right: 0;
  width: 100%;
}

     Configuración de los nombres de los colores en el Storybook

         Por último, pero no menos importante, está el archivo donde se definen los nombres de los colores que se muestran dentro de nuestra guía de estilos, se trata del archivo colors.yml. Podremos comprobarlo, si cambiamos el nombre de cualquiera de los colores y, sin hacer nada más que guardarlo, abrimos la guía de estilos.

Story book Emulsify | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una vez tengamos configurada correctamente la paleta de colores, todos los cambios relacionados con esta parte, estarán centralizadas, fáciles de modificar, y además, dichos cambios se aplicarán autormáticamente, a través de todo el proyecto Drupal.

Emulsify Drupal | Patrones, componentes y vistas

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Llegados a este punto, ya tenemos al menos los conocimientos básicos, sobre el diseño de patrones o atómico, también conocido como "Pattern Labs", además de haber realizado, un pequeño recorrido por la estructura de archivos de la guía de estilos o storybook, que nos generó la instalación del módulo Emulsify y de nuestro tema personalizado, dentro del proyecto Drupal 9, con el cual estamos trabajando en este curso.

     Es el turno de comenzar a aplicar este diseño de patrones, dentro de una de las plantillas Twig de Drupal 9, para entender mejor las posibilidades ofrecidas, por esta nueva forma de trabajo, cuyo fin principal, además de permitir que los diseñadores puedan trabajar paralelamente con los programadores, sin previos conocimientos sobre Drupal, ni dependencias entre ellos; la posibilidad de "Centralizar" y "Reutilizar" al máximo todos los componentes, disminuyendo así el tiempo de implementación, en todas sus fases.

     Aplicando Pattern Labs en las plantillas Drupal 9

          Paso 1 - Activación del modo Debug o Depurador de Drupal:

             Ya que el diseño de patrones, implica la modificación de las plantillas que vienen por defecto en Drupal, lo primero que deberíamos hacer antes de comenzar con esto, será activar el modo debug o depurador, para conocer el nombre de cada pantilla, de acuerdo con los nodos, campos o vistas que estemos modificando. Existen dos meneras de hacerlo:

            Opción 1: Consiste en renombrar el archivo default.services.yml, ubicado dentro de la carpeta /web/sites/default, y a continuación cambir los valores de debug y cache, como se muestra en la imagen.

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

           Opción 2: Configurando el archivo settings.local, tal y como te explico en Configuración desarrollo local Drupal 8 Haz clic aquí.

     Una vez hayas activado el modo depurador, ejecutarás los comandos drush cr y drush updb, para borrar la caché de drupal y actualizar la base de datos. Entonces al hacer clic en la tecla F12 o seleccionar la opción explorar del navegador, verás los nombres sugeridos por drupal para las plantillas, como te muestro en la siguiente imagen.

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

         Paso 2 - Explorar plantillas por defecto generadas por Emulsify

             Como ya hemos mencionado antes, uno de los propósitos del Diseño de patrones es reutilizar siempre que podamos, por esta razón, cuando se genera el Tema personalizado, Emulsify crea varias pantillas Twig, que nos pueden servir, tanto como guia para entender la manera en que trabaja o como base para generar plantillas más complejas.

            Si abrimos la carpeta Templates, veremos varias de ellas, clasificadas por su tipo, esta estrucutra nos facilita la ubicación y nos marca la guia de trabajo que deberíamos mantener durante nuestro desarrollo.

        Paso 3 - Explorar nuestros contenidos y opciones a implementar

           Es muy importante tener claro que nuestra mentalidad debe ser "NO REINVENTEMOS LA RUEDA", esto significa, que deberíamo evaluar constantemente, a medida que vayamos avanzando en nuestro proyecto, para saber si es necesario crear un nuevo componente o simplemente reutilizar uno que ya esté listo.

          Por ejemplo, si vamos a la carpeta llamada VIEWS, econtraremos dentro la plantilla para una Vista del tipo lista sin formato, con el nombre views-view-unformatted--frontpage.html.twig, esto significa que si en nuestra página principal pensamos tener un listado de artículos, productos o de imágenes, sólo tendríamos que crear una vista del tipo correspodiente y obtendríamos un resultado al instante.

         En la siguiente imagen, he generado algunos artículos, utilizando el módulo Devel y sin hacer nada más, como por defecto, los artículos vienen configurados para mostrarse en la página principal del sitio, obtuve lo que te muestro a continuación:

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

         Si abrimos la plantilla por dentro, encontraremos el siguiente código...

{% embed "@organisms/grid/grid.twig" with {
  grid_type: 'card',
  grid_label: title
} %}
  {% block grid_content %}
    {% for row in rows %}
      {{ row.content }}
    {% endfor %}
  {% endblock %}
{% endembed %}

          Eplicación: 

          Lo primero que vemos aquí es la inclusión o importación del modelo o patrón para este tipo de vista, en este caso a través de embed en lugar de include, a continuación se definen el tipo de patrón para los contenidos que se mostrará dentro del las cuadrículas, usando CARD, y el campo título de la vista.

         Si vamos a la documentación de la Página Oficial de Symfony, podremos leer la siguiente explicación:

" La etiqueta incrustada combina el comportamiento de incluir y extender. Le permite incluir el contenido de otra plantilla, al igual que lo hace include. Pero también le permite anular cualquier bloque definido dentro de la plantilla incluida, como cuando se extiende una plantilla.

Piense en una plantilla incrustada como un "esqueleto de micro diseño ".

          En la siguiente parte del patrón de diseño, se define un bloque, dentro del cual estará contenida la vista completa, por eso verás que al final están las etiquetas de cierre correspondientes al cierre del bloque y al cierre del embed declarado al principio.

Emulsify Drupal | Generando tema base

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     IMPORTANTE: Emulsify nos permite crear un BASE THEME a partir de Emulsify NO un Subtheme     

     Si eres de l@s que estás interesad@ en aprender a implementar, las utilizar tendencias en maquetación y diseño web, este es uno de los principales módulos que deberías considerar conocer, ya que te ayudará, en caso de que quieras darle un Giro de 360º a tus proyectos en Drupal, utilizando los componentes y el conocido como Diseño Atómico. Si quieres aprender más sobre esta tendencia revolucionaria, tienes el curso Introducción a Pattern Lab y Drupal 9 usando Emulsify.

     Emulsify Drupal, según su página oficial, "es una herramienta de código abierto para crear sistemas de diseño con componentes reutilizables y pautas claras para los equipos. Emulsify ayuda a las organizaciones a escalar su diseño al tiempo que reduce los costos, agiliza los flujos de trabajo y mejora la accesibilidad".

     A diferencia de otros themes contribuidos de Drupal, su instalación supone varias diferencias con respecto al resto. Su propósito fundamental, es ofrecernos todo lo que vayamos a necesitar para crear un Base Theme para Drupal, utilizando componentes. 

     Por esta razón, he creado esta guía paso a paso, de la instalación del módulo, desde su Página oficial 

     Prerrequisitos:

   Instalación del módulo Emulsify Drupal para Drupal 9

       Ya que desde la página de Drupal han anunciado hace tiempo, que el final del soporte tanto para Druapl 7 como para Drupal 8, terminará previsiblemente, a finales de este mismo año 2021, he decidido enfocarme en la instalación para Drupal 9, pero puedes seguir la guía con los cambios para otras versiones que están en la misma página.

     Paso 1 - Descarga del módulo usando composer

        A estas alturas, ya debes estar totalmente familiarizado con la instalación de módulos y themes en Drupal, utilizando el gestor de paquetes Composer, que nos facilitará enormemente las tareas de descarga o actualización de nuestros proyetos.

        Así que, nos colocaremos en la carpeta raíz del proyecto y en este caso, el comando a utilizar será el siguiente:

composer require emulsify-ds/emulsify-drupal

     Paso 2 - Preparación para generar el Tema Base

       Aquí es donde comienzan las diferncias, con respecto a otras instalaciones, como por ejemplo la del módulo Bootstrap, en este caso, al descargar el módulo se ha creado la carpeta contrib, dentro de la carpeta themes y dentro podremos ver todos los archivos relacionados con Emulsify, a continuación, nos moveremos hacia dicha carpeta, para poder generar un base theme que heredará todas las características y funcionalidades necesarias. O sea, que escribiremos en consola lo siguiente para movernos hasta la carpeta del theme padre:

cd web/themes/contrib/emulsify-drupal

   Paso 3 - Generar el Tema base

     Una vez colocados dentro de la carpeta del Theme padre, podremos ejecutar el siguiente código, para que se autogeneren todos los archivos relacionados con nuestro nuevo Tema base o personalizado:

php emulsify.php "THEME NAME"

    Si quieres conocer alguna otras opciones puedes ejecutar también el comando:

php emulsify.php -h

   Paso 4 - Descargar las dependencias del Base Theme

     Como he mencionado al principio, esta instalación rompe con lo que estábamos acostumbrados, esto significa, que tendremos que colocarnos dentro de la carpeta de nuestro nuevo_base_theme, que acabamos de generar, para poder comenzar con la descarga del resto de dependencias que hace tan pontente este tipo de instalación:

cd ../../custom/base_theme_name/

    Paso 5 - Instalación de dependencias para el Base Theme

     Este proceso suele tardar algo más de lo habitual, ya que tendrá que descargar un considerable número de archivos, destinados a facilitarnos la vida de aquí en adelante, por lo que no deberías inmpacientarnos. En mi caso en particular, tuve que abrir una segunda pestaña en mi consola, para asegurarme de que no se había quedado bloqueada la descarga, podemos usar cualquiera de las siguientes opciones:

yarn
npm install

 

Emulsify Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Paso 6 Construcción del Tema base

     Ya que tenemos descargardo, todo lo que vamos a necesitar para comenzar con nuestra implementación, nos toca construir la estructura, antes de poder utilizarlos en nuestro proyecto, también tenemos dos opciones a elegir:

yarn build
npm run build

 

Emulsify Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Paso 7 - Habilitar el base theme y sus dependencias

     Como ya tenemos todo a punto y listo para comenzar, nos toca activar el theme y sus dependencias, para ello utilizaremos la herramienta Drush, además tendremos que movernos a la carpeta principal para poder ejecutar el comando, fíjate que en lugar de utlizar en se emplea then, que es el comando correcto a partir de las versiones de drush =>9:

drush then base_theme_name -y && drush en components emulsify_twig -y

   Paso 8 - Activación del Tema Base

     Ahora sí, ya podemos activar nuestro theme para comenzar a soltar nuestra imaginación y creatividad, para ello, volveremos a utlizar la herramienta Drush:

drush config-set system.theme default base_theme_name -y

 

Emulsify Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

  Comprobación

    Si nos vamos a la página principal de nuestro proyecto, ahora podremos ver el cambio en la estructura y diseño para comenzar con esta nueva aventura...

Emulsify Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Arrancando la Guía de Estilos

     Si todo funciona correctamente, podremos arrancar nuestra guía de estilos, para comenzar a trabajar con el diseño, en paralelo con el desarrollo de nuesro proyecto Drupal, ejecutando el siguiente comando desde dentro de la carpeta de nuestro tema personalizado

npm run develop

Patternlab en Drupal | Metología BEM

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

       Uno de los cambios más significativos, al utilizar Emulsify y Pattern Lab en nuestros desarrollos, con respecto todo lo conocido hasta ahora, en cualquier proyecto de Drupal, es la implementación de la Metodología BEM, que afecta a todas las plantillas y componentes que vayamos creando a medida que generamos nuestra estructura.

     El objetivo principal de esta metodología, es simplificar al máximo, tanto la estructura de cada componente, como la gestión de sus clases y estilos, dentro de nuestros archivos css, facilitando de esta forma, el mantenimiento y comprensión de todas las posibles variantes o transformaciones de color, tamaño, dimensiones, etc., sobre cualquiera de los elementos de nuestro proyecto. 

     En la siguiente imagen, a pesar de que se trata de un proyecto Drupal 9, con un diseño a medida, creado a partir de un Subtheme personalizado con Bootstrap Barrio, puedes apreciar la intrincada estructura de <DIV></DIV>, que se ha generado, para que poder llegar hasta el elemento Botón.

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

   ¿Qué cambios implica la metodología BEM?

      El concepto principal es simplificar cualquier estructura en tres partes fundamentalmente, que son el Bloque, el Elemento y los Modificadores. Esto permitirá dividir todo en componentes más fáciles de reutilizar y mantener.

     La metodología BEM, propone la siguiente forma para nombrar nuestros componentes:

     class="nombrebloque": Para identificar el elemento padre o div principal.

     class="nombrebloque--elemento": Se añaden dos guiones bajos para el nombre del elemento, es decir, aquello que esté contenido dentro del bloque

     class="nombrebloque--elemento-modificador": Esta nueva clase, permitirá introducir la variaciones, por ejemplo, de color, tamaño, etc, para un elemento que se comparte dentro de varios componentes. 

     En la siguiente imagen, sacada desde su página oficial, nos explican una propuesta de implementacíon, en el caso de configurar un componente ATOM, del tipo botón. El nombre del Bloque, en este caso sería la clase button, que cómo puedes ver está presente al pricipio, en los tres elemementos.

     El Elemento, sería la clase button--state, que hace a la posibilidad de añadir una característica específica, a medida que vayamos utilizando dicho componente y por último está el Modificador de esta clase, que añade un dichas variaciones al estado del botón, button--state-danger. Presta atención a la nomemclatura en cada uno de los casos, para que tengas claro, a qué se refiere cada uno de ellos.    

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Si quieres conocer más sobre la Metodología BEM, visita su Página Oficial.

   ¿Cómo aplicar BEM con Emulsify en Drupal 9?

       En el caso de Drupal, al implentar Emulsify, en algunos casos, los guiones medios son sustituidos por guiones bajos, y como utilizaremos SASS, ya que es compatible con Emulsify, podremos aplicar estilos de manera muy simplificada.

       Ya que tenemos instalado y arrancado nuestra guía de estilos Storybook, que explicamos en el capítulo Emulsify Drupal, podremos echar un vistazo al componente BOTON, dentro de la carpeta de componentes ATOMS:

 

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora, vamos a utilizar nuestro IDE para explorar y explicar un poco, la implementación de BEM que nos propone Emulsify, en este proyecto desarrollado con Drupal 9, para ello navegaremos hasta la carpeta dentro de /themes/custom/MISUBTHEME/components/01-atoms/buttons y a continuación abriremos el archivo button.twig, donde veremos lo siguiente:

{#
/**
 * Available variables:
 * - button_content - the content of the button (typically text)
 *
 * Available blocks:
 * - button_content - used to replace the content of the button with something other than text
 *   for example: to insert an icon
 */
#}

{% set button_base_class = button_base_class|default('button') %}

{% set additional_attributes = {
  class: bem(button_base_class, button_modifiers, button_blockname),
} %}

<button {{ add_attributes(additional_attributes) }}>
  {% block button_content %}
    {{ button_content }}
  {% endblock %}
</button>

 

   Explicación:

{% set button_base_class = button_base_class|default('button') %}

     Lo primero que podemos observar es la declaración una variable, cuyo valor es el nombre del Bloque, en este caso será la clase button_base_class, una vez importemos este bloque dentro de nuestras plantillas de Drupal, podremos asignarle un valor dinámico, dependiendo de las necesidades para nuestro proyecto, la forma de realizar este paso lo explicaremos en detalle más adelante.

{% set additional_attributes = { 
  class: bem(button_base_class, button_modifiers, button_blockname),
} %}

     En esta línea, en el caso específico del botón, se están definiendo las clases que generarán, de forma dinámica, los nombres equivalentes, para el Bloque, Elemento y el Modificador, respectivamente, concatenando la clase button_base_class y añadiendo los guiones correspondientes; esto quiere decir, que si explorarmos el código en el navegador, verás que se han generado, el nombre del Bloque, y luego, con dos guiones, en el caso del Elemento y uno el el caso del Modificador.

     Quizás el botón, al ser una de las estructuras más simples, no te permite ver todo lo que genera Drupal automáticamente, pero si exploras la molécula, llamada Main, encargada de generar la plantilla de ejemplo para el menú principal, en el navegardor, verás un claro ejemplo de todo. donde la clase toggle-expand es el nombre del bloque, toggle-expand__open, es el nombre del elemento y si quisiéramos aplicar un cambio de color, toggle-expand__open_red

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

  Añadiendo las clases personalizadas en nuestros componentes en Drupal

    Una vez hayamos declarado las variables, podremos añadir valores personalizados, dinámicamente en nuestros componentes, mediante la funcionalidad de Twig para agregar atributos.

    Si te fijas en el nombre que está entre los paréntesis, podrás comprobar que es el mismo que se declara al principio, en la variable, por lo que podrás pasar como parámetros los nuevos valores, para cada uno de estos "atributos adicionales" y adaptarlos a las necesidades específicas del proyecto.

<button {{ add_attributes(additional_attributes) }}>

   En la siguiente imagen, podrás ver cómo se puede alterar uno de los valores, declarados en un componente, que en este caso está dentro de otro, llamado CARD y cuál es el resultado final, al explorar el código generado en el navegador:

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

Patternlab en Drupal | Prerrequisitos

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     IMPORTANTE: Emulsify nos permite crear un THEME a partir de Emulsify NO un Subtheme     

     Desde la aparición de Pattern Lab y su adaptación para poder implementarlo con Drupal 8, se han ido realizando un gran número de cambios, tanto en la estructura de todos los módulos relacionados, especialmente Emulsify Drupal, como en la manera de activar y utilizar comandos, librerías y el código dentro de las plantillas, que permiten conectar nuestro diseño con el proyecto.

     En este capítulo trataré de abarcar todos los prerrequisitos, que necesitarás conocer, antes de comenzar a trabajar de lleno con Pattern Lab y Emulsify en Drupal 9. Y que tengas la información más actual relacionada, ya que en el momento en que escribo este artículo, si visitas la Página Oficial de Emulsify, y ves sus videos, te darás cuenta, de que no están actualizados desde su lanzamiento en 2016, a pesar de que casi todo ha sido modificado para adaptarlo a Drupal 9 y posteriores.

   Novedades y Prerrequisitos en Pattern Lab para Drupal 9

     El módulo Pattern Lab no es compatible para Drupal 9

        La primera noticia es bastante impactante, ya que los primeros cuatro videos, que están publicados en la Página Oficial de Emulsify, en el apartado de Videos y tutoriales, nos muestran las pantallas y algunos comandos y ejemplos, implementando el módulo Pattern Lab, compatible con Drupal 8, pero que ha sido totalmente sustituido por el nuevo módulo Emulsify Drupal, cuya instalación ya tienes disponible dentro de este curso y que nos permite generar un Theme basado en Emulsify, no un Subtheme, como estábamos acostumbrados.

     Las Páginas de referencia para Twig ya no son de Sensiolbas sino de Symfony

        Esto también es bastante importante, ya que lo enlaces que aparecen en casi todos los videos relacionados con Pattern Lab y Drupal, nos llevan a los enlaces de la documentación de la empresa Sensiolabs, que ahora ya están bajo el dominio de Symfony. Por lo tanto, si quieres aprender sobre el uso de las funcionalidades como include, embed o extends de Twig deberías visitarte la Página Oficial de Synfony para Twigs

     La compatibilidad con Drush ha cambiado

        Como todo evoluciona, también es el turno de actualizarnos, con respecto a los comandos drush de los videos, relacionados con la instalación y ejecución de Emulsify Drupal, el cambio más importante es que el comando yarn start o npm start, que nos permitía arrancar nuestra Guía de estilos, ha sido cambiado por el siguiente comando:

npm run storybook
yarn develop
npm run develop

 

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Nuevos módulos para trabajar con las plantillas Twig y Emulsify

     Otro de los cambios más importantes en esta evolución, sobre la implementación de Pattern Lab en Drupal 9, es la creación de varios módulos, que nos facilitarán la compatibilidad entre las plantillas y el código, y que al principio teníamos que instalar desde el repositorio github de four kichen, a continuación te añado el enlace a las páginas de cada uno de ellos:

  • Components! El módulo Componentes facilita que un tema organice sus componentes. Permite que los temas (y módulos) registren los espacios de nombres de Twig y proporciona algunas funciones y filtros adicionales de Twig para usar en las plantillas de Drupal.

  • Twig Attributes Twig Attributes permite a los desarrolladores establecer atributos HTML (como clases o una identificación) en una plantilla Twig principal a elementos en una plantilla secundaria, eliminando la necesidad de crear una anulación de plantilla o implementar un enlace de preproceso solo para agregar un atributo.

  • Emulsify Twig Este módulo proporciona dos extensiones Twig utilizadas en el Emulsify Design System.

  • Twig Field Value Twig Field Value permite a los usuarios de Drupal 8 obtener datos parciales de matrices de renderizado de campo.

  • Twig Typography Este módulo proporciona un filtro Twig que integra la biblioteca PHP Typography y la aplica a cadenas.

  • Twig Render This Este módulo le permite representar campos y entidades en sus plantillas Twig.

  • More Global Variables Este es un pequeño módulo que brinda a los usuarios algunas variables globales que luego pueden imprimirse en cualquier plantilla de ramitas.

  • Twig Tweak Twig Tweak es un pequeño módulo que proporciona una extensión Twig con algunas funciones y filtros útiles que pueden mejorar la experiencia de desarrollo.

  • BEM Un tema base de Drupal obstinado que proporciona clases de estilo BEM en todas partes.

  • Devel Que nos servirá para depurar nombres de las variables

  • Devel Kint Extras Los complementos de Kint responsables de mostrar los métodos disponibles de los objetos y las propiedades de las clases estáticas se eliminaron del módulo Devel para Drupal 8 desde la versión 3.0. Este módulo vuelve a agregar esas características como un módulo externo.

  • kint-php/kint: Añade funcionalidades a Devel y se instala con composer "composer require kint-php/kint"

 

     Requisitos de instalación implementación Guia o Storybook en Drupal 9

        Como ya sabrás, esta clase de implementación está pensada para que los diseñadores y desarrolladores puedan trabajar en paralelo, por lo tanto, una vez esté funcionando el Drupal9 y se haya generado el Theme basdo en Emulsify, podremos acceder a la guía de diseño con el comando mencionado al principio e instalar y configurar algunas herramientas para comenzar a diseñar.

      El Preprocesador de CSS Sass

      Node Version Manager

   Errores con Twig

     En toda implementación existe la posibilidad de encontrarnos con algunos errores, uno de ellos es el uso del include en las plantillas Twig. Te dejo el enlace al issue reportado en la Página de Drupal https://www.drupal.org/project/drupal/issues/2817553

Atomic Desing | ¿Qué es el Diseño Atómico?

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     En el desarrollo de páginas web, existen múltiples escenarios y posibilidades, que nos permiten especializarnos en determinadas herramientas o procedimientos, de acuerdo con nuestras destrezas y/o formación. De ahí que, es cada vez más habitual, encontrar algunos profesionales, que aunque inicialmente se habían formado o especializado en el Diseño Gráfico, hayan decidido experimentar o reinventarse, dedicándose a la maquetación web o Diseño Frontend, como se conoce hoy en día.

     Uno de los problemas más frecuentes, al inicio de esta nueva experiencia, es la rapidez con la que puede cambiar, todo lo relacionado con la apariencia y funcionalidades de la web, ya que intervienen factores como la experiencia de usuiaro (UX), la velocidad de respuesta de la web al conectarse al servidor, o la posilidad de adaptarse a múltiples dispositivos.

     De ahí que resulte casi imposible, mantenerse al día en una herramienta específica o procedimiento, pensado para facilitar o mejorar el diseño Frontend, ya que constantemente se efectúan cambios y mejoras, que nos pueden crear una sensación de frustración, a pesar de que hayan pasado a penas, un par de años desde que aprendimos, por ejemplo, un framework como angular, react, vue.js, next, nuxt o cualquier otro.

     Por suerte, hace ya varios años, a un señor de nombre Brad Frost, se le ocurrió una idea revolucionaria, que todavía se aplica a día de hoy, y que nos facilitará mantener el ritmo de evolución, acorde con cualquier herramienta o procedimiento relacionado con la maquetación o Frontend. Se trata de la metodología llamada Diseño Atómico o Atomic Design, cuyo propósito fundamental es, según sus propias palabras:

"Atomic Design detalla todo lo que se necesita para crear y mantener sistemas de diseño sólidos, lo que le permite implementar interfaces de usuario más consistentes y de mayor calidad más rápido que nunca. " 

     ¿Qué es el Diseño Atómico?

        En resumen, el objetivo de esta metodología es establecer una jerarquía, que nos permita analizar y dividir,  nuestros proyectos web, en varios elementos y/o estructuras, comenzando por el más sencillo, al que llamaremos átomo, ejemplo un icono, hasta ir al más complejo que sería la unión de todos en un Sistema, ejemplo una página completa.

       La siguiente imagen muestra de forma más gráfica el conjunto de fases, o elementos que forman esta metodología:

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Nuestro proyecto web es un proyecto de piezas Lego

        Todos conocemos el famoso juego para niños, conocido como Lego, formado por varias piezas que permiten crear, prácticamente toda clase de estructuras complejas, a partir de la unión de éstas. Si comparamos el juego con un proyecto web en este caso, podríamos entender, más fácilmente, de qué se trata esta metodología y lo mucho que puede aportarnos ante cualquier reto de desarrollo.

        A continuación te cuento en qué consiste cada una de las "Piezas" con las que deberíamos trabajar a partir de ahora, para sacar el mayor provecho de este nuevo enfoque. 

        Recuerda que esto es sólo una guía, para simplificar la categorización de tu proyecto, no obstante, puedes añadir tanto como necesites de acuerdo a tus propias necesidades de análisis y estructura.

      Atomo

         Son aquellos elementos más pequeños o con una jerarquía menor. Un átomo es aquel elemento que por sí mismo no significa nada y necesitará ser acompañado por otros átomos para tener sentido. Un ejemplo de un átomo podría ser un título, un texto, un área, un icono, una línea. El átomo debe ser nombrado, definido y acotado con márgenes para conocer cómo se comporta al ser juntado con otros átomos y no crear una lucha entre ellos.

     Moléculas

        Cuando dos o más átomos se juntan, crean moléculas. Las moléculas es el mínimo elemento que empieza a poder ser usado de manera aislada. Una molécula ofrece información suficiente como para guiar una acción dentro de la interfaz. Se debe evitar sobrecargar la molécula de átomos. Éstas son secciones en nuestra interfaz una cabecera, un footer, un post, etcétera. Como ocurre con los átomos, la molécula debe ser definida y acotada de nuevo para poder saber como se comporta en convivencia con sus semejantes.

    Organismos

        Formados por dos o mas moléculas, los organismos forman una sección o parte de nuestro producto. Los organismos ofrecen una experiencia completa al usuario. En productos digitales sencillos como una web, organismos serían todas aquellas páginas (homecontactabout, etc.) que la forman.

     Sistema

        El sistema, por lo tanto, sería el todo. La web, aplicación, software o cualquier producto digital que estemos construyendo.

     Aplicado a un entorno web, en la siguiente imagen podrás ver la diferencia entre átomo y molécula, en el caso de un carrusel de imágenes, que a su vez, forma parte de un organismo mayor, que sería la página Home o principal del proyecto.

Curso Pattern Lab Drupal 9 | www.drupaladicto.com - Consultor especializado en drupal y symfony

     El diseño atómico es una metodología compuesta por cinco etapas distintas que trabajan juntas para crear sistemas de diseño de interfaces de una manera más deliberada y jerárquica. Las cinco etapas del diseño atómico son:

  1. Átomos
  2. Moléculas
  3. Organismos
  4. Plantillas
  5. Paginas

     El diseño atómico no es un proceso lineal , sino un modelo mental que nos ayuda a pensar en nuestras interfaces de usuario como un todo cohesivo y una colección de partes al mismo tiempo . Cada una de las cinco etapas juega un papel clave en la jerarquía de nuestros sistemas de diseño de interfaces. Vamos a sumergirnos en cada etapa con un poco más de detalle.

     Si a partir de ahora, en cada nuevo proyecto o renovación de algún proyecto existene, aplicamos y manteneos este tipo de organización de elementos en nuestro trabajo de diseño, ahorraremos esfuerzo y malentendidos entre nuestro diseño y el departamento de programación. Además, facilitará su trabajo, haciendo que puedan visualizar y traducir el diseño a código de una manera más directa.

     Si quieres aprende más sobre el Diseño Atómico visita la Web Oficial de su creador

 

PatterLab en Drupal | Introducción

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     En este Curso Introducción a Drupal 9 con Pattern Lab, quiero compartir contigo LA REVOLUCIONARIA MANERA DE TRABAJAR EL DISEÑO CON DRUPAL, se trata de la implementación del Diseño Atómico, que te permitirá crear una guía de estilos, que posteriormente podrá ser aplicada al proyecto en Drupal, sin la necesidad de que tengas conocimientos previos de Drupal, además de minimizar de forma exponencial el tiempo de carga de tu Drupal, facilitando el mantenimiento mediante el uso de componentes y muchas otras opciones que deberías conocer.

Gatsby con Drupal | Trabajando con imágenes desde Drupal 9

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Tratar con imágenes de Drupal

        Uno de los beneficios de usar Gatsby es su soporte integrado para la optimización de imágenes. Gatsby facilita el uso de técnicas de mejores prácticas como el desenfoque o el rastreo de svg para garantizar que las imágenes no ralenticen la carga de la página. Gatsby también proporciona utilidades que permiten a los desarrolladores solicitar una imagen en un tamaño específico o un conjunto de tamaños.

    Como funciona todo esto

        En un nivel alto, cuando Gatsby obtiene datos de Drupal, extrae los archivos de imagen sin procesar adjuntos a cualquier campo de imagen. Los archivos se almacenan localmente y la información se agrega a GraphQL. Los complementos gatsby-plugin-sharp y gatsby-plugin-transform trabajan juntos para exponer varias funciones de procesamiento de imágenes en GraphQL. Cuando consulta GraphQL por una imagen, puede usar estas funciones para decir: "Use esta imagen, pero devuelva todas las variantes de imagen necesarias para técnicas avanzadas de carga de imágenes, como desenfoque o marcador de posición SVG con trazado". Finalmente, los datos devueltos se pueden pasar literalmente al componente Img de gatsby-image, que contiene la lógica requerida para mostrar las imágenes.

        Es una gran cantidad de lógica de visualización y manipulación de imágenes realmente compleja envuelta en un patrón reutilizable que requiere que haga muy poco trabajo adicional en su código para aumentar potencialmente drásticamente la velocidad.

     Instale los complementos necesarios

        Tradicionalmente, los filtros que se encargan del tratamiento de las imágenes, para trabajar con Drupal como Backend en nuestro caso, deberían ser gatsby-imagegatsby-plugin-sharp y gatsby-transformer-sharp; su funcionalidad es codificar nuestras imágenes dinámicas, extraídas desde drupal, a través de consultas con Graphql y mostrarlas, dentro de nuestra aplicación, de manera optimizada para no interferir en el tiempo de carga de nuestra web, además de añadir otras opciones disponibles como el efecto Blur, mientras se carga la imagen y convertirlas en Responsives, además de cargar diferentes tamaños, dependiendo del dispositivo desde el cual accedamos a nuestra aplicación.

        Al momento de escribir este artículo, algunas cosas han cambiado, con respecto a lo que todavía se muestra en la documentación oficial de Gatsby, una de ellas es el hecho de que, si abrimos el archivo de configuración de Gatsby, encontraremos que ya están añadidos los plugins necesarios, con la novedad de que el primero de ellso, ahora se llama "gatsby-plugin-image" en lugar de "gatsby-images" y que además, se han realizado varios cambios y mejoras que implican tomarnos un tiempo para conocerlo.

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Cambios a tomar en cuenta

        Una de las razones relacionadas con este cambio, es el cambio en Drupal 9, del campo field_image por el campo field_media_image, que como comenté en artículos anteriores, permite añadir otros formatos además de imágenes, como videos o audios. 

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

        Este nuevo campo, pasa a ser referenciado, al igual que las taxonomías y por esta razón, al construir la consulta en Graphql, debemos tomar en cuenta que para acceder hasta la URL que utilizaremos en nuestra aplicacion, emplearemos varios niveles de anidación, que no eran necesarios con el antiguo field_image.

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

        Otra de las aclaraciones, es que aunque en Graphql realicemos una consulta hasta llegar a la url de la imagen, cuando nuestro objetivo sea mostar dicha imagen dentro de nuestra aplicación, tendremos que sustituir algunas partes de la consulta, para emplear los recurso de Gatsby.

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony
...GatsbyImageSharpFluid

        Los tres puntos que vemos en la anterior imagen, son parte de la configuración interna de Gatsby, que compacta toda la información que hayamos seleccionado en el entorno gráfico Graphql, relacionada con nuestra imagen ej.: (src, srcset, url) y se la pasa como parámetros al plugin, para que este la complile de la manera adecuada. 

     Uso de los componentes de la imagen de Gatsby

        El complemento Gatsby Image incluye dos componentes de imagen: uno para imágenes estáticas y otro para imágenes dinámicas. La forma más sencilla de decidir cuál necesita es preguntarse: "¿Esta imagen será la misma cada vez que se utilice el componente o la plantilla?". Si siempre será el mismo, utilice StaticImage. Si cambia, ya sea a través de datos provenientes de un CMS o de diferentes valores pasados a un componente cada vez que lo usa, entonces es una imagen dinámica y debe usar el componente GatsbyImage.

     Como en nuestro caso, las imágenes que queremos utilizar serán dinámicas, porque vendrán desde nuestro Drupal 9, tendremos que optar por el componente para imágenes dinámicas.

    Actualice sus consultas GraphQL

        A continuación, actualice sus consultas GraphQL para hacer uso de las funciones y fragmentos proporcionados por los complementos gatsby-plugin-sharp y gatsby-transform-sharp.

        En src/templates/recipe.js modifique el código para que se vea así:

importar React desde 'react';
importar {graphql} de 'gatsby';
importar casco desde 'react-helmet';
importar {makeStyles} desde "@mui/styles";
importar papel desde '@mui/material/Paper';
importar { GatsbyImage, getImage } desde "gatsby-plugin-image"
importar diseño desde '../components/layout';
importar Receta desde '../components/Recipe/Recipe';


const usarEstilos = hacerEstilos({
    raíz: {
        espaciado: [3, 2],
        relleno: '30px',
    },
});


const RecipeTemplate = (accesorios) => {
    const clases = useStyles();
    const { nodoRecipe: receta } = props.data;
    const image = getImage(receta.relaciones.imagen.relaciones.field_media_image.localFile.childImageSharp)
    consola.log(receta)
    devolver (
        <Diseño>
            <Casco
                title={`Umami - ${receta.título}`}
                meta={[
                    {nombre: 'descripción', contenido: receta.título},
                ]}
            />
            <Nombre de clase de papel={clases.raíz}>
                <GatsbyImage image={imagen} alt={receta.título} />
                <Receta
                    {...receta}
                    categoría={receta.relaciones.categoría[0].nombre}
                    tags={receta.relaciones.tags}
                    instrucciones={receta.instrucciones.procesado}
                    resumen={receta.resumen.procesado}
                />
            </Papel>
        </Diseño>
    )
};

exportar plantilla de receta predeterminada;

// La variable $drupal_id aquí se obtiene del objeto "contexto" pasado a
// la API createPage() en gatsby-node.js.
//
// Tenga en cuenta también el uso de alias de nombre de campo en la consulta. esto se hace para
// ayuda a normalizar la forma de los datos de la receta.
exportar consulta const = graphql`
  consulta RecipeTemplate($drupal_id: String!) {
    nodoRecipe(drupal_id: {eq: $drupal_id}) {
      Drupal_id,
      título,
      tiempo_cocina: campo_tiempo_cocina,
      dificultad: campo_dificultad,
      ingredientes: campo_ingredientes,
      tiempo_de_preparación: tiempo_de_preparación_del_campo,
      numero_de_raciones: campo_numero_de_raciones,
      instrucciones: field_recipe_instruction {
        procesada,
      },
      resumen: campo_resumen {
        procesada,
      },
      relaciones {
        categoría: campo_receta_categoría {
          nombre,
        }
        etiquetas: campo_etiquetas {
          nombre,
        }
        imagen: campo_media_imagen {
          relaciones {
            imagen_de_medios_de_campo {
              archivo local {
                childImageSharp {
                  gatsbyImageData(
                    ancho: 1250
                    marcador de posición: BORROSO
                    formats: [AUTO, WEBP, AVIF]
                  )
                }
              }
            }
          }
        }
      }
    }
  }
`;

     Explicación:

          1.- En la parte superior, hemos importado el nuevo Plugin 

importar { GatsbyImage, getImage } desde "gatsby-plugin-image"

         2.- Hemos creado la constante image, con la ruta indicada en la query que hemos actualizado, para añadir el campo de media de Drupal 9.

const image = getImage(receta.relaciones.imagen.relaciones.field_media_image.localFile.childImageSharp)

        3.- Hemos añadido el nuevo componente relacionado con el tratamiento de la imagen

<GatsbyImage image={imagen} alt={receta.título} />

             El resultado final es el siguiente:

 

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

        Felicidades!!!

            Ahora ya tienes todo el conocimiento necesario, para poder comenzar a desarrollar proyectos web, con Drupal 9 Headless y Gatsby, conjuntamente con las librerías de Material UI.

Gatsby con Drupal | Mostrando datos desde Drupal (2da Parte)

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

        Llegados a este punto, ya nos queda muy poco para completar un listado de artículos en nuestra página, aplicando un diseño atractivo y funcional, gracias a la implementación de Material UI, en nuestra aplicación de Gatsby y, además, gracias al plugin gatsby-source-drupal,  obtenemos toda la información mostrada, desde un Drupal 9, que podremos administrar en paralelo, para ampliarlo con tipos de contenido, permisos de usuarios, taxonomías, entre otras.

        En el camino hasta este momento, hemos conocido muchos de los principios, técnicas y herramientas que nos permitirán desarrollar grandes proyectos, uniendo Gatsby en la parte de frontend y Drupal 9, encargándose del backend; por lo tanto, sólo es cuestion de invertir el suficiente tiempo y esfuerzo, para convertirnos en desarrolladores competitivos y actualizados, a diferencia de muchos otros que se mantienen dentro de su zona de confort, sin continuar evolucionando.

      Crear listas de contenido en Gatsby

         Probablemente deba proporcionar a los usuarios listas para que puedan ver qué contenido está disponible en su aplicación. Esas listas deberán mantenerse actualizadas a medida que se agregue, edite o elimine el contenido. Esto requiere consultar GraphQL para obtener los títulos y las rutas de las páginas a las que desea vincular, y luego usar el componente Enlace proporcionado por gatsby-link para crear enlaces en los que se puede hacer clic a esas páginas en el momento de la compilación.

     Page query vs. Static query  

         Hay dos formas diferentes de hacer que Gatsby ejecute una consulta GraphQL durante el tiempo de compilación. Cuál use depende principalmente del contexto en el que está realizando la consulta.

      Page queries: Las consultas de página son variables especiales exportadas desde un archivo cuyo contenido es una consulta GraphQL envuelta con la función de etiqueta graphql proporcionada por Gatsby. Si esta variable existe, Gatsby buscará, ejecutará e inyectará automáticamente los resultados de la consulta en el componente predeterminado exportado desde el mismo archivo.

       Static queries: Las consultas estáticas se implementan a través del componente StaticQuery. Proporcionan una forma para que cualquier componente emita una consulta y recupere los datos que necesita. Esto ayuda a reducir la necesidad de pasar datos por la pila como accesorios y, en cambio, permite que los componentes que lo necesitan declaren exactamente qué datos necesitan.  

     Agregar una lista de recetas a la página principal

        Para agregar una lista de contenido a la página principal, o cualquier página generada a partir de un archivo en src/pages/ necesitamos:

  • Exportar una función etiquetada en graphql que contenga nuestra consulta
  • Actualizar el componente para usar los datos props.data. * De la consulta que Gatsby inyecta automáticamente para nosotros
  • Utilizar el componente Enlace para todos los enlaces internos

     Comenzaremos definiendo un nuevo componente RecipeCard que podemos usar para mostrar recetas en la página principal. No hay nada especial en este código; solo necesita existir para que podamos tener una buena forma de mostrar el contenido.

     Así que nos colocaremos en la carpeta correspondiente y crearemos el archivo, dentro de src/components/RecipeCard/RecipeCard.js y pegaremos el código dentro de él:

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony
import React from 'react'
import PropTypes from 'prop-types';
import { Link } from 'gatsby'
import { makeStyles } from '@mui/styles';
import Button from '@mui/material/Button';
import { Card } from '@mui/material';
import { CardActions } from '@mui/material';
import { CardContent } from '@mui/material';
import Typography from '@mui/material/Typography';

const useStyles = makeStyles(theme => ({
    card: {
        maxWidth: 345,
        minHeight: 310,
    },
    bullet: {
        display: 'inline-block',
        margin: '0 2px',
        transform: 'scale(0.8)',
    },
    title: {
        marginBottom: 16,
        fontSize: 14,
    },
    pos: {
        marginBottom: 12,
    },
}));

const RecipeCard = (props) => {
    const classes = useStyles();
    const RecipeLink = props => <Link to={props.path} {...props}>Read more</Link>;

    return (
        <Card className={classes.card}>
            <CardContent>
                <Typography className={classes.title} color="textSecondary">
                    {props.category}
                </Typography>
                <Typography variant="h5" component="h2">
                    {props.title}
                </Typography>
                <Typography className={classes.pos} color="textSecondary" dangerouslySetInnerHTML={{ __html: props.summary }} />
            </CardContent>
            <CardActions>
                <Button size="small" path={props.path} component={RecipeLink}>Read more</Button>
            </CardActions>
        </Card>
    );
};

RecipeCard.propTypes = {
    classes: PropTypes.object.isRequired,
    title: PropTypes.string.isRequired,
    summary: PropTypes.string.isRequired,
    category: PropTypes.string.isRequired,
    path: PropTypes.string.isRequired,
};

export default RecipeCard;

 

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

      Lo que hemos hecho en este código es:

        Exportamos una nueva variable llamada consulta, usando la función de etiqueta graphql, con una consulta que obteniene detalles, sobre todas las recetas que queremos mostrar en la página principal. También se conoce como page query. Esto es recogido automáticamente por Gatsby y ejecutado. Los resultados de la consulta se inyectan en el componente IndexPage como props.data.allNodeRecipe.

         En el componente IndexPage recorremos los datos devueltos, utilizando props.data.allNodeRecipe.edges.map () y generamos una <RecipeCard /> para cada elemento.       

        Por lo tanto, cada vez que se crea el sitio con gatsby build, se actualiza el contenido de la página de inicio. Si se agregaron recetas adicionales a nuestro CMS, se introducirán en la base de datos GraphQL de Gatsby y luego se mostrarán.

     Crear un componente RecipeList

        Creemos también un nuevo componente RecipeList, en la ubicación src/components/RecipeList/RecipeList.js, que muestra una lista de enlaces a las 3 recetas agregadas más recientemente que podemos usar en cualquier lugar de nuestra aplicación, no solo al generar páginas. Por ejemplo, podríamos agregar una lista como esta al final de cada página de receta.

        Para ello, seguiremos los siguientes pasos:

  1. Crear un nuevo componente RecipeList
  2. Utilice el componente StaticQuery proporcionado por Gatsby para ejecutar nuestra consulta; esto sigue la técnica estándar de "render prop".
  3. Incluya el componente RecipeList en algún lugar de nuestro sitio para que se procese

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Copia y pega el siguiente código dentro del componente RecipeList.js:

import React from 'react';
import PropTypes from 'prop-types';
import { StaticQuery, Link, graphql } from "gatsby"

const RecipeListWrapper = () => (
    <StaticQuery
        query={graphql`
      query {
        allNodeRecipe(limit: 3) {
          edges {
            node {
              drupal_id,
              title,
              path {
                alias,
              }
            }
          }
        }
      }
    `}
        render={data => <RecipeList recipes={data.allNodeRecipe.edges} />}
    />
);

const RecipeList = ({recipes}) => (
    <ul>
        {
            recipes.map(({ node: recipe }) => (
                <li key={recipe.drupal_id}>
                    <Link to={recipe.path.alias}>
                        {recipe.title}
                    </Link>
                </li>
            ))
        }
    </ul>
);

RecipeList.propTypes = {
    recipes: PropTypes.arrayOf(
        PropTypes.shape({
            node: PropTypes.shape({
                drupal_id: PropTypes.string.isRequired,
                title: PropTypes.string.isRequired,
                path: PropTypes.shape({
                    alias: PropTypes.string.isRequired,
                }).isRequired,
            }).isRequired,
        }),
    ).isRequired,
};

export default RecipeListWrapper;

     Mostrar el listado

        Edite el componente Recipe, que creamos en el artículo anterior, y agreguegaremos el nuevo componente RecipeList, en la parte inferior para mostrar recetas adicionales, para que alguien las lea cuando complete la que está viendo.  

 

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Error de Cache

        Puede que algunas veces, veas un error de caché parecido al de la siguiente imagen, si esto te sucede, deten el proyecto con las teclas Ctrl + C, y luego borra el contenido de la carpeta .cache; a continuación vuelve a arrancar el proyecto con el comando develop

Drupal 9 headless Gatsby  | www.drupaladicto.com - Consultor especializado en drupal y symfony