Come rimuovo un oggetto di configurazione dalla configurazione attiva?


41

Sto scrivendo un modulo personalizzato per Drupal 8. Definisce un oggetto di configurazione della memoria di campo, in un file chiamato modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

Il problema è che questo non viene rimosso quando disinstallo il modulo; apparentemente viene lasciato indietro perché, quando reinstallo il modulo, ottengo un arresto anomalo.

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

eccezione "Drupal \ Core \ Config \ PreExistingConfigException" con messaggio "Gli oggetti di configurazione (field.storage.bloom_stem.bs_twitter_ac) forniti da mymod esistono già nella configurazione attiva"

Quindi sembra che abbia bisogno di rimuovere manualmente questo oggetto di configurazione. Devo fornire altro codice che lo elimini quando il modulo viene disinstallato?



Il modulo Easy Install è lì per risolvere ed evitare completamente questo problema drupal.org/project/easy_install
Karthikeyan Manivasagam

Risposte:


53

Il modo più semplice per farlo al momento è usare drush php(o core-cli) per aprire una sessione interattiva.

Quindi utilizzare:

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

Questa funzionalità verrà aggiunta anche alla console Drupal .


1
Questo ha risolto perfettamente il problema. Cambia "system.menu.devel" in "the_setting.you.want.to.delete"
Eric Steinborn,

Che ne dici di rimuovere più configurazioni? ad es.migrate_plus.migration.*
Nic

@Nic non è carino, ma controlla la mia soluzione sull'altra tua domanda per eliminarne più: drupal.stackexchange.com/questions/214132/…
CR47

Se hai accesso diretto al database, elimina con molta attenzione le voci offensive dalla configtabella.
Naidim,

30

Comando Drush per oggetto di configurazione di eliminazione: drush config-delete <config_name>.


in caso di siti multipli,drush -l your.site.domain config-delete <config_name>
muskie9,

2
formato abbreviato èdrush cdel <config_name>
Sharique

fai attenzione, se elimini eventuali drush crconfigurazioni , dovresti anche fare un secondo per rimuovere eventuali dipendenze di configurazione memorizzate nella cache, altrimenti potresti ottenere qualcosa che assomiglia a questo:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

Puoi usare i seguenti metodi. Utilizzare il seguente codice in hook_uninstall

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

O

nel file yml puoi inserire le dipendenze come


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

drupal rimuoverà automaticamente queste configurazioni disinstallando il modulo come descritto da Berdir qui https://drupal.stackexchange.com/a/173879/10436


5
Questo potrebbe essere cambiato di recente, ma ora è leggermente diverso. dipendenze: applicato: modulo: - yourmodule
hw.

1
@hw il tuo commento è molto importante. Prendi in considerazione l'idea di aggiungerlo alla risposta, se possibile con un link al relativo record di modifica. Non sono riuscito a trovarlo.
Rudolfbyker,

GAH !! Sapevo che c'era un modo per farlo, ma non riuscivo a ricordare la parte "forzata:". Questo è il modo più semplice e pulito per farlo, specialmente quando li crei in file yml.
Disordinato:

usando questo approccio e cercando di installare il modulo, Drupal genera l'errore: Il modulo custom_module non può essere abilitato perché dipende dai seguenti moduli che non sono stati trovati:
John

Ciao John, nel caso in cui non finissi per capirlo, sembra che potresti aver posto la dipendenza del tuo modulo nel posto sbagliato. La configurazione descritta in questa risposta ha lo scopo di andare nei file YML nella directory config / install del modulo. Nel caso del PO questo sarebbe nel suo file config / install / field.storage.bloom_stem.bs_twitter_ac.yml. Sembra che potresti aver inserito la dipendenza nel file mymodule.info.yml del tuo modulo (ciò impedirà al tuo modulo di essere installato)
Daniel Scott,

9

Utilizzando la console drupal :

$ drupal config:delete 'the_config_to_delete'

1
Documenti su: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Ma può fare jolly? ad es.drupal config:delete 'migrate_plus.migration.*'
Nic

2
Nell'ultima console di Drupal, config: delete si aspetta di specificare prima il tipo di configurazione , ad es. drupal config:delete active 'name'O `drupal config: elimina lo staging 'name' (con un solo parametro fornito, si supporrà che tu gli abbia dato il tipo e ti chiederà per il nome della configurazione.)
William Turrell,

6

Drupal :: configFactory () -> reset () non cancella l'oggetto config. Per questa corsaDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Puoi usare la console Drupal per eliminare la configurazione attiva, con drupal config:delete active config_to_delete.


1

Cerca tutte le configurazioni elencate usando drush config-list Quindi identifica la configurazione che desideri eliminare. Utilizzare il comando seguente per eliminare la configurazione drush config-delete


0

Lascio qui un piccolo script Python (ma un po 'troppo ingegnerizzato) che rimuove gli avanzi di configurazione. Si affida 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])

Dovrebbe essere eseguito in questo modo:

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

1
Stai chiedendo agli sviluppatori PHP di usare uno script Python? Sembra un po 'sciocco.
Patrick,

0

Utilizza il modulo Easy Install per evitare questi problemi di configurazione, questo modulo consentirà di eliminare le configurazioni durante la disinstallazione di un modulo, funziona anche se le configurazioni di un modulo non contengono forzate in yml o configurazioni non aggiunte nella cartella opzionale .

Configurazione sull'immagine di disinstallazione


0

Disinstallare la configurazione attiva dal modulo personalizzato

Ho riscontrato lo stesso problema nel tentativo di disinstallare i file di configurazione da un modulo personalizzato. Ho un modulo personalizzato utilizzato per passare i file di configurazione personalizzati per il modulo web. Dato che non sono perfetto, voglio essere in grado di disinstallare il modulo, modificare il codice e reinstallare. Ho trovato se ho fatto riferimento al mio modulo personalizzato (my_module) nella sezione dipendenze / forzata nel file yml config / install, quando ho disinstallato il mio modulo anche i file di configurazione verranno disinstallati.

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

0

Tutte queste risposte raccomandano di eliminare direttamente l'oggetto di configurazione sottostante, ma il modo corretto è quello di eliminare l'entità attraverso il sistema di archiviazione delle entità.

Ad esempio, se si dispone di uno stile di immagine con ID "grande" e si desidera eliminarlo, è necessario procedere come segue:

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

In questo modo, core invocherà "predelete" prima che la configurazione venga eliminata e "elimini" gli hook dopo l'eliminazione della configurazione, su cui altri moduli possono fare affidamento per eseguire varie operazioni di clean up.


0

Utilizzare hook_uninstall per rimuovere la configurazione, quando il modulo viene disinstallato.

Quindi eliminare la configurazione:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.