Bir yapılandırma nesnesini etkin yapılandırmadan nasıl kaldırırım?


41

Drupal 8 için özel bir modül yazıyorum. Bir alan depolama yapılandırma nesnesini modüller / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml adında bir dosyada tanımlar.

Sorun, modülü kaldırdığımda bunun kaldırılmaması; Görünüşe göre geride kalıyor, çünkü modülü tekrar kurduğumda kilitleniyorum.

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

istisnası 'Drupal \ Core \ Config \ PreExistingConfigException' mesajını içeren 'konfigürasyon nesneleri (field.storage.bloom_stem.bs_twitter_ac) mymod tarafından sağlanan aktif yapılandırmada zaten var'

Bu yüzden, bu konfigürasyon nesnesini manuel olarak nasıl kaldırmam gerektiğini düşünüyorum. Modül kaldırıldığında silinen daha fazla kod vermem gerekir mi?



Kolay Kurulum modülü bu sorunu tamamen gidermek ve önlemek için var drupal.org/project/easy_install
Karthikeyan Manivasagam

Yanıtlar:


53

Şu anda bunu yapmanın en kolay yolu etkileşimli bir oturum açmak için drush php(veya core-cli) kullanmaktır .

Sonra kullan:

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

Bu işlev Drupal konsoluna da eklenecek .


1
Bu mükemmel bir sorunu çözdü. 'System.menu.devel'i' the_setting.you.want.to.delete 'olarak değiştirin
Eric Steinborn

Birden fazla yapılandırmayı kaldırmaktan ne haber? egmigrate_plus.migration.*
Nic

@Nic hoş değil, fakat birden fazla silmek için diğer sorunuzdaki çözümümü
inceleyin

Veritabanına doğrudan erişiminiz varsa, rahatsız edici girişleri configtablodan çok dikkatli bir şekilde silin .
Naidim

30

Silme yapılandırma nesneye Drush komut: drush config-delete <config_name>.


Çok sitenin durumlardadrush -l your.site.domain config-delete <config_name>
muskie9

2
kısaltılmış formattırdrush cdel <config_name>
Sharique

Dikkatli olun, herhangi bir drush crkonfigürasyonu silerseniz, önbelleğe alınmış konfigürasyon bağımlılıklarını kaldırmak için bir süre sonra yapmanız gerekir. Aksi halde şuna benzer bir şey alabilirsiniz:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

Aşağıdaki yöntemleri kullanabilirsiniz. Hook_uninstall'da aşağıdaki kodu kullanın

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

VEYA

yml dosyasına gibi bağımlılıkları koyabilirsiniz


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

sonra drupal, Berdir tarafından açıklanan şekilde modülünüzü kaldırırken bu yapılandırmaları otomatik olarak kaldırır. https://drupal.stackexchange.com/a/173879/10436


5
Bu son zamanlarda değişmiş olabilir, ancak şimdi biraz farklıdır. bağımlılıklar: zorunlu: modül: - yourmodule
hw.

1
@hw yorumunuz çok önemlidir. Mümkünse, ilgili değişiklik kaydına bir bağlantı içeren cevaba eklemeyi düşünün. Bulamadım.
rudolfbyker

GAH !! Bunu yapmanın bir yolu olduğunu biliyordum ama "zorla" kısmını hatırlayamadım. Bu, özellikle yml dosyalarında oluştururken bunu yapmanın en basit ve en temiz yoludur.
UnsettlingTrend

Bu yaklaşımı kullanarak ve modülü kurmaya çalışırken, Drupal hata veriyor: Modül custom_module bulunamıyor çünkü bulunamayan aşağıdaki modüllere bağlı:
John

Merhaba John, çözememeniz durumunda, modül bağımlılığınızı yanlış yere koymuşsunuz gibi geliyor. Bu cevapta açıklanan konfigürasyon, modülünüzdeki config / install dizinindeki YML dosyalarına girmeye yöneliktir. OP'nin durumunda bu, config / install / field.storage.bloom_stem.bs_twitter_ac.yml dosyasında olacaktır. Modülünüzün mymodule.info.yml dosyasına bağımlılığı koymuşa benziyorsunuz (modülün yüklenmesini engelleyecektir)
Daniel Scott

9

Drupal konsolunu kullanarak :

$ drupal config:delete 'the_config_to_delete'

1
Dokümanlar: hechoendrupal.gitbooks.io/drupal-console/content/tr/commands/… Ama joker karakterler yapabilir mi? egdrupal config:delete 'migrate_plus.migration.*'
Nic

2
En son drupal konsolunda config: delete , önce config türünü belirtmenizi bekler , örneğin drupal config:delete active 'name'veya `drupal config: silme 'adını sil (yalnızca bir parametreyle birlikte verilir, size tip ve istemi verdiğinizi varsayar) yapılandırma adı için.)
William Turrell

6

Drupal :: configFactory () -> reset () config nesnesini silmez. Bu çalışma içinDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

İle Drupal konsolunu aktif yapılandırmasını silmek için ile kullanabilirsiniz drupal config:delete active config_to_delete.


1

Drush config-list kullanarak listelenen tüm konfigürasyonları arayın Ardından silmek istediğiniz konfigürasyonu tanımlayın. Drush config-delete yapılandırmasını silmek için aşağıdaki komutu kullanın


0

Buraya, konfigürasyon artıklarını kaldıran minik (henüz biraz fazla mühendislik yapılmış) bir Python betiği bırakıyorum. Dayanır 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])

Böyle yürütülmesi gerekir:

python ../scripts/batch_config_delete.py -m foobar

1
PHP geliştiricilerinden bir python betiği kullanmasını mı istiyorsunuz? Aptalca görünüyor.
Patrick,

0

Bu yapılandırma sorunlarından kaçınmak için Kolay Kurulum modülünü kullanın , bu modül bir modülü kaldırırken yapılan yapılandırmaları silmenize izin verir, bir modülün yapılandırmaları yml'de zorlanan içermiyorsa veya isteğe bağlı klasöre eklenmemiş yapılandırmalar olsa bile çalışır .

Kaldırma görüntüsünde yapılandırma


0

Özel Modülden Etkin Yapılandırma'yı Kaldırma

Özel bir modülden config dosyalarını kaldırmaya çalışırken aynı sorunu yaşadım. Webform için özel konfigürasyon dosyalarını iletmek için kullanılan özel bir modül var. Mükemmel olmadığım için modülü kaldırabilir, kodu düzenleyebilir ve yeniden yükleyebilirim. Özel modülüme (my_module) config / install yml dosyasındaki bağımlılıklar / zorunlu bölümlere başvuruda bulunup bulunmadığımı, modülümü kaldırdığımda yapılandırma dosyalarının da kaldırılacağını öğrendim.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here

0

Tüm bu yanıtlar, alttaki config nesnesinin doğrudan silinmesini önerir, ancak doğru yöntem, varlığı varlık depolama sisteminden silmektir.

Örneğin, "large" kimliğine sahip bir resim stiliniz varsa ve silmek istiyorsanız, şunu yapmalısınız:

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

Bu şekilde, çekirdek, config silinmeden önce "predelete" ve config silindikten sonra "delete" kancalarını çağıracak ve diğer modüllerin çeşitli temizleme işlemlerini gerçekleştirmesi için güvenebileceklerdir.


0

Modül kaldırıldığında yapılandırmayı kaldırmak için hook_uninstall kullanın .

Ardından yapılandırmayı silin:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.