J'écris un module personnalisé pour Drupal 8. Il définit un objet de configuration de stockage sur le terrain, 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é derrière parce que, lorsque je réinstalle le module, j'obtiens un plantage.
drush -y pm-uninstall mymod
drush cr
drush -y en mymod
l'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'aie 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é?
Pour le moment, la méthode la plus simple consiste à utiliser drush php
(ou core-cli
) pour ouvrir une session interactive.
Utilisez ensuite:
Drupal::configFactory()->getEditable('system.menu.devel')->delete();
Commande Drush pour supprimer l'objet de configuration: drush config-delete <config_name>
.
Vous pouvez utiliser les méthodes suivantes. Utilisez le code suivant dans hook_uninstall
Drupal::configFactory()->reset('field.storage.bloom_stem.bs_Twitter_ac');
OR
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
Utilisation de la console drupal :
$ drupal config:delete 'the_config_to_delete'
Drupal :: configFactory () -> reset () ne supprime pas l'objet config. Pour cette exécution, Drupal::configFactory()->getEditable('field.storage.node.your_field_name')->delete()
J'ai créé un module simple que vous pouvez utiliser pour supprimer des éléments de configuration.
J'ai rencontré le même problème en essayant de désinstaller les fichiers de configuration d'un module personnalisé. J'ai un module personnalisé utilisé pour transmettre des fichiers de configuration personnalisés pour le formulaire Web. Comme je ne suis pas parfait, je veux pouvoir désinstaller le module, modifier le code et réinstaller. J'ai trouvé que si je référençais mon module personnalisé (mon_module) dans la section dépendances/forcé du fichier yml config/install, lorsque je désinstallais mon module, les fichiers de configuration se désinstallaient également.
langcode: en
status: true
dependencies:
enforced:
module:
- webform
- my_module // reference your module here
Vous pouvez utiliser Drupal console pour supprimer la configuration active, avec drupal config:delete active config_to_delete
.
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
Utilisez hook_uninstall pour supprimer la configuration, lorsque le module est désinstallé.
Supprimez ensuite la configuration:
function hook_uninstall() {
\Drupal::configFactory()->getEditable('the_setting.you.want.to.delete')->delete();
}
Je laisse ici un tout petit (mais un peu trop ingénieux) Python qui supprime les restes de configuration. Il s'appuie 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])
Doit être exécuté comme ceci:
python ../scripts/batch_config_delete.py -m foobar
Toutes ces réponses recommandent de supprimer directement l'objet de configuration sous-jacent, mais la bonne façon est de supprimer l'entité via le système de stockage d'entité.
Par exemple, si vous avez un style d'image avec l'ID "grand" et que vous souhaitez le supprimer, vous devez procéder comme suit:
\Drupal::entityTypeManager()->getStorage('image_style')->load('large')->delete();
En procédant de cette façon, le noyau invoquera "prédéliminer" avant la suppression de la configuration et "supprimer" les crochets après la suppression de la configuration, sur lesquels d'autres modules peuvent s'appuyer pour effectuer diverses opérations de nettoyage.
Utilisez module d'installation facile pour éviter ces problèmes de configuration, ce module permettra de supprimer les configurations lors de la désinstallation d'un module, cela fonctionne même si la configuration d'un module ne contient pas appliquée en yml ou configs non ajoutés dans le dossier facultatif .
Je pourrais supprimer la configuration active en utilisant la commande drush config: delete comme ci-dessous drush cdel "name of the config"
par exemple dans mon cas c'était drush cdel dtn_Apple_news.setting
après avoir exécuté ceci, la configuration a été supprimée puis exécutée drush en-y "module name"
a obtenu l'installation du module.