Exportar campos para tipo de contenido

11

La función de exportación de configuración de Drupal 8 parece ser una función muy útil. Sin embargo, no estoy seguro de entender completamente cómo funciona.

Por ejemplo, si realizo una sola exportación, elija "Tipo de contenido" y luego seleccione uno de mis tipos de contenido, esperaría que esa exportación contenga una descripción completa de ese tipo de contenido. Pero no contiene ninguna información sobre los campos en ese tipo de contenido. Entonces, si desea exportar una configuración de tipo de contenido para usar en otro sitio, no parece posible hacerlo.

No estoy seguro de entender el uso de ser para hacer exportaciones individuales si no contienen todos los datos necesarios para una entidad. ¿Me estoy perdiendo de algo?

James
fuente

Respuestas:

10

ACTUALIZAR

También puede probar el drupal config:export:content:type comando de la consola de Drupal .

Su descripción dice:

El comando config: export: content: type Exporta un tipo de contenido específico y sus campos.


Los tipos de contenido y los campos son 2 configuraciones separadas en Drupal 8, por lo que si desea exportar el tipo de contenido con campos, también debe exportar todas sus configuraciones de campos.

El módulo de características puede ser útil para agrupar configuraciones, aún no es estable, no lo he probado pero creo que vale la pena intentarlo.

otarza
fuente
1
Gracias por la respuesta. Supongo que me sorprende que la exportación de tipo de contenido no contenga información. acerca de los campos en absoluto, por lo que si quisiera hacerlo individualmente, tendría que exportar cada campo manualmente.
James
Creo que esto funciona así porque si cambia la configuración de 1 campo, debe actualizar 1 ymlarchivo específico para ese campo, no toda la configuración del tipo de contenido. Por lo tanto, hay menos riesgo de conflictos y ofrece más flexibilidad.
otarza
0

He escrito un script de Python (a continuación) que exporta un grupo de elementos de configuración usando drush. Puede ser útil en su caso (lo ha sido en mi caso). Uso:

export_config_group.py -s something -m foobar

Esto se ejecuta drush config-list, obtiene todos los elementos cuyo nombre contiene el término something, luego los guarda en modules/custom/foobar/config/install.

El script también ajusta el yml de la siguiente manera:

  • elimina la default_config_hashentrada cuando existe;
  • elimina la uuidentrada cuando existe.

El script depende de ruamel.yaml para cargar y volcar la configuración. Asegúrate de pip installhacerlo por adelantado.

import os
import argparse
import subprocess
import ruamel.yaml

MODULES_ROOT = "/var/www/html/dm/web/modules/custom"


def main():
    search_term, module, keep_uuid = parse_arguments()
    module_config_path = os.path.join(MODULES_ROOT, module, 'config/install')
    items = run_process(['drush', 'config-list']).splitlines()

    for item in items:
        if search_term in item:
            print "Config item:", item

            yml = run_process(['drush', 'config-get', item])
            new_yml = adjust_yml(yml, keep_uuid)
            full_path = os.path.join(module_config_path, item + '.yml')

            with open(full_path, 'w') as f:
                f.write(new_yml)


def parse_arguments():
    ap = argparse.ArgumentParser(description="Export config group.")
    ap.add_argument("-s", "--search", required=True, help="Search term")
    ap.add_argument("-m", "--module", required=True, help="Destination module")
    ap.add_argument("-u", "--uuid", help="Keep UUID",
                    action='store_true', default=False)
    args = ap.parse_args()
    return args.search, args.module, args.uuid


def run_process(params):
    process = subprocess.Popen(params, stdout=subprocess.PIPE)
    stdout, _ = process.communicate()
    return stdout


def adjust_yml(yml, keep_uuid):
    loader = ruamel.yaml.RoundTripLoader
    config = ruamel.yaml.load(yml, loader, preserve_quotes=True)

    remove_core_config_hash(config)

    if not keep_uuid:
        remove_uuid(config)

    dumper = Dumper = ruamel.yaml.RoundTripDumper
    return ruamel.yaml.dump(config, Dumper=dumper, indent=2, block_seq_indent=2)


def remove_core_config_hash(config):
    if '_core' in config:
        if 'default_config_hash' in config['_core']:
            config['_core'].pop('default_config_hash')

            # Also remove '_core' node if empty
            if not config['_core']:
                config.pop('_core')


def remove_uuid(config):
    if 'uuid' in config:
        config.pop('uuid')

if __name__ == "__main__":
    main()
turdus-merula
fuente