ฉันจะลบวัตถุการกำหนดค่าออกจากการกำหนดค่าที่ใช้งานอยู่ได้อย่างไร


41

ฉันกำลังเขียนโมดูลที่กำหนดเองสำหรับ Drupal 8 มันกำหนดวัตถุการกำหนดค่าการจัดเก็บข้อมูลในไฟล์ที่เรียกว่าโมดูล / mymod / config / ติดตั้ง / field.storage.bloom_stem.bs_twitter_ac.yml

ปัญหาคือว่าสิ่งนี้จะไม่ถูกลบเมื่อฉันถอนการติดตั้งโมดูล; เห็นได้ชัดว่ามันถูกทิ้งไว้เพราะเมื่อฉันติดตั้งโมดูลอีกครั้ง

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

ข้อยกเว้น 'Drupal \ Core \ Config \ PreExistingConfigException' พร้อมกับข้อความ 'วัตถุการกำหนดค่า (field.storage.bloom_stem.bs_twitter_ac) ให้โดย mymod อยู่ในการกำหนดค่าที่ใช้งานอยู่'

ดังนั้นฉันต้องการบางวิธีลบวัตถุการกำหนดค่านี้ด้วยตนเอง ฉันต้องระบุรหัสเพิ่มเติมที่จะลบมันเมื่อโมดูลถูกถอนการติดตั้งหรือไม่?


ดูเหมือนปัญหาที่คล้ายกัน: drupal.stackexchange.com/questions/173684/…
othermachines

โมดูลติดตั้งง่ายจะมีการแก้ไขและหลีกเลี่ยงปัญหานี้อย่างสมบูรณ์drupal.org/project/easy_install
Karthikeyan Manivasagam

คำตอบ:


53

วิธีที่ง่ายที่สุดในการทำเช่นนี้ในขณะนี้คือการใช้drush php(หรือcore-cli) เพื่อเปิดเซสชันการโต้ตอบ

จากนั้นใช้:

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

ฟังก์ชันนี้จะถูกเพิ่มเข้าไปในคอนโซลของ Drupalเช่นกัน


1
สิ่งนี้สามารถแก้ไขปัญหาได้อย่างสมบูรณ์แบบ เปลี่ยน 'system.menu.devel' เป็น `the_setting.you.want.to.delete '
Eric Steinborn

สิ่งที่เกี่ยวกับการลบการกำหนดค่าหลาย ๆ เช่นmigrate_plus.migration.*
Nic

@ ไม่มีมันไม่สวย แต่ลองดูทางออกของฉันในคำถามอื่นของคุณเพื่อลบหลายรายการ: drupal.stackexchange.com/questions/214132/…
CR47

หากคุณมีการเข้าถึงฐานข้อมูลโดยตรงให้ลบรายการที่กระทำผิดออกจากconfigตารางอย่างระมัดระวัง
Naidim

30

คำสั่ง Drush drush config-delete <config_name>ไปยังวัตถุที่กำหนดค่าลบ:


ในกรณีของเว็บไซต์หลายแห่ง,drush -l your.site.domain config-delete <config_name>
muskie9

2
รูปแบบที่สั้นลงคือdrush cdel <config_name>
Sharique

โปรดระวังหากคุณลบการกำหนดค่าใด ๆ คุณควรทำdrush crหลังจากลบการกำหนดค่าที่เก็บไว้ในแคชมิฉะนั้นคุณอาจได้รับสิ่งที่มีลักษณะเช่นนี้:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

คุณสามารถใช้วิธีการต่อไปนี้ ใช้รหัสต่อไปนี้ใน hook_uninstall

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

หรือ

ในไฟล์ yml คุณสามารถใส่การอ้างอิงเช่น


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

จากนั้น drupal จะลบการกำหนดค่านี้โดยอัตโนมัติเมื่อถอนการติดตั้งโมดูลของคุณตามที่อธิบายโดย Berdir ที่นี่https://drupal.stackexchange.com/a/173879/10436


5
อาจมีการเปลี่ยนแปลงเมื่อเร็ว ๆ นี้ แต่ตอนนี้มันแตกต่างกันเล็กน้อย การพึ่งพา: บังคับ: โมดูล: - yourmodule
hw

1
@ ความคิดเห็นของคุณมีความสำคัญมาก พิจารณาเพิ่มลงในคำตอบพร้อมลิงค์ไปยังบันทึกการเปลี่ยนแปลงที่เกี่ยวข้องหากเป็นไปได้ ฉันหามันไม่เจอ
rudolfbyker

GAH !! ฉันรู้ว่ามีวิธีการทำเช่นนี้ แต่ฉันจำไม่ได้ว่าส่วน "บังคับ:" นี่เป็นวิธีที่ง่ายและสะอาดที่สุดในการทำโดยเฉพาะเมื่อสร้างในไฟล์ yml
UnsettlingTrend

ใช้วิธีการนี้และพยายามติดตั้งโมดูล Drupal ส่งข้อผิดพลาด: โมดูล custom_module ไม่สามารถเปิดใช้งานได้เนื่องจากขึ้นอยู่กับโมดูลต่อไปนี้ซึ่งไม่สามารถหาได้:
John

สวัสดีจอห์นในกรณีที่คุณไม่ได้คิดออกมันฟังดูเหมือนว่าคุณอาจทำให้การพึ่งพาโมดูลของคุณในสถานที่ที่ไม่ถูกต้อง การกำหนดค่าที่อธิบายในคำตอบนี้มีวัตถุประสงค์เพื่อไปที่ไฟล์ YML ในไดเร็กทอรี config / install ในโมดูลของคุณ ในกรณีของ OP สิ่งนี้จะอยู่ใน / config / install / field.storage.bloom_stem.bs_twitter_ac.yml ของเขา / เธอ ดูเหมือนว่าคุณอาจใส่การพึ่งพาในไฟล์ mymodule.info.yml ของโมดูลของคุณแทน (ซึ่งจะป้องกันไม่ให้โมดูลของคุณไม่สามารถติดตั้งได้)
Daniel Scott

9

การใช้คอนโซล drupal :

$ drupal config:delete 'the_config_to_delete'

1
เอกสารที่: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/ ......แต่มันสามารถทำสัญลักษณ์แทนได้หรือไม่ เช่นdrupal config:delete 'migrate_plus.migration.*'
Nic

2
ในคอนโซล drupal ล่าสุด config: delete คาดว่าคุณจะระบุประเภทการกำหนดค่าก่อนเช่นdrupal config:delete active 'name'`drupal config: ลบการแสดงละคร 'ชื่อ' (โดยมีพารามิเตอร์เพียงตัวเดียวเท่านั้น สำหรับชื่อ config)
William Turrell

6

Drupal :: configFactory () -> reset () ไม่ลบวัตถุปรับแต่ง สำหรับการวิ่งครั้งนี้Drupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

คุณสามารถใช้ Drupal drupal config:delete active config_to_deleteคอนโซลลบการตั้งค่าการใช้งานด้วย


1

ค้นหาการกำหนดค่าทั้งหมดที่แสดงรายการโดยใช้ drush config-list จากนั้นระบุการกำหนดค่าที่คุณต้องการลบ ใช้คำสั่งด้านล่างเพื่อลบการกำหนดค่า drush config-delete


0

ฉันออกจากที่นี่เป็นสคริปต์ Python เล็ก ๆ 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])

ควรถูกประหารชีวิตเช่นนี้:

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

1
คุณกำลังขอให้ผู้พัฒนา PHP ใช้สคริปต์หลาม? ดูเหมือนโง่เล็กน้อย
แพทริค

0

ใช้โมดูลการติดตั้งแบบง่ายเพื่อหลีกเลี่ยงปัญหาการกำหนดค่าโมดูลนี้จะอนุญาตให้ลบการกำหนดค่าในขณะที่ถอนการติดตั้งโมดูลมันจะทำงานแม้ว่าการกำหนดค่าของโมดูลจะไม่มีการบังคับใช้ใน yml หรือไม่ได้เพิ่มการกำหนดค่าในโฟลเดอร์ทางเลือก

การกำหนดค่าเกี่ยวกับอิมเมจการถอนการติดตั้ง


0

ถอนการติดตั้ง Active Configuration ออกจาก Custom Module

ฉันพบปัญหาเดียวกันกับการพยายามถอนการติดตั้งไฟล์กำหนดค่าจากโมดูลที่กำหนดเอง ฉันมีโมดูลที่กำหนดเองที่ใช้ส่งไฟล์การกำหนดค่าเองสำหรับเว็บฟอร์ม เนื่องจากฉันไม่สมบูรณ์แบบฉันต้องการที่จะสามารถถอนการติดตั้งโมดูลแก้ไขรหัสและติดตั้งใหม่ ฉันพบว่าฉันอ้างถึงโมดูลที่กำหนดเองของฉัน (my_module) ในส่วนการพึ่งพา / การบังคับใช้ในไฟล์ config / install yml เมื่อฉันถอนการติดตั้งโมดูลของฉันไฟล์การกำหนดค่าจะถอนการติดตั้งด้วย

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

0

คำตอบทั้งหมดเหล่านี้ขอแนะนำให้ลบออบเจ็กต์การกำหนดค่าต้นแบบโดยตรง แต่วิธีที่ถูกต้องคือการลบเอนทิตีผ่านระบบจัดเก็บข้อมูลเอนทิตี

ตัวอย่างเช่นหากคุณมีสไตล์ของภาพที่มี ID "ใหญ่" และคุณต้องการลบคุณควรทำสิ่งนี้:

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

ด้วยวิธีนี้คอร์จะเรียกใช้ "predelete" ก่อนที่จะลบการกำหนดค่าและ "ลบ" hooks หลังจากลบการกำหนดค่าซึ่งโมดูลอื่นอาจใช้เพื่อดำเนินการล้างข้อมูลต่างๆ


0

ใช้hook_uninstallเพื่อลบการกำหนดค่าเมื่อถอนการติดตั้งโมดูล

จากนั้นลบการกำหนดค่า:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.