Експорт полів для типу вмісту


11

Функція експорту конфігурації Drupal 8 здавалася б дуже корисною функцією. Однак я не впевнений, що повністю розумію, як це працює.

Наприклад, якщо я роблю один експорт, вибираю "Тип вмісту", а потім вибираю один із моїх типів вмісту, я б очікував, що експорт містить повний опис цього типу вмісту. Але вона не містить жодної інформації про поля цього типу вмісту. Отже, якщо ви хотіли експортувати конфігурацію типу вмісту для використання на іншому сайті, здається, що це неможливо.

Я не впевнений, що я розумію, як використовувати єдиний експорт, якщо вони не містять усіх необхідних даних для суб'єкта господарювання. Я щось пропускаю?

Відповіді:


10

ОНОВЛЕННЯ

Ви можете також спробувати команду Drupal Console drupal config:export:content:type .

Це опис говорить:

Конфігурація: export: content: type команда Експорт певного типу вмісту та їх полів.


Типи вмісту та поля - це 2 окремі конфігурації в Drupal 8, тому, якщо ви хочете експортувати тип вмісту з полями, ви також повинні експортувати всі його конфігурації полів.

Модуль функцій може бути корисним для групування конфігурацій, він ще не стабільний, я його не пробував, але, думаю, варто спробувати.


1
Дякую за відповідь. Напевно, я здивований, що експорт типу вмісту не містить інформації. про поля взагалі, тому, якщо ви хочете це зробити окремо, вам доведеться експортувати кожне поле вручну.
Джеймс

Я думаю, що це працює так, тому що якщо ви зміните налаштування для 1 поля, вам потрібно оновити 1 ymlфайл, специфічний для цього поля, а не цілу конфігурацію типу вмісту. Таким чином, менший ризик конфліктів і дає більшу гнучкість.
otarza

0

Я написав сценарій Python (нижче), який експортує групу елементів конфігурації за допомогою drush. Це може бути корисним у вашому випадку (це було в моєму випадку). Використання:

export_config_group.py -s something -m foobar

Це виконує drush config-list, отримує всі елементи, ім'я яких містить термін something, а потім зберігає їх у modules/custom/foobar/config/install.

Сценарій також коригує yml наступним чином:

  • видаляє default_config_hashзапис, коли він існує;
  • видаляє uuidзапис, коли він існує.

Сценарій залежить від ruamel.yaml для завантаження та скидання конфігурації. Переконайтесь, що ви pip installце заздалегідь.

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.