Como removo um objeto de configuração da configuração ativa?

41

Estou escrevendo um módulo personalizado para o Drupal 8. Ele define um objeto de configuração de armazenamento em campo, em um arquivo chamado modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

O problema é que isso não é removido quando eu desinstalo o módulo; aparentemente ele foi deixado para trás porque, quando reinstalo o módulo, ocorre uma falha.

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

a exceção 'Drupal \ Core \ Config \ PreExistingConfigException' com a mensagem 'Objetos de configuração (field.storage.bloom_stem.bs_twitter_ac) fornecidos pelo mymod já existem na configuração ativa'

Então, parece que preciso de alguma maneira remover manualmente esse objeto de configuração. Preciso fornecer mais um código que o exclua quando o módulo é desinstalado?

artfulrobot
fonte
Parece um problema semelhante: drupal.stackexchange.com/questions/173684/…
othermachines
Instalação fácil módulo está lá para corrigir e evitar este problema completamente drupal.org/project/easy_install
Karthikeyan Manivasagam

Respostas:

53

A maneira mais fácil de fazer isso no momento é usar drush php(ou core-cli) para abrir uma sessão interativa.

Então use:

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

Essa funcionalidade também será adicionada ao console do Drupal .

lexicant
fonte
1
Isso resolveu perfeitamente o problema. Altere 'system.menu.devel' para `the_setting.you.want.to.delete '
Eric Steinborn
Que tal remover várias configurações? por exemplomigrate_plus.migration.*
Nic
@ Nic não é bonito, mas confira minha solução em sua outra pergunta para excluir vários: drupal.stackexchange.com/questions/214132/…
CR47
Se você tiver acesso direto ao banco de dados, exclua com muito cuidado as entradas incorretas da configtabela.
Naidim
30

Comando Drush a objeto de configuração de exclusão: drush config-delete <config_name>.

ya.teck
fonte
em casos de multi-site,drush -l your.site.domain config-delete <config_name>
muskie9
2
formato abreviado édrush cdel <config_name>
Sharique 12/03
lembre-se, se você excluir quaisquer configurações, também deverá fazer o drush crseguinte para remover as dependências de configurações em cache, caso contrário poderá obter algo parecido com isto:Error: Call to a member function getConfigDependencyKey() on null
wilco
13

Você pode usar os seguintes métodos. Use o seguinte código em hook_uninstall

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

OU

no arquivo yml, você pode colocar as dependências como


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

o drupal removerá automaticamente essas configurações ao desinstalar o módulo, conforme descrito por Berdir aqui https://drupal.stackexchange.com/a/173879/10436

Ahmad
fonte
5
Isso pode ter mudado recentemente, mas agora é um pouco diferente. dependências: impostas: module: - yourmodule
hw.
1
@hw seu comentário é muito importante. Considere adicioná-lo à resposta, com um link para o registro de alterações relevante, se possível. Não consegui encontrar.
Rudolfbyker
GAH !! Eu sabia que havia uma maneira de fazer isso, mas não conseguia me lembrar da parte "reforçada:". Essa é a maneira mais simples e limpa de fazer isso, especialmente ao criá-los em arquivos yml.
precisa
usando esta abordagem e tentar instalar o módulo, Drupal gera o erro: Módulo custom_module não pode ser habilitado porque depende dos seguintes módulos que não pôde ser encontrado:
John
Olá John, caso você não tenha descoberto, parece que você pode ter colocado a dependência do módulo no lugar errado. A configuração descrita nesta resposta é destinada aos arquivos YML no diretório config / install do seu módulo. No caso do OP, isso estaria em seu arquivo config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Soa como se você pode ter colocado a dependência no arquivo mymodule.info.yml do módulo em vez (que irá impedir o seu módulo de ser capaz de instalar)
Daniel Scott
9

Usando o console drupal :

$ drupal config:delete 'the_config_to_delete'
VincentLalieu
fonte
1
Documentos em: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Mas ele pode fazer curingas? por exemplo,drupal config:delete 'migrate_plus.migration.*'
Nic
2
No console mais recente do drupal, o config: delete espera que você especifique primeiro o tipo de configuração , por exemplo, drupal config:delete active 'name'ou `drupal config: delete staging 'name' (com apenas um parâmetro fornecido, ele assumirá que você deu o tipo e solicitará para o nome da configuração).
William Turrell
6

Drupal :: configFactory () -> reset () não exclui o objeto de configuração. Para esta corridaDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()

balagan
fonte
2

Você pode usar o console do Drupal para excluir a configuração ativa, com drupal config:delete active config_to_delete.

Umed Godd
fonte
1

Pesquise todas as configurações listadas usando drush config-list. Em seguida, identifique a configuração que você deseja excluir. Use o comando abaixo para excluir a configuração drush config-delete

Manikanta
fonte
0

Deixo aqui um pequeno script Python (ainda um pouco excedente da engenharia) que remove as sobras da configuração. Depende 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])

Deve ser executado assim:

python ../scripts/batch_config_delete.py -m foobar
turdus-merula
fonte
1
Você está pedindo aos desenvolvedores de PHP que usem um script python? Parece um pouco bobo.
314 Patrick
0

Use o módulo Easy Install para evitar esses problemas de configuração; este módulo permitirá excluir configurações durante a desinstalação de um módulo; ele funciona mesmo que as configurações de um módulo não contenham imposição em yml ou não tenham sido adicionadas na pasta opcional .

Configuração na imagem de desinstalação

Karthikeyan Manivasagam
fonte
0

Desinstalar a configuração ativa do módulo personalizado

Eu encontrei o mesmo problema ao tentar desinstalar arquivos de configuração de um módulo personalizado. Eu tenho um módulo personalizado usado para passar arquivos de configuração personalizados para o formulário da web. Como não sou perfeita, quero poder desinstalar o módulo, editar o código e reinstalar. Descobri que se referisse meu módulo personalizado (my_module) na seção dependências / imposta no arquivo config / install yml, quando eu desinstalava meu módulo, os arquivos de configuração também eram desinstalados.

   langcode: en
    status: true
    dependencies:
        enforced:
            module:
                - webform
                - my_module // reference your module here
Robert Ben Parkinson
fonte
0

Todas essas respostas recomendam a exclusão direta do objeto de configuração subjacente, mas a maneira correta é excluir a entidade através do sistema de armazenamento da entidade.

Por exemplo, se você possui um estilo de imagem com o ID "grande" e deseja excluí-lo, faça o seguinte:

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

Fazendo assim, o núcleo invocará "pré-exclusão" antes da exclusão da configuração e ganchos "delete" após a exclusão da configuração, na qual outros módulos podem confiar para executar várias operações de limpeza.

Brian
fonte
0

Use hook_uninstall para remover a configuração quando o módulo for desinstalado.

Em seguida, exclua a configuração:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Jdrupal
fonte