Как удалить объект конфигурации из активной конфигурации?


41

Я пишу пользовательский модуль для Drupal 8. Он определяет объект конфигурации хранилища полей в файле modules / 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/…
машины

Модуль 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

@ Нет, это не красиво, но посмотрите мое решение по другому вопросу, чтобы удалить несколько: drupal.stackexchange.com/questions/214132/…
CR47

Если у вас есть прямой доступ к базе данных, очень осторожно удалите нарушающие записи из configтаблицы.
Найдим

30

Drush команда для удаления объекта конфигурации: drush config-delete <config_name>.


в случае drush -l your.site.domain config-delete <config_name>
мультисайта

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 автоматически удалит эти настройки при удалении вашего модуля, как описано Бердиром здесь https://drupal.stackexchange.com/a/173879/10436


5
Это могло измениться в последнее время, но сейчас это немного изменилось. зависимости: принудительно: module: - yourmodule
hw.

1
@hw твой комментарий очень важен. Попробуйте добавить его к ответу, если возможно, со ссылкой на соответствующую запись изменений. Я не мог найти это.
rudolfbyker

GAH !! Я знал, что есть способ сделать это, но я не мог вспомнить «принудительную» часть. Это самый простой и чистый способ сделать это, особенно при создании их в файлах yml.
UnsettlingTrend

Используя этот подход и пытаясь установить модуль, Drupal выдает ошибку: Модуль custom_module не может быть включен, потому что он зависит от следующих модулей, которые не могут быть найдены:
John

Привет, Джон, если ты не понял, это звучит так, как будто ты положил свою зависимость от модуля не в том месте. Конфигурация, описанная в этом ответе, предназначена для размещения в файлах YML в каталоге config / install в вашем модуле. В случае ОП это будет в его / ее файле config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Похоже, что вы, возможно, вместо этого поместили зависимость в файл mymodule.info.yml вашего модуля (это помешает установке вашего модуля)
Даниэль Скотт,

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 staging 'name' (если указан только один параметр, он будет предполагать, что вы указали тип, и предложит вам для имени конфига.)
Уильям Туррелл

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. Затем определите конфигурацию, которую вы хотите удалить. Используйте приведенную ниже команду для удаления конфигурации 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 использовать скрипт на 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

Все эти ответы рекомендуют удалять базовый объект конфигурации напрямую, но правильный способ - удалить сущность через систему хранения сущностей.

Например, если у вас есть стиль изображения с идентификатором «большой», и вы хотите удалить его, вы должны сделать это:

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

Делая это таким образом, ядро ​​будет вызывать «предустановленный» до того, как конфиг будет удален, и «удалять» перехватчики после того, как конфиг будет удален, на что другие модули могут положиться для выполнения различных операций очистки.


0

Используйте hook_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.