导出内容类型的字段


11

Drupal 8的配置导出功能似乎是一个非常有用的功能。但是,我不确定我是否完全理解它是如何工作的。

例如,如果我执行单个导出,请选择“内容类型”,然后选择我的一种内容类型,我希望该导出包含该内容类型的完整描述。但是它不包含有关该内容类型中字段的任何信息。因此,如果您要导出内容类型配置以在另一个站点上使用,则似乎无法做到这一点。

我不确定如果不包含实体所需要的全部数据,那么我会被being用作单一出口。我想念什么吗?

Answers:


10

更新

您也可以尝试使用Drupal Console的 drupal config:export:content:type命令。

描述说:

config:export:content:type命令导出特定的内容类型及其字段。


在Drupal 8中,内容类型和字段是2个单独的配置,因此,如果要导出包含字段的内容类型,则还必须导出所有它的字段配置。

“功能”模块可能有助于对配置进行分组,但它还不稳定,我尚未尝试过,但我认为可能值得尝试。


1
感谢你的回答。我想我对内容类型导出不包含任何信息感到惊讶。关于字段的所有信息,因此,如果要单独执行此操作,则必须手动导出每个字段。
詹姆斯,

我认为这样做是因为,如果您更改1个字段的设置,则需要更新yml该字段专用的1个文件,而不是整个内容类型配置。这样就减少了冲突的风险,并提供了更大的灵活性。
otarza '16

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.