Як видалити об'єкт конфігурації з активної конфігурації?


41

Я пишу користувальницький модуль для Drupal 8. Він визначає об’єкт конфігурації сховища поля у файлі, який називається модулями / mymod / config / install / 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

Модуль Easy Install є, щоб виправити та уникнути цієї проблеми повністю 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 '
Ерік Штейнборн

Що з видаленням кількох конфігурацій? наприкладmigrate_plus.migration.*
Nic

@Nic це не дуже, але перегляньте моє рішення щодо іншого питання, щоб видалити кілька: drupal.stackexchange.com/questions/214132/…
CR47

Якщо у вас є прямий доступ до бази даних, дуже обережно видаліть кримінальні записи з configтаблиці.
Найдим

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

Можна використовувати наступні методи. Використовуйте наступний код у moll_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
Це, можливо, змінилося останнім часом, але зараз воно дещо інакше. залежності: примусовий: модуль: - вашмодуль
hw.

1
@hw ваш коментар дуже важливий. Спробуйте додати його до відповіді із посиланням на відповідний запис змін, якщо це можливо. Я не міг його знайти.
rudolfbyker

GAH !! Я знав, що є спосіб це зробити, але не міг згадати частину "примусового:". Це найпростіший і найпростіший спосіб зробити це, особливо при створенні їх у файлах yml.
UnsettlingTrend

використовуючи цей підхід і намагаючись встановити модуль, Drupal видає помилку: Модуль custom_module неможливо увімкнути, оскільки це залежить від наступних модулів, яких не вдалося знайти:
Іван

Привіт Джон, якщо ти не зрозумів це, то це здається, що ти, можливо, поставив свою залежність від модуля в неправильне місце. Конфігурація, описана в цій відповіді, призначена для входу у файли YML у каталозі config / install у вашому модулі. У випадку з ОП це буде у його / її файлі 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: delete the staging 'name' (з лише одним параметром, що передбачає, що ви надали йому тип та підкажете для імені конфігурації.)
Вільям Террелл

6

Drupal :: configFactory () -> reset () не видаляє об’єкт config. Для цього бігайтеDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Ви можете використовувати консоль Drupal для видалення активної конфігурації, за допомогою drupal config:delete active config_to_delete.


1

Знайдіть усі перелічені конфігурації за допомогою списку drush config-list. Потім визначте конфігурацію, яку ви хочете видалити. Використовуйте команду нижче, щоб видалити конфігураційну послідовність


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 використовувати сценарій python? Здається трохи нерозумно.
Патрік

0

Використовуйте модуль Easy Install, щоб уникнути цієї проблеми з конфігурацією, цей модуль дозволить видалити конфігурації під час видалення модуля, він працює, навіть якщо конфігурації модуля не містять примусового в yml або не доданих конфігурацій у додатковій папці.

Конфігурація на зображенні для видалення


0

Видаліть активну конфігурацію зі спеціального модуля

Я зіткнувся з тією ж проблемою, намагаючись видалити конфігураційні файли зі спеціального модуля. У мене є спеціальний модуль, який використовується для передачі спеціальних файлів конфігурації для веб-форми. Оскільки я не досконалий, я хочу мати змогу видалити модуль, редагувати код та перевстановити. Я виявив, що якщо я посилався на свій спеціальний модуль (my_module) у розділі залежності / примусового виконання у файлі config / install yml, коли я видалив свій модуль, файли конфігурації також видаляться.

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

0

Усі ці відповіді рекомендують видалити базовий об'єкт config безпосередньо, але правильним способом є видалення об'єкта через систему зберігання даних.

Наприклад, якщо у вас є стиль зображення з ідентифікатором "великий", і ви хочете його видалити, слід зробити це:

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

Роблячи це таким чином, ядро ​​викличе "попереднє" перед видаленням конфігурації та "видалення" гаків після видалення конфігурації, на які інші модулі можуть розраховувати для виконання різних операцій очищення.


0

Щоб видалити конфігурацію, коли модуль буде видалено, використовуйте kuk_uninstall .

Потім видаліть конфігурацію:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.