
Drupal 8: Exportar configuración mediante drupal console
Autor: fjavimartin
Fecha de Creación: 09/01/2019
Categorías:
Una de las novedades de drupal 8 es la posibilidad de exportar configuraciones realizadas desde la interface de administración mediante archivos YAML. En este artículo veremos como utilizar drupal console para exportar esta configuración y utilizarla después en nuestros módulos.
1. Drupal console
Nada más entrar en la web de drupal console encontramos una definición de esta herramienta: “Interface de comandos para drupal. Una herramienta para generar código repetitivo, interaccionar y depurar drupal.”
El primer paso para empezar con drupal console será la instalación de esta herramienta y para eso ya tenemos en este mismo blog una guía para su instalación en este mismo enlace.
Una vez tengamos instalado drupal console bastará ejecutar la siguiente instrucción desde el directorio raíz de nuestro sitio para ver un resumen de todas las opciones que nos ofrece:
$ drupal
Entre todos los comandos que nos ofrece drupal console encontramos los que nos interesan:
config
config:delete (cd) Delete configuration
config:diff (cdi) Output configuration items that are different in active configuration compared with a directory.
config:edit (ced,cdit) Change a configuration object with a text editor.
config:export (ce) Export current application configuration.
config:export:content:type (cect) Export a specific content type and their fields.
config:export:single (ces) Export a single configuration or a list of configurations as yml file(s).
config:export:view (cev) Export a view in YAML format inside a provided module to reuse in other website.
config:import (ci) Import configuration to current application.
config:import:single (cis) Import a single configuration or a list of configurations.
config:override (co) Override config value in active configuration.
config:validate (cv) Validate a drupal config against its schema
En nuestro caso utilizaremos el comando config:export:content:type que nos permitirá exportar un tipo de contenido completo junto con todos los campos que tenga configurados y las opciones de presentación.
Otra de las herramientas que podríamos utilizar para este cometido es drush, pero la diferencia con drupal console es que no nos permite exportar un tipo de contenido completo o un solo elemento de configuración sino la configuración completa de nuestro sitio.
2. Tipo de contenido de prueba
Para nuestro ejemplo crearemos un tipo de contenido muy sencillo llamado “signingType” que solamente contendrá un campo llamado field_efichajes_enabled de tipo booleano.

La configuración para la presentación del formulario.

La configuración para la presentación del contenido – versión completa.

La configuración para la presentación del contenido – versión resumida.

3. Comando config:export:content:type
Lo primero será ver cuáles son las diferentes opciones del comando:
$ drupal help config:export:content:type
Usage:
config:export:content:type [options] [--] <content-type>
cect
Arguments:
content-type Content Type to be exported
Options:
--module=MODULE The Module name.
--optional-config[=OPTIONAL-CONFIG] Export content type as an optional YAML configuration in your module
--remove-uuid If set, the configuration will be exported without uuid key.
--remove-config-hash If set, the configuration will be exported without the default site hash key.
Examples:
Provide a content type and module name
drupal config:export:content:type page \
--module="demo"
If you want export content type provide the optional config
drupal config:export:content:type page \
--module="demo" \
--optional-config
Help:
Export a specific content type and their fields.
Solamente podremos realizar la exportación de la configuración sobre alguno de los módulos que tengamos descargados en nuestro sitio, instalado o no. Para el caso que no utilicemos ningún valor nos ofrecerá el primer módulo que tengamos en el directorio modules.
Otra de las novedades que ofrece drupal 8 es que cada uno de sus objetos tiene un identificador universal. Mediante la opción –remove-uuid podremos eliminar este identificador en la exportación para que se le asigne uno nuevo al importarse.
La opción –remove-config-hash hará algo parecido a la anterior, pero esta vez con el hash que identifica nuestro sitio.
Mediante la opción –optional-config nos permitirá exportar la configuración al directorio de opcional de nuestro módulo. Tengo que decir que después de intentarlo varias veces y probar con varios valores para esta opción siempre lo generaba como opcional, si no utilizáis esta opción os solicitará el valor [yes/no] por línea de comandos para continuar.
4. Exportar contenido
Una vez tenemos creado nuestro contenido de prueba y analizadas las diferentes opciones del comando a utilizar solamente nos quedará exportar la configuración con el siguiente comando:
$ drupal config:export:content:type --module=efichajes --optional-config --remove-uuid --remove-config-hash signingtype
Exporting content type
- modules/custom/efichajes/config/optional/node.type.signingtype.yml
- modules/custom/efichajes/config/optional/field.field.node.signingtype.field_efichajes_enabled.yml
- modules/custom/efichajes/config/optional/field.storage.node.field_efichajes_enabled.yml
- modules/custom/efichajes/config/optional/core.entity_form_display.node.signingtype.default.yml
- modules/custom/efichajes/config/optional/core.entity_view_display.node.signingtype.default.yml
- modules/custom/efichajes/config/optional/core.entity_view_display.node.signingtype.teaser.yml
- modules/custom/efichajes/config/optional/core.entity_view_mode.node.teaser.yml
Si unimos todos estos ficheros tendremos la configuración completa de nuestro tipo de contenido junto con la de sus campos.
El contenido del fichero modules/custom/efichajes/config/optional/node.type.signingtype.yml será el siguiente:
langcode: en
status: true
dependencies:
enforced:
module:
- efichajes
module:
- menu_ui
third_party_settings:
menu_ui:
available_menus:
- main
parent: 'main:'
name: SigningType
type: signingtype
description: 'Content type that represents a signing type.'
help: ''
new_revision: true
preview_mode: 1
display_submitted: true
¿Que raro? ¿Donde está la configuración de sus campos?……..Tendremos un fichero por cada uno de los campos que tenga cada tipo de contenido con su configuración correspondiente.
Esta será la configuración de nuestro campo.
langcode: en
status: true
dependencies:
enforced:
module:
- efichajes
config:
- field.storage.node.field_efichajes_enabled
- node.type.signingtype
id: node.signingtype.field_efichajes_enabled
field_name: field_efichajes_enabled
entity_type: node
bundle: signingtype
label: 'efichajes - enabled'
description: 'Set this field to make this content type available.'
required: true
translatable: false
default_value:
-
value: 1
default_value_callback: ''
settings:
on_label: Activado
off_label: Desactivado
field_type: boolean
¿Que pasa si un campo está en varios tipos de contenido?……..Tendremos un único fichero para todos los campos donde estará la configuración de su almacenamiento.
Esta será la configuración del almacenamiento de nuestro campo.
langcode: en
status: true
dependencies:
enforced:
module:
- efichajes
module:
- node
id: node.field_efichajes_enabled
field_name: field_efichajes_enabled
entity_type: node
type: boolean
settings: { }
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
5. Dependencias en el contenido exportado
Si cogemos todos los ficheros que acabamos de generar los llevamos a nuestro módulo y lo instalamos comprobaremos que nuestro tipo de contenido se creará automáticamente junto con el campo que tiene configurado, pero si realizamos la desinstalación de nuestro módulo no se eliminarán de nuestro sitio. Si queremos que cuando desinstalemos nuestro módulo se realice la eliminación de toda la configuración que hayamos creado deberemos añadir una dependencia a cada uno de los ficheros de configuración con la siguiente línea:
enforced:
module:
- efichajes
De esta forma cuando realicemos la desinstalación de nuestro módulo también se eliminará su configuración. De esta forma la configuración de nuestro tipo de contenido quedará de la siguiente manera:
langcode: en
status: true
dependencies:
enforced:
module:
- efichajes
module:
- menu_ui
third_party_settings:
menu_ui:
available_menus:
- main
parent: 'main:'
name: SigningType
type: signingtype
description: 'Content type that represents a signing type.'
help: ''
new_revision: true
preview_mode: 1
display_submitted: true
6. Conclusiones
Además de la exportación de configuración varia también podremos eliminar una configuración determinada de nuestro sitio o exportar una vista con los comandos que nos ofrece drupal console:
config
config:delete (cd) Delete configuration
config:diff (cdi) Output configuration items that are different in active configuration compared with a directory.
config:edit (ced,cdit) Change a configuration object with a text editor.
config:export (ce) Export current application configuration.
config:export:content:type (cect) Export a specific content type and their fields.
config:export:single (ces) Export a single configuration or a list of configurations as yml file(s).
config:export:view (cev) Export a view in YAML format inside a provided module to reuse in other website.
config:import (ci) Import configuration to current application.
config:import:single (cis) Import a single configuration or a list of configurations.
config:override (co) Override config value in active configuration.
config:validate (cv)
Eliminar las cachés también será algo muy sencillo con los siguientes comandos:
cache
cache:rebuild (cr,cc) Rebuild and clear all site caches.
cache:tag:invalidate (cti) Invalidate cache tags.
Espero que saquéis mucho provecho de esta información y os sirva como punto de partida para conocer esta herramienta muy práctica.
Disfrutar!!!!
Referencias
https://www.e-quipos.es/blog/drupal-instalando-drupal-console-en-ubuntu
https://hechoendrupal.gitbooks.io/drupal-console/content/en/commands/config-export-content-type.html
https://www.drupal.org/docs/8/api/entity-api/creating-a-custom-content-type-in-drupal-8