Mengekspor bidang untuk tipe konten

11

Fitur ekspor konfigurasi Drupal 8 tampaknya merupakan fitur yang sangat berguna. Namun, saya tidak yakin saya benar-benar mengerti cara kerjanya.

Misalnya, jika saya melakukan ekspor tunggal, pilih "Jenis konten" lalu pilih salah satu dari jenis konten saya, saya berharap ekspor itu berisi deskripsi lengkap dari jenis konten itu. Tapi itu tidak mengandung informasi apa pun tentang bidang dalam tipe konten itu. Jadi jika Anda ingin mengekspor konfigurasi tipe konten untuk digunakan di situs lain, sepertinya tidak mungkin untuk melakukan itu.

Saya tidak yakin saya memahami penggunaan untuk melakukan Ekspor tunggal jika mereka tidak berisi semua data yang diperlukan untuk suatu entitas. Apakah saya melewatkan sesuatu?

James
sumber

Jawaban:

10

MEMPERBARUI

Anda juga dapat mencoba perintah Konsol Drupal drupal config:export:content:type .

Deskripsi itu mengatakan:

Konfigurasi: ekspor: konten: ketik perintah Ekspor jenis konten tertentu dan bidangnya.


Tipe konten dan Bidang adalah 2 konfigurasi terpisah di Drupal 8, jadi jika Anda ingin mengekspor tipe konten dengan bidang, Anda harus mengekspor semua konfigurasi bidang juga.

Modul fitur mungkin bermanfaat untuk konfigurasi pengelompokan, ini belum stabil, saya belum mencobanya, tapi saya pikir mungkin patut dicoba.

otarza
sumber
1
Terima kasih atas jawabannya. Saya kira saya terkejut bahwa ekspor tipe Konten tidak mengandung info. tentang bidang sama sekali, jadi jika Anda ingin melakukannya sendiri, Anda harus mengekspor setiap bidang secara manual.
James
Saya pikir ini berfungsi seperti itu karena jika Anda mengubah pengaturan untuk 1 bidang Anda perlu memperbarui 1 ymlfile khusus untuk bidang itu, bukan seluruh konfigurasi tipe konten. Jadi ada sedikit risiko konflik dan memberikan lebih banyak fleksibilitas.
otarza
0

Saya telah menulis skrip Python (di bawah) yang mengekspor sekelompok item konfigurasi menggunakan drush. Mungkin bermanfaat dalam kasus Anda (sudah dalam kasus saya). Pemakaian:

export_config_group.py -s something -m foobar

Ini dijalankan drush config-list, dapatkan semua item yang namanya mengandung istilah something, lalu simpan modules/custom/foobar/config/install.

Script juga menyesuaikan yml sebagai berikut:

  • menghapus default_config_hashentri saat ada;
  • menghapus uuidentri saat ada.

Script tergantung pada ruamel.yaml untuk memuat dan membuang konfigurasi. Pastikan Anda pip installmelakukannya terlebih dahulu.

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
sumber