Comment supprimer un objet de configuration de la configuration active?


41

J'écris un module personnalisé pour Drupal 8. Il définit un objet de configuration de stockage dans un fichier appelé modules / mymod / config / install / field.storage.bloom_stem.bs_twitter_ac.yml.

Le problème est que cela n'est pas supprimé lorsque je désinstalle le module; il est apparemment laissé pour compte car, lorsque je réinstalle le module, je tombe en panne.

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

exception 'Drupal \ Core \ Config \ PreExistingConfigException' avec le message 'Les objets de configuration (field.storage.bloom_stem.bs_twitter_ac) fournis par mymod existent déjà dans la configuration active'

Il semble donc que j'ai besoin de savoir comment supprimer manuellement cet objet de configuration. Dois-je fournir un peu plus de code qui le supprime lorsque le module est désinstallé?



Le module Easy Install est là pour résoudre et éviter complètement ce problème drupal.org/project/easy_install
Karthikeyan Manivasagam

Réponses:


53

Le moyen le plus simple de le faire pour le moment est d’utiliser drush php(ou core-cli) d’ouvrir une session interactive.

Alors utilisez:

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

Cette fonctionnalité sera également ajoutée à la console Drupal .


1
Cela a parfaitement résolu le problème. Remplacez 'system.menu.devel' par 'the_setting.you.want.el.delete'
Eric Steinborn

Qu'en est-il de supprimer plusieurs configurations? par exemplemigrate_plus.migration.*
Nic

@Nic, ce n'est pas joli, mais vérifiez ma solution à votre autre question pour supprimer plusieurs réponses
CR47

Si vous avez un accès direct à la base de données, supprimez très soigneusement les entrées incriminées de la configtable.
Naidim

30

Commande drush pour objet de configuration de suppression: drush config-delete <config_name>.


en cas de multi-site,drush -l your.site.domain config-delete <config_name>
muskie9

2
format abrégé estdrush cdel <config_name>
Sharique

Attention, si vous supprimez une configuration, vous devez également effectuer un drush crafter pour supprimer toutes les dépendances de configuration en cache, sinon vous obtiendrez un résultat ressemblant à ceci:Error: Call to a member function getConfigDependencyKey() on null
wilco

13

Vous pouvez utiliser les méthodes suivantes. Utilisez le code suivant dans hook_uninstall

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

OU

dans le fichier yml vous pouvez mettre les dépendances comme


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

alors drupal supprimera automatiquement ces configurations lors de la désinstallation de votre module, comme décrit par Berdir ici https://drupal.stackexchange.com/a/173879/10436


5
Cela a peut-être changé récemment, mais c'est un peu différent maintenant. dépendances: imposées: module: - yourmodule
hw.

1
@hw votre commentaire est très important. Envisagez de l'ajouter à la réponse, avec un lien vers l'enregistrement de modification pertinent, si possible. Je n'ai pas pu le trouver.
Rudolfbyker

GAH !! Je savais qu'il y avait un moyen de faire cela, mais je ne me souvenais pas de la partie "forcée". C'est le moyen le plus simple et le plus propre de le faire, en particulier lors de leur création dans des fichiers yml.
UnsettlingTrend

En utilisant cette approche et en essayant d’installer le module, Drupal émet l’erreur suivante: Le module custom_module ne peut pas être activé car il dépend des modules suivants qui n’ont pas pu être trouvés:
John

Bonjour John, au cas où vous ne le découvririez pas, il semblerait que vous ayez peut-être placé la dépendance de votre module au mauvais endroit. La configuration décrite dans cette réponse est destinée à aller dans un ou plusieurs fichiers YML du répertoire config / install de votre module. Dans le cas du PO, cela se trouverait dans son fichier config / install / field.storage.bloom_stem.bs_twitter_ac.yml. On dirait que vous avez peut-être placé la dépendance dans le fichier mymodule.info.yml de votre module (cela empêchera votre module de pouvoir être installé)
Daniel Scott

9

Utilisation de la console drupal :

$ drupal config:delete 'the_config_to_delete'

1
Docs à: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/… Mais peut-il faire des wildcards? par exempledrupal config:delete 'migrate_plus.migration.*'
Nic

2
Dans la dernière console drupal, config: delete s'attend à ce que vous spécifiiez d' abord le type de configuration , par exemple drupal config:delete active 'name'ou `drupal config: delete staging 'name' (avec un seul paramètre fourni, cela suppose que vous lui avez donné le type et vous pour le nom de la configuration.)
William Turrell

6

Drupal :: configFactory () -> reset () ne supprime pas l'objet config. Pour cette courseDrupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()



2

Vous pouvez utiliser la console Drupal pour supprimer la configuration active avec drupal config:delete active config_to_delete.


1

Recherchez toutes les configurations répertoriées à l'aide de drush config-list Ensuite, identifiez la configuration que vous souhaitez supprimer. Utilisez la commande ci-dessous pour supprimer la configuration drush config-delete


0

Je laisse ici un script Python minuscule (mais un peu trop élaboré) qui supprime les restes de configuration. Il repose sur 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])

Devrait être exécuté comme ceci:

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

1
Vous demandez aux développeurs PHP d'utiliser un script Python? Cela semble un peu bête.
Patrick le

0

Utilisez le module Installation facile pour éviter ces problèmes de configuration, ce module permettra de supprimer des configurations lors de la désinstallation d'un module, cela fonctionne même si la configuration d'un module ne contient pas de configuration forcée en yml ou non ajoutée dans un dossier optionnel .

Configuration sur l'image de désinstallation


0

Désinstallez Active Configuration à partir du module personnalisé

J'ai rencontré le même problème en essayant de désinstaller des fichiers de configuration à partir d'un module personnalisé. J'ai un module personnalisé utilisé pour transmettre des fichiers de configuration personnalisés pour webform. Comme je ne suis pas parfait, je veux pouvoir désinstaller le module, éditer le code et le réinstaller. J'ai trouvé que si je référençais mon module personnalisé (my_module) dans la section dependencies /forced du fichier config / install yml, lorsque je désinstallais mon module, les fichiers de configuration le désinstallaient également.

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

0

Toutes ces réponses recommandent de supprimer directement l'objet de configuration sous-jacent, mais la bonne façon consiste à supprimer l'entité via le système de stockage d'entités.

Par exemple, si vous avez un style d'image avec l'ID "grand" et que vous souhaitez le supprimer, procédez comme suit:

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

En procédant de cette façon, le noyau invoquera "predelete" avant la suppression de la configuration et "supprimera" les points d'ancrage après la suppression de la configuration, que d'autres modules pourront utiliser pour effectuer diverses opérations de nettoyage.


0

Utilisez hook_uninstall pour supprimer la configuration lorsque le module est désinstallé.

Puis supprimez la configuration:

function hook_uninstall() {
  \Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.