Bagaimana cara menghapus objek konfigurasi dari konfigurasi aktif?

41

Saya sedang menulis modul khusus untuk Drupal 8. Ini mendefinisikan objek konfigurasi penyimpanan bidang, dalam file bernama modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

Masalahnya adalah ini tidak dihapus ketika saya menghapus modul; rupanya tertinggal karena, ketika saya menginstal ulang modul, saya mendapatkan crash.

drush -y pm-uninstall mymod
drush cr
drush -y en mymod

pengecualian 'Drupal \ Core \ Config \ PreExistingConfigException' dengan pesan 'Objek konfigurasi (field.storage.bloom_stem.bs_twitter_ac) yang disediakan oleh mymod sudah ada dalam konfigurasi aktif'

Jadi sepertinya saya perlu beberapa cara menghapus objek konfigurasi ini secara manual. Apakah saya perlu memberikan beberapa kode lagi yang menghapusnya ketika modul dihapus instalasinya?

artfulrobot
sumber
Sepertinya masalah yang sama: drupal.stackexchange.com/questions/173684/…
othermachines
Modul Instalasi Mudah ada untuk memperbaiki & menghindari masalah ini sepenuhnya drupal.org/project/easy_install
Karthikeyan Manivasagam

Jawaban:

53

Cara termudah untuk melakukan ini saat ini adalah menggunakan drush php(atau core-cli) untuk membuka sesi interaktif.

Kemudian gunakan:

Drupal::configFactory()->getEditable('system.menu.devel')->delete();

Fungsi ini akan ditambahkan ke konsol Drupal juga.

lexicant
sumber
1
Ini menyelesaikan masalah dengan sempurna. Ubah 'system.menu.devel' menjadi `the_setting.you.want.to.delete '
Eric Steinborn
Bagaimana dengan menghapus banyak konfigurasi? misalnyamigrate_plus.migration.*
Nic
@Nic itu tidak cantik, tetapi periksa solusi saya pada pertanyaan Anda yang lain untuk menghapus beberapa: drupal.stackexchange.com/questions/214132/…
CR47
Jika Anda memiliki akses langsung ke database, sangat hati-hati menghapus entri yang menyinggung dari configtabel.
Naidim
30

Perintah Drush untuk menghapus objek konfigurasi: drush config-delete <config_name>.

ya.teck
sumber
dalam kasus multi-situs,drush -l your.site.domain config-delete <config_name>
muskie9
2
Format singkat adalahdrush cdel <config_name>
Sharique
berhati-hatilah, jika Anda menghapus konfigurasi apa pun, Anda juga harus melakukan drush crsetelahnya untuk menghapus semua dependensi konfigurasi yang di-cache jika tidak, Anda mungkin mendapatkan sesuatu yang terlihat seperti ini:Error: Call to a member function getConfigDependencyKey() on null
wilco
13

Anda dapat menggunakan metode berikut. Gunakan kode berikut di hook_uninstall

Drupal::configFactory()->reset('field.storage.bloom_stem.bs_twitter_ac');

ATAU

dalam file yml Anda bisa meletakkan dependensi seperti


dependencies:
  module:
    - yourmodule
  enforced:
    module:
      - yourmodule

maka drupal akan secara otomatis menghapus konfigurasi ini untuk menghapus modul Anda seperti dijelaskan oleh Berdir di sini https://drupal.stackexchange.com/a/173879/10436

Ahmad
sumber
5
Ini mungkin telah berubah akhir-akhir ini, tetapi sekarang sedikit berbeda. dependensi: dipaksakan: modul: - modul Anda
hw.
1
@ hw komentar Anda sangat penting. Pertimbangkan untuk menambahkannya ke jawaban, dengan tautan ke catatan perubahan yang relevan jika memungkinkan. Saya tidak dapat menemukannya.
rudolfbyker
GAH !! Saya tahu ada cara untuk melakukan ini, tetapi saya tidak dapat mengingat bagian "ditegakkan:". Ini adalah cara termudah dan terbersih untuk melakukannya, terutama saat membuatnya dalam file yml.
UnsettlingTrend
menggunakan pendekatan ini dan mencoba menginstal modul, Drupal melempar kesalahan: Modul custom_module tidak dapat diaktifkan karena tergantung pada modul berikut yang tidak dapat ditemukan:
John
Hai John, kalau-kalau Anda tidak menemukan jawabannya, sepertinya Anda mungkin telah meletakkan ketergantungan modul Anda di tempat yang salah. Konfigurasi yang dijelaskan dalam jawaban ini dimaksudkan untuk masuk dalam file YML di direktori config / install di modul Anda. Dalam kasus OP ini ada dalam file config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Kedengarannya Anda mungkin telah meletakkan dependensi pada file mymodule.info.yml modul Anda (yang akan mencegah modul Anda tidak dapat menginstal)
Daniel Scott
9

Menggunakan konsol drupal :

$ drupal config:delete 'the_config_to_delete'
VincentLalieu
sumber
1
Documents di: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Tapi bisakah ia melakukan wildcard? misalnyadrupal config:delete 'migrate_plus.migration.*'
Nic
2
Di konsol drupal terbaru, config: delete mengharapkan Anda untuk menentukan jenis config terlebih dahulu, misalnya drupal config:delete active 'name'atau `drupal config: delete staging 'name' (dengan hanya satu parameter yang disediakan, ia akan menganggap Anda telah memberikan jenis dan meminta Anda untuk nama konfigurasi.)
William Turrell
6

Drupal :: configFactory () -> reset () tidak menghapus objek config. Untuk lari iniDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()

Balagan
sumber
2

Anda dapat menggunakan konsol Drupal untuk menghapus konfigurasi aktif, dengan drupal config:delete active config_to_delete.

Umed Godd
sumber
1

Cari semua konfigurasi yang terdaftar menggunakan drush config-list Kemudian identifikasi konfigurasi yang ingin Anda hapus. Gunakan perintah di bawah ini untuk menghapus konfigurasi drush config-delete

Manikanta
sumber
0

Saya meninggalkan skrip Python kecil (namun sedikit over-engineered) yang menghapus sisa konfigurasi. Itu bergantung drush config-delete.

# 'batch_config_delete.py'
# 'drush' has to be available in the current directory

import os
import argparse
import subprocess

MODULES_ROOT = "/var/www/html/MYSITE/web/modules/custom"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Batch config delete.")
    parser.add_argument("-m", "--module", required=True, help="Module name")
    args = parser.parse_args()
    install_path = os.path.join(MODULES_ROOT, args.module, 'config/install')

    for f in os.listdir(install_path):
        if f.endswith('.yml'):
            config_name = os.path.splitext(f)[0]
            print "Delete config:", config_name
            subprocess.call(['drush', 'config-delete', config_name])

Harus dieksekusi seperti ini:

python ../scripts/batch_config_delete.py -m foobar
turdus-merula
sumber
1
Anda meminta pengembang PHP untuk menggunakan skrip python? Agak konyol.
Patrick
0

Gunakan Mudah Install modul untuk menghindari hal ini masalah konfigurasi, modul ini akan memungkinkan untuk menghapus konfigurasi saat menghapus modul, bekerja bahkan jika konfigurasi modul ini tidak mengandung ditegakkan di YML atau tidak konfigurasi ditambahkan dalam opsional folder.

Konfigurasi pada gambar instalasi

Karthikeyan Manivasagam
sumber
0

Hapus Instalasi Konfigurasi Aktif dari Modul Kustom

Saya mengalami masalah yang sama ketika mencoba mencopot file konfigurasi dari modul khusus. Saya memiliki modul khusus yang digunakan untuk mengirimkan file konfigurasi khusus untuk formulir web. Karena saya tidak sempurna, saya ingin dapat menghapus modul, mengedit kode dan menginstal ulang. Saya menemukan jika saya mereferensikan modul khusus saya (my_module) di bagian dependensi / yang dipaksakan dalam file config / install yml, ketika saya menghapus modul saya, file konfigurasi juga akan dihapus.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here
Robert Ben Parkinson
sumber
0

Semua jawaban ini merekomendasikan untuk menghapus objek konfigurasi yang mendasarinya secara langsung, tetapi cara yang benar adalah dengan menghapus entitas melalui sistem penyimpanan entitas.

Misalnya, jika Anda memiliki gaya gambar dengan ID "besar" dan Anda ingin menghapusnya, Anda harus melakukan ini:

\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();

Melakukannya dengan cara ini, core akan memanggil "pra-setel" sebelum konfigurasi dihapus dan "hapus" kait setelah konfigurasi dihapus, yang mana modul lain mungkin bergantung untuk melakukan berbagai operasi pembersihan.

Brian
sumber
0

Gunakan hook_uninstall untuk menghapus konfigurasi, ketika modul dihapus instalasinya.

Kemudian hapus konfigurasi:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Jdrupal
sumber