Экспорт полей для типа контента

11

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

Например, если я выполняю один экспорт, выбираю «Тип контента», затем выбираю один из моих типов контента, я ожидаю, что этот экспорт будет содержать полное описание этого типа контента. Но он не содержит никакой информации о полях в этом типе контента. Поэтому, если вы хотите экспортировать конфигурацию типа контента для использования на другом сайте, это не представляется возможным.

Я не уверен, что понимаю, как использовать один экспорт, если он не содержит все необходимые данные для объекта. Я что-то упускаю?

Джеймс
источник

Ответы:

10

ОБНОВИТЬ

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

Это описание говорит:

Команда config: export: content: type Экспортирует определенный тип контента и его поля.


Типы контента и поля представляют собой две отдельные конфигурации в Drupal 8, поэтому, если вы хотите экспортировать тип контента с полями, вы должны экспортировать также все конфигурации его полей.

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

otarza
источник
1
Спасибо за ответ. Наверное, я удивлен, что экспорт типа Content не содержит информации. о полях вообще, поэтому, если вы хотите сделать это по отдельности, вам придется экспортировать каждое поле вручную.
Джеймс
Я думаю, что это работает так, потому что если вы измените настройки для 1 поля, вам нужно обновить 1 ymlфайл, специфичный для этого поля, а не всю конфигурацию типа контента. Таким образом, существует меньший риск возникновения конфликтов и больше гибкости.
отарза
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()
TURDUS-Мерула
источник