Eksportowanie pól dla typu zawartości

11

Funkcja eksportu konfiguracji Drupala 8 wydaje się być bardzo przydatną funkcją. Nie jestem jednak pewien, czy całkowicie rozumiem, jak to działa.

Na przykład, jeśli dokonam pojedynczego eksportu, wybierz „Typ zawartości”, a następnie wybierz jeden z moich typów zawartości, oczekiwałbym, że ten eksport będzie zawierał pełny opis tego typu zawartości. Ale nie zawiera żadnych informacji o polach tego typu treści. Jeśli więc chcesz wyeksportować konfigurację typu zawartości do użycia w innej witrynie, nie wydaje się to możliwe.

Nie jestem pewien, czy rozumiem, jak to jest robić Pojedynczy eksport, jeśli nie zawierają wszystkich wymaganych danych dla jednostki. Czy coś brakuje?

James
źródło

Odpowiedzi:

10

AKTUALIZACJA

Możesz także wypróbować polecenie Drupal Console drupal config:export:content:type .

Jego opis mówi:

Polecenie config: export: content: type Eksportuj określony typ zawartości i ich pola.


Typy zawartości i pola to 2 osobne konfiguracje w Drupal 8, więc jeśli chcesz wyeksportować typ zawartości z polami, musisz również wyeksportować wszystkie konfiguracje pól.

Moduł funkcji może być pomocny w grupowaniu konfiguracji, nie jest jeszcze stabilny, nie próbowałem go, ale myślę, że warto spróbować.

otarza
źródło
1
Dziękuję za odpowiedź. Myślę, że jestem zaskoczony, że eksport typu zawartości nie zawiera żadnych informacji. o polach, więc jeśli chcesz to zrobić pojedynczo, musisz wyeksportować każde pole ręcznie.
James
Myślę, że tak to działa, ponieważ jeśli zmienisz ustawienia dla 1 pola, musisz zaktualizować 1 ymlplik specyficzny dla tego pola, a nie konfigurację całego typu zawartości. Dzięki temu ryzyko konfliktów jest mniejsze i daje większą elastyczność.
otarza
0

Napisałem skrypt Pythona (poniżej), który eksportuje grupę elementów konfiguracji za pomocą drush. Może być przydatny w twoim przypadku (tak było w moim przypadku). Stosowanie:

export_config_group.py -s something -m foobar

Wykonuje się drush config-list, pobiera wszystkie elementy, których nazwa zawiera termin something, a następnie zapisuje je modules/custom/foobar/config/install.

Skrypt dostosowuje również yml w następujący sposób:

  • usuwa default_config_hashwpis, jeśli istnieje;
  • usuwa uuidwpis, jeśli istnieje.

Skrypt zależy od ruamel.yaml, aby załadować i zrzucić konfigurację. Upewnij się, że pip installto z góry.

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
źródło