Desarrollo Gutenberg con ejemplos: Google Maps (parte 2)

Publicada en WordPress.

Ya estamos de vuelta con nuestro tutorial para desarrollar en Gutenberg. La semana pasada empezamos un proyecto que añadía un bloque de mapas en nuestro WordPress. En aquella primera entrada definimos cuáles eran los requisitos que nuestro plugin tiene que cumplir y dejamos listo el esqueleto del que acabará siendo el producto final, partiendo del fantástico plugin boilerplate que hemos creado en Nelio.

Hoy llega la segunda parte del tutorial sobre cómo crear el bloque de mapas. En esta entrada veremos cómo añadir un mapa de Google Maps dentro del editor de WordPress y cómo implementar una interfaz de usuario que nos permita manipular su comportamiento.

Un vistazo al estado actual del proyecto…

En el estado actual del proyecto tenemos un sencillo bloque llamado Demo en packages/blocks/demo/. Este pequeño bloque es el que viene de ejemplo en el plugin boilerplate del que hemos partido y tiene la siguiente pinta:

Bloque de demo que nuestro boilerplate incluye por defecto en el editor de bloques.
Bloque de demo que nuestro boilerplate incluye por defecto en el editor de bloques.

Pero claro, nosotros no queremos un bloque con un corazón y algo de texto, ¿verdad? Lo que nosotros queremos hacer es algo así:

Captura de pantalla de Nelio Maps
Captura de pantalla del bloque de mapas de Nelio Maps.

Es decir, queremos un bloque donde se vea un mapa de Google con un posible marcador. ¿Cómo podemos pasar del bloque de ejemplo original que tenía nuestro boilerplate a este otro bloque más potente? Pues eso es lo que vamos a responder hoy mismo

Pero antes de ello vamos a dedicar un par de minutos a explicar de dónde venimos. Si eres capaz de entender cómo está funcionando el bloque de Demo, lo demás será pan comido.

Entendiendo el bloque de ejemplo…

Toda la chicha del bloque de Demo del que partimos está, como te decía, en packages/blocks/demo/. Allí hay los estilos del bloque, su icono y varios ficheros con el código que implementa su funcionamiento. Veamos los ficheros más importantes.

Por un lado, está el fichero principal index.js. Este fichero exporta tres variables: el nombre del bloque (name), la definición del bloque (settings) y los estilos que admite el bloque (styles). Estas tres variables son las que se usan en packages/blocks/index.js para registrar el bloque en Gutenberg (con registerBlockType) y que esté disponible para usarse.

Este fichero principal, pues, sirve de punto de entrada para entender el bloque que estamos creando. En el objeto de ajustes (settings), vemos tres propiedades importantes: attributes, edit y save. Cada una de estas propiedades está definida en su propio fichero JavaScript con igual nombre, así que comentemos rápidamente qué hay en cada uno de ellos:

  • El fichero attributes.js define todas aquellas propiedades de nuestro bloque que son dinámicas y que, por lo tanto, queremos que el usuario pueda modificar. En el caso del bloque de Demo, el único atributo que hay es el texto que ha escrito el usuario, pero el bloque de mapa tendrá muchas más opciones: las coordenadas del centro del mapa, el nivel de zoom que queremos aplicar, si hay que mostrar ciertos botones, etc.
  • El fichero edit.js es el que define cómo se visualiza el bloque en el editor de WordPress y qué ajustes se ofrecen al usuario (tanto en la barra de herramientas como en la barra lateral de ajustes del bloque). En el caso de Demo, la edición incluye simplemente el componente RichText de WordPress para escribir el contenido. Como veremos, el bloque de mapas será más complejo e incluirá también ajustes adicionales.
  • Finalmente, el fichero save.js define el método que convertirá el bloque que estábamos editando en el HTML que deberá renderizarse en el front-end. De nuevo, en Demo vemos que esta función simplemente guarda el contenido de un RichText usando RichText.Content, pero podría ser cualquier otra cosa (tal y como veremos la semana que viene en la tercera y última entrada de este tutorial).

Creación del bloque de mapas basándonos en el bloque de ejemplo incluido en el plugin boilerplate

Una vez entendido exactamente cómo funciona el bloque que tenemos ahora mismo de demostración, ¿cómo creamos el nuestro? Pues muy fácil: tal y como nos contaba Toni hace unos días, duplicamos el directorio packages/blocks/demo/ en packages/blocks/nelio-maps/ y empezamos a modificar todo lo que sea necesario.

Ya te he dicho que lo primero que habrá que modificar será el fichero attributes.js. Ahí definiremos todas las propiedades que queremos que sean parametrizables de nuestro mapa. En la entrada anterior especificamos qué requisitos debería cumplir nuestro plugin y, por lo tanto, esbozábamos qué cosas se tienen que poder manipular. Pues bien, echando un vistazo al attributes.js resultante verás qué cosas se pueden tocar del bloque de mapas que vamos a crear. Es algo tan sencillo que no merece la pena dedicarle más líneas.

El siguiente punto a modificar es todo lo que concierne a la edición del bloque en Gutenberg. Para ello, debemos meternos en el fichero edit.js e ir tirando del hilo. Si lo miras con detenimiento, verás que no es mucho más complicado que lo que teníamos en el bloque Demo.

Lo más importante está en el método render del bloque (línea 33), donde recuperamos los atributos del objeto this.props que el bloque necesita para funcionar y donde acabamos renderizando toda la interfaz. Fíjate que la interfaz consta de tres partes:

  1. Una barra de herramientas ToolbarControls (línea 66), que sacamos de un fichero llamado toolbar.js y que veremos más adelante.
  2. Los ajustes de bloque que aparecen en la barra lateral del editor (línea 68), que encontramos en un componente llamado Inspector que definimos en inspector.js.
  3. El contenido del bloque en si, que tiene dos estados:
    1. Si no tengo una API key de Google Maps disponible, mostramos un aviso al usuario (línea 122).
    2. Si disponemos de dicha clave, mostramos el mapa en si con el objeto MapBlock (línea 83) y lo acompañamos (a) de un marcador Marker (línea 97), que únicamente está visible si el marcador está activado, y (b) de un div (línea 104) con la información adicional sobre el marcador.

Google Maps como componente React

Está claro que si queremos meter un mapa de Google en nuestro editor, deberemos usar algún componente que nos permita usar la API de mapas de Google Maps. Teniendo en cuenta que Gutenberg está creado usando React, lo más lógico es buscar si existe un componente React de Google Maps. ¡Y existe, claro que sí!

Tal y como puedes leer en la documentación del proyecto, lo primero que tenemos que hacer para poder usar dicho componente es añadirlo a nuestro proyecto. Esto lo conseguimos instalando y añadiendo la dependencia a nuestro plugin:

npm install react-google-maps --save-dev

lo cual añade una nueva entrada en nuestro package.json.

Cómo crear un componente de WordPress que encapsule un componente React

Si seguimos mirando la documentación de este componente React para Google Maps, veremos que nos recomiendan encapsular el componente GoogleMap en un componente propio. Una vez esté encapsulado, deberemos usar este componente propio en nuestro plugin.

Para ello, lo único que hacemos es crear un componente llamado MapBlock en su propio fichero map-block.js (por aquello de tenerlo todo bien ordenadito) siguiendo exactamente los pasos que nos indica la documentación. Ni más, ni menos.

Cómo añadir ajustes de bloque en la barra lateral de WordPress

Ahora que ya tenemos un mapa, es hora de poder configurar cómo deberá verse y comportarse el mapa en el front-end. Para ello, deberemos añadir varias secciones de ajustes en la barra lateral de Gutenberg. Como ya te he avanzado, esto lo conseguimos con un componente que hemos llamado Inspector y que hemos definido en el fichero inspector.js.

Si echas un vistazo a este fichero, verás que se sigue el mismo patrón de siempre: estamos definiendo un componente Component con un método render. Este método se queda con los atributos de this.props que le son relevantes y devuelve el JSX con todos los controles. En este caso en concreto, devuelve un InspectorControls (esto le indica a WordPress que este contenido va a la barra lateral) con varias secciones PanelBody. Veamos cada sección en detalle.

Ajustes básicos del mapa

El primer PanelBody que encontramos (línea 47) no tiene título title y, por lo tanto, aparece siempre como una sección que no se puede cerrar:

Ajustes básicos del mapa de Nelio
Ajustes básicos del bloque de mapas de Nelio Maps. Escoge el tamaño y el nivel de zoom con estos dos selectores.

La sección define un par de controles de rango RangeControl, cuyo resultado puedes ver en la captura anterior. Estos dos controles nos permiten modificar el alto del mapa y el nivel de zoom del mismo.

Otra sección interesante y sencilla es la que encontramos en la línea 121. Aquí añadimos unas cuantas opciones para activar o desactivar los botones que deberán mostrarse en el mapa cuando éste se visualice en el front-end:

Botones del mapa
Configura qué botones del mapa estarán visibles en el front-end.

Para ello, simplemente tenemos que usar el componente por defecto de WordPress CheckboxControl.

Cómo añadir una sección personalizada de estilos para nuestro mapa

Otra sección interesante de nuestro bloque es la sección de estilo (línea 68). Puedes ver el resultado final en la siguiente captura:

Estilos de Google Maps
Puedes cambiar la apariencia del mapa usando la sección de Estilos en la configuración del bloque.

Se trata de una sección especial porque el componente que usamos (MapStyles) no es algo que exista en WordPress por defecto, sino que lo hemos creado a drede para la ocasión. Tal y como puedes ver en el enlace anterior, se trata de un compontente que carga un conjunto de estilos predefinidos en un componente de tipo ImagePicker (el cual, por cierto, tampoco existe por defecto en WordPress; puedes encontrarlo en packages/components/image-picker/) .

Cuando el usuario selecciona alguno de los estilos incluidos en ImagePicker, el componente MapStyles invoca la función onChange que le hayan pasado (fíjate en la línea 76 de inspector.js) pasando dos valores: el nombre del estilo seleccionado y el JSON asociado.

Finalmente, fíjate que una de las opciones que incluye MapStyles es el «estilo personalizado»:

Estilo personalizado de mapa en Nelio Maps
Además de los 5 estilos por defecto incluidos en el bloque, existe la posibilidad de añadir tu propio estilo del mapa usando un JSON.

Cuando se selecciona, el componente renderiza un cuadro de texto adicional (línea 45) para que el usuario pueda meter su propio estilo en formato JSON. Porque, por si no lo sabías, los mapas de Google Maps se pueden personalizar una barbaridad.

Cómo añadir un marcador a nuestro mapa

La siguiente sección que tenemos es la que controla nuestro marcador (línea 81). Esta sección nos permite mostrar u ocultar el marcador del mapa (línea 86) y, cuando está activo, nos da algunos ajustes adicionales:

Cómo añadir un marcador al mapa
El bloque permite añadir un marcador al mapa para así señalizar algún punto en concreto del mismo.

Como ves, aparece un cuadro de búsqueda para buscar ubicaciones en Google Maps (el cual hemos implementado, de nuevo, con un componente personalizado llamado AddressSearch) y la posibilidad de mostrar u ocultar el bloque de texto en el que meter información adicional sobre el marcador.

Por cierto, fíjate que este componente para buscar ubicaciones en Google se basa en un componente llamado StandaloneSearchBox, el cual también forma parte del proyecto React que hemos añadido a nuestro plugin para usar el mapa en primer lugar. ¡Qué gustazo da reaprovechar el trabajo de otros!

Cómo configurar la barra de herramientas de un bloque

Lo último que nos queda por explicar hoy es la barra de herramientas. Si has entendido como funciona la barra lateral, la barra de herramientas es una chorrada.

Barra de herramientas de Nelio Maps
La barra de herramientas ofrece un acceso rápido a las opciones más importantes del mapa de Nelio Maps.

La barra de herramientas de nuestro plugin está representada por el componente ToolbarControls definido en toolbar.js. Aquí sencillamente añadimos un componente para definir la alineación del bloque (BlockAlignmentToolbar, en la línea 42), un par de desplegables para centrar el mapa (línea 50) y/o modificar la ubicación del marcador (línea 79) y un par de botones extra para cambiar la ubicación del cuadro de texto en el que podemos meter información sobre el marcador (líneas 107 y 120).

Búsqueda de ubicaciones integrada en WordPress
Con la búsqueda de ubicaciones integrada, puedes buscar cualquier negocio o dirección sin salir del editor de bloques.

Resumiendo

Hoy hemos visto cómo crear toda la interfaz de edición del bloque de mapas. Como ves, se trata de un proceso que, si bien puede resultar ligeramente costoso en tiempo, cualquiera con ganas puede aprender. Al final, el secreto está en partir de un código de ejemplo que esté bien organizado e ir construyendo la interfaz poco a poco, reaprovechando los componentes que ofrece WordPress, los componentes que ya existen o creando los tuyos propios.

Nos vemos la semana que viene con la última entrega de este tutorial, donde veremos cómo guardar nuestro mapa y cómo visualizarlo en el front-end de la web.

Imagen destacada de rawpixel en Unsplash.

FlojaNo está malBienMuy bien¡Impecable! (Ninguna valoración todavía)
Cargando…

Deja un comentario

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.