Làm cách nào để xóa đối tượng cấu hình khỏi cấu hình hoạt động?


41

Tôi đang viết một mô-đun tùy chỉnh cho Drupal 8. Nó xác định một đối tượng cấu hình lưu trữ trường, trong một tệp có tên là mô-đun / mymod / config / install / field.st Storage.bloom_stem.bs_twitter_ac.yml.

Vấn đề là điều này không được gỡ bỏ khi tôi gỡ cài đặt mô-đun; nó dường như bị bỏ lại bởi vì, khi tôi cài đặt lại mô-đun, tôi gặp sự cố.

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

ngoại lệ 'Drupal \ Core \ Config \ PreEx hiệnConfigException' với thông báo 'Các đối tượng cấu hình (field.st Storage.bloom_stem.bs_twitter_ac) được cung cấp bởi mymod đã tồn tại trong cấu hình hoạt động'

Vì vậy, có vẻ như tôi cần một số cách thủ công loại bỏ đối tượng cấu hình này. Tôi có cần cung cấp thêm một số mã xóa nó khi mô-đun được gỡ cài đặt không?


Trông giống như một vấn đề tương tự: drupal.stackexchange.com/questions/173684/iêu
othermachines

Mô-đun Easy Install có sẵn để khắc phục và tránh vấn đề này hoàn toàn drupal.org/project/easy_install
Karthikeyan Manivasagam 13/12/18

Câu trả lời:


53

Cách dễ nhất để làm điều này vào lúc này là sử dụng drush php(hoặc core-cli) để mở một phiên tương tác.

Sau đó sử dụng:

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

Chức năng này cũng sẽ được thêm vào bảng điều khiển Drupal .


1
Điều này giải quyết hoàn hảo vấn đề. Thay đổi 'system.menu.devel' thành `the_setting.you.want.to.delete '
Eric Steinborn

Điều gì về việc loại bỏ nhiều cấu hình? ví dụmigrate_plus.migration.*
Nic

@Nic nó không đẹp, nhưng hãy kiểm tra giải pháp của tôi về câu hỏi khác của bạn để xóa nhiều: drupal.stackexchange.com/questions/214132/...
CR47

Nếu bạn có quyền truy cập trực tiếp vào cơ sở dữ liệu, hãy cẩn thận xóa các mục vi phạm khỏi configbảng.
Naidim

30

Lệnh Drush để xóa đối tượng cấu hình : drush config-delete <config_name>.


trong các trường hợp của nhiều trang web,drush -l your.site.domain config-delete <config_name>
muskie9

2
định dạng rút ngắn làdrush cdel <config_name>
Sharique

Hãy chú ý, nếu bạn xóa bất kỳ cấu hình nào, bạn cũng nên thực hiện drush crsau để xóa mọi phụ thuộc cấu hình được lưu trong bộ nhớ cache nếu không bạn có thể nhận được một cái gì đó trông như thế này:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

Bạn có thể sử dụng các phương pháp sau. Sử dụng mã sau đây trong hook_uninstall

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

HOẶC LÀ

trong tệp yml bạn có thể đặt các phụ thuộc như


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

sau đó drupal sẽ tự động xóa cấu hình này khi gỡ cài đặt mô-đun của bạn như được mô tả bởi Berdir tại đây https://drupal.stackexchange.com/a/173879/10436


5
Điều này có thể đã thay đổi gần đây, nhưng bây giờ nó hơi khác. phụ thuộc: thực thi: mô-đun: - yourmodule
hw.

1
@hw bình luận của bạn rất quan trọng. Xem xét thêm nó vào câu trả lời, với một liên kết đến hồ sơ thay đổi có liên quan nếu có thể. Tôi không thể tìm thấy nó.
rudolfbyker

GÁI !! Tôi biết có một cách để làm điều này, nhưng tôi không thể nhớ phần "được thi hành:". Đây là cách đơn giản nhất, sạch nhất để làm điều đó, đặc biệt là khi tạo chúng trong các tệp yml.
Bất ổn Xu hướng

sử dụng phương pháp này và cố gắng cài đặt mô-đun, Drupal đưa ra lỗi: Mô-đun custom_module không thể được bật vì nó phụ thuộc vào các mô-đun sau không thể tìm thấy:
John

Xin chào John, trong trường hợp bạn không tìm ra nó, có vẻ như bạn có thể đã đặt phụ thuộc mô-đun của mình vào sai vị trí. Cấu hình được mô tả trong câu trả lời này dự định sẽ đi vào (các) tệp YML trong thư mục config / install trong mô-đun của bạn. Trong trường hợp của OP, nó sẽ nằm trong tệp config / install / field.st Storage.bloom_stem.bs_twitter_ac.yml của anh ấy / cô ấy. Nghe có vẻ như bạn có thể đã đặt sự phụ thuộc vào tệp mymodule.info.yml của mô-đun của bạn (điều đó sẽ ngăn mô-đun của bạn không thể cài đặt)
Daniel Scott

9

Sử dụng bảng điều khiển drupal :

$ drupal config:delete 'the_config_to_delete'

1
Tài liệu tại: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/ mẹo Nhưng nó có thể làm ký tự đại diện không? ví dụdrupal config:delete 'migrate_plus.migration.*'
Nic

2
Trong bảng điều khiển drupal mới nhất, config: xóa mong muốn bạn chỉ định loại cấu hình trước, ví dụ: drupal config:delete active 'name'hoặc 'drupal config: xóa staging' name '(chỉ với một tham số được cung cấp, nó sẽ cho rằng bạn đã cung cấp cho nó loại và nhắc bạn cho tên cấu hình.)
William Turrell

6

Drupal :: configFactory () -> reset () không xóa đối tượng config. Cho lần chạy nàyDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Bạn có thể sử dụng bảng điều khiển Drupal để xóa cấu hình hoạt động drupal config:delete active config_to_delete.


1

Tìm kiếm tất cả các cấu hình được liệt kê bằng danh sách cấu hình drush Sau đó xác định cấu hình mà bạn muốn xóa. Sử dụng lệnh dưới đây để xóa cấu hình drush config-xóa


0

Tôi để lại ở đây một đoạn mã Python nhỏ (nhưng hơi quá kỹ) để loại bỏ phần còn lại của cấu hình. Nó dựa vào 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])

Nên được thực hiện như thế này:

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

1
Bạn đang yêu cầu các nhà phát triển PHP sử dụng một kịch bản python? Có vẻ hơi ngớ ngẩn.
Patrick

0

Sử dụng mô-đun Easy Install để tránh các vấn đề cấu hình này, mô-đun này sẽ cho phép xóa cấu hình trong khi gỡ cài đặt mô-đun, nó hoạt động ngay cả khi cấu hình của mô-đun không chứa thực thi trong yml hoặc không thêm cấu hình trong thư mục tùy chọn .

Cấu hình trên hình ảnh gỡ cài đặt


0

Gỡ cài đặt cấu hình hoạt động khỏi mô-đun tùy chỉnh

Tôi gặp vấn đề tương tự khi cố gắng gỡ cài đặt các tệp cấu hình từ một mô-đun tùy chỉnh. Tôi có một mô-đun tùy chỉnh được sử dụng để vượt qua các tệp cấu hình tùy chỉnh cho biểu mẫu web. Vì tôi không hoàn hảo, tôi muốn có thể gỡ cài đặt mô-đun, chỉnh sửa mã và cài đặt lại. Tôi tìm thấy nếu tôi đã tham chiếu mô-đun tùy chỉnh của mình (my_module) trong phần phụ thuộc / được thi hành trong tệp cấu hình / cài đặt yml, khi tôi gỡ cài đặt mô-đun của mình, các tệp cấu hình cũng sẽ gỡ cài đặt.

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

0

Tất cả các câu trả lời này khuyên bạn nên xóa trực tiếp đối tượng cấu hình bên dưới, nhưng cách chính xác là xóa thực thể thông qua hệ thống lưu trữ thực thể.

Ví dụ: nếu bạn có kiểu ảnh có ID "lớn" và bạn muốn xóa nó, bạn nên làm điều này:

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

Làm theo cách này, lõi sẽ gọi "tiền xử lý" trước khi cấu hình bị xóa và "xóa" móc sau khi cấu hình bị xóa, mà các mô-đun khác có thể dựa vào để thực hiện các hoạt động dọn dẹp khác nhau.


0

Sử dụng hook_uninstall để xóa cấu hình, khi mô-đun được gỡ cài đặt.

Sau đó xóa cấu hình:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.