Felder für den Inhaltstyp exportieren

11

Die Konfigurationsexportfunktion von Drupal 8 scheint eine sehr nützliche Funktion zu sein. Ich bin mir jedoch nicht sicher, ob ich vollständig verstehe, wie es funktioniert.

Wenn ich beispielsweise einen einzelnen Export durchführe, "Inhaltstyp" und dann einen meiner Inhaltstypen auswähle, würde ich erwarten, dass dieser Export eine vollständige Beschreibung dieses Inhaltstyps enthält. Es enthält jedoch keine Informationen zu den Feldern in diesem Inhaltstyp. Wenn Sie also eine Konfiguration des Inhaltstyps zur Verwendung auf einer anderen Site exportieren möchten, scheint dies nicht möglich zu sein.

Ich bin mir nicht sicher, ob ich die Verwendung von Einzelexporten verstehe, wenn sie nicht alle erforderlichen Daten für eine Entität enthalten. Vermisse ich etwas

James
quelle

Antworten:

10

AKTUALISIEREN

Sie können auch den drupal config:export:content:type Befehl der Drupal-Konsole ausprobieren .

Die Beschreibung lautet:

Der Befehl config: export: content: type Exportiert einen bestimmten Inhaltstyp und seine Felder.


Inhaltstypen und Felder sind in Drupal 8 zwei separate Konfigurationen. Wenn Sie also Inhaltstypen mit Feldern exportieren möchten, müssen Sie auch alle Feldkonfigurationen exportieren.

Das Funktionsmodul kann hilfreich sein, um Konfigurationen zu gruppieren. Es ist noch nicht stabil. Ich habe es noch nicht ausprobiert, aber ich denke, es lohnt sich, es auszuprobieren.

Otarza
quelle
1
Danke für die Antwort. Ich bin wohl überrascht, dass der Export des Inhaltstyps keine Informationen enthält. über die Felder überhaupt. Wenn Sie dies einzeln tun möchten, müssen Sie jedes Feld manuell exportieren.
James
Ich denke, das funktioniert so, denn wenn Sie die Einstellungen für ein Feld ändern, müssen Sie eine ymlfür dieses Feld spezifische Datei aktualisieren , nicht die Konfiguration des gesamten Inhaltstyps. So besteht weniger Konfliktrisiko und mehr Flexibilität.
Otarza
0

Ich habe ein Python-Skript (unten) geschrieben, das eine Gruppe von Konfigurationselementen mit exportiert drush. Es kann in Ihrem Fall nützlich sein (es war in meinem Fall). Verwendung:

export_config_group.py -s something -m foobar

Dies wird ausgeführt drush config-list, ruft alle Elemente ab, deren Name den Begriff enthält something, und speichert sie dann in modules/custom/foobar/config/install.

Das Skript passt die yml auch wie folgt an:

  • entfernt den default_config_hashEintrag, wenn er existiert;
  • Entfernt den uuidEintrag, falls vorhanden.

Das Skript hängt von ruamel.yaml ab , um die Konfiguration zu laden und zu sichern . Stellen Sie sicher, dass Sie pip installes im Voraus.

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
quelle