web-dev-qa-db-fra.com

Exportation de champs pour le type de contenu

La fonctionnalité d'exportation de configuration de Drupal 8 semble être une fonctionnalité très utile. Cependant, je ne suis pas sûr de bien comprendre comment cela fonctionne.

Par exemple, si je fais une seule exportation, choisissez "Type de contenu" puis sélectionnez l'un de mes types de contenu, je m'attendrais à ce que l'exportation contienne une description complète de ce type de contenu. Mais il ne contient aucune information sur les champs de ce type de contenu. Donc, si vous souhaitez exporter une configuration de type de contenu pour une utilisation sur un autre site, cela ne semble pas possible.

Je ne suis pas sûr de comprendre l'utilité de faire des exportations simples si elles ne contiennent pas toutes les données requises pour une entité. Suis-je en train de manquer quelque chose?

11
James

[~ # ~] mise à jour [~ # ~]

Vous pouvez également essayer console Drupaldrupal config:export:content:type commande.

Sa description dit:

La commande config: export: content: type Exporte un type de contenu spécifique et leurs champs.


Les types de contenu et les champs sont 2 configurations distinctes dans Drupal 8, donc si vous voulez exporter le type de contenu avec des champs, vous devez également exporter toutes ses configurations de champs.

Fonctionnalités le module peut être utile pour regrouper les configurations, il n'est pas encore stable, je ne l'ai pas essayé mais je pense que cela vaut la peine d'essayer.

10
otarza

J'ai écrit un script Python (ci-dessous) qui exporte un groupe d'éléments de configuration en utilisant drush. Il peut être utile dans votre cas (il l'a été dans mon cas).

export_config_group.py -s something -m foobar

Cela exécute drush config-list, récupère tous les éléments dont le nom contient le terme something, puis les enregistre dans modules/custom/foobar/config/install.

Le script ajuste également le yml comme suit:

  • supprime le default_config_hash entrée quand elle existe;
  • supprime l'entrée uuid lorsqu'elle existe.

Le script dépend de ruamel.yaml pour charger et vider la configuration. Assurez-vous pip install à l'avance.

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()
0
turdus-merula