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é?

artfulrobot
la source
Cela
othermachines
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 .

lexicant
la source
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>.

ya.teck
la source
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

Ahmad
la source
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'
Vincent Lalieu
la source
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()

balagan
la source
2

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

Umed Godd
la source
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

Manikanta
la source
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
turdus-merula
la source
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

Karthikeyan Manivasagam
la source
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
Robert Ben Parkinson
la source
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.

Brian
la source
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();
}
Jdrupal
la source