Désactiver manuellement un module

39

Dans Drupal 7, je pouvais modifier manuellement la {system}table de la base de données pour désactiver un module de sous-programme. Sur mon site Drupal 8, ce tableau a disparu.

Comment désactiver manuellement un module dans Drupal 8?

bumpaw
la source

Réponses:

34

Les systemdonnées de la table Drupal 7 sont maintenant stockées dans la configtable dans Drupal 8 par rapport au core.extensionparamètre.

Solution 1: mettre à jour la configuration

Vous pouvez exécuter le code suivant en utilisant drush evalou en utilisant éventuellement la provision du module Devel Execute PHP Code.

// Read the configuration.
$module_data = \Drupal::config('core.extension')->get('module');

// Unset the modules you do not need.
unset($module_data['MODULE_NAME']);

// Write the configuration.
\Drupal::configFactory()->getEditable('core.extension')->set('module', $module_data)->save();

Vous pouvez faire tout cela en une ligne rapide avec drush.

drush eval "\$module_data = \Drupal::config('core.extension')->get('module'); unset(\$module_data['MODULE_NAME']); \Drupal::configFactory()->getEditable('core.extension')->set('module', \$module_data)->save();"

Solution 2: modifiez la table de configuration si vous ne pouvez pas exécuter PHP

Si le site est endommagé à cause du module problématique et que vous ne pouvez même pas exécuter de code PHP, vous pouvez peut-être modifier configdirectement le tableau.

Dans la ligne de la configtable où name = "core.extension"et éditez la colonne BLOB data. Il datas'agit d'un tableau PHP sérialisé dans lequel vous devez supprimer le module dont vous souhaitez vous débarrasser de la moduleclé de la configuration.

Solution 3: solution rapide et sale

  • Supprimer le module du système de fichiers
  • Tronquer la table cache_config

Cependant, cette solution peut générer des messages indiquant que le module n'existe pas dans le système de fichiers, ce qui signifie que quelque chose ne va pas. Mais au moins le module défectueux est désactivé et vous pouvez accéder à votre site dans la plupart des cas.

Effacer le cache

Parfois, vous devrez peut-être effacer le cache après avoir suivi les étapes ci-dessus. Lisez cette documentation pratique sur la suppression du cache .

Jigarius
la source
1
En termes de désinstallation des modules, je pense que c'est la meilleure solution.
David
1
Si vous devez désinstaller un module mais que vous ne le pouvez pas car les tables du module sont manquantes, vous pouvez utiliser la troisième option avec drush eval. Par exemple, une ligne est la suivante: drush eval "\$module_data = \Drupal::config('core.extension')->get('module'); unset(\$module_data['example_module']); \Drupal::configFactory()->getEditable('core.extension')->set('module', \$module_data)->save();Notez le signe dollar échappé afin que la ligne de commande ne soit pas interprétée de $modulemanière erronée comme une variable Bash.
Sillygwailo
Vive le paresseux! Manque une citation à la fin cependant
Matt Fletcher
Il est essentiel de nettoyer le cache, puis d'exporter la configuration pour que la configuration ne tente pas de se réinstaller avant d'être prête.
Adaddinsane
16

Faire ceci:

rm -rf modules/your_stubborn_module
rm -rf sites/default/files/php
manish_s
la source
Selon le module, vous devrez peut-être supprimer certaines entrées de la table de configuration (voir la réponse de valli) et d'autres tables.
Turion
Cela n'a pas fonctionné pour moi.
Rooby
Tu dois courir drush cache-rebuildaussi
Sky
16
  • Éditez manuellement la configtable où name = 'core.extension'et supprimez le module du blob de données qui est un tableau sérialisé.
  • N'oubliez pas de diminuer également la longueur du tableau de modules (...s:6:"module";a:HERE;{...)
  • Tronquez la cache_configtable depuis phpmyadmin ou en utilisant la ligne de commande.
Valli
la source
1
Merci, cela m'a aidé. La réponse doit se lire « manuellement modifier la table {config} ». La portion de texte à supprimer du contenu BLOB est la suivante:i:0;s:8:"name of the module";
Hendrik
2
Cette réponse a aidé à résoudre une situation dans laquelle un module ne pouvait être ni désinstallé ni réinstallé car une entité personnalisée qu'il définissait était manquante.
Daniels
1
@hendrick cela a peut-être fonctionné pour vous, mais la chaîne de caractères pour supprimer chaque module doit être structurée de la manière suivante s:8:"name of the module";i:0;: Ce que @valli voulait dire, c’est que le tableau décrivant le nombre de modules devrait être décrémenté en nombre par la quantité de modules supprimés. Le début du blob dans ma configuration a:4:{s:6:"module";a:59:{est un tableau de 59 modules. Si vous en supprimez deux, changez la valeur de ce tableau en 57.
dimmech le
4

Dans Drupal 8, essayez de supprimer le module de votre dossier de modules et exécutez rebuild.php.

Essayez drush pm-uninstall module-nameaussi.

Drupway
la source
3

Pensez à utiliser Drush. Drupal 8 définit toujours ce que devraient être les "modules de désactivation". Une discussion est en cours pour savoir si cette option devrait exister ou si elle devrait être supprimée.

Mołot
la source
Je développe localement sur un PC Windows et la dernière fois que j'ai regardé, Drush n'était pas prêt pour Drupal 8. Je devrai regarder à nouveau.
Bumpaw
@bumpaw Drush devrait également fonctionner sous Windows. Cela vous aidera au moins localement. En ce qui concerne les serveurs de production, je sais que de nombreux hébergements partagés ne vous fournissent pas Drush, ni même SSH, ce qui rend généralement la gestion beaucoup plus lourde. drush.org/drush_windows_installer
hampusn
Et, en utilisant drush, comment "supprimer manuellement" un module d'une manière différente du processus d'interface utilisateur? Vous ne semblez pas avoir répondu à la question.
1kenthomas
2

J'ai essayé toutes les autres réponses mais je continuais à recevoir un message d'erreur Drupal. Pour le résoudre, j'ai dû supprimer une ligne de la table key_value (recherchez le nom du module dans la colonne name).

diesonne
la source
2

Si vous devez mettre à jour quelque chose lié à la configuration de Drupal core.extension, utilisez Drush dans ce cas :

[Drush 8.x dans cet exemple]

drush cedit core.extension
Jakub Mroz
la source
1

Il y a un module pour ça. Ce module a été publié en août 2013 sur drupal.org . Au cas où quelqu'un aurait besoin.

Désactiver les modules

Comme indiqué sur la page de ce module,

Drupal 8 a supprimé la possibilité de désactiver les modules pour plusieurs raisons. Voir # 1199946: Les modules désactivés sont irréparables. La fonctionnalité "Désactiver" doit donc être supprimée et de nombreux autres problèmes doivent figurer dans la file d'attente de divers modules principaux et contribués.

Ce module permet de désactiver (temporairement) des modules à partir de l'interface utilisateur ou avec Drush. Notez qu'il n'y a aucune garantie pour votre contenu, votre configuration ou même votre site après la désactivation d'un module.

CodeNext
la source
0

C'est ainsi que j'ai manuellement supprimé un module nommé "better_messages" de mon instance Drupal 8. Dès que j'ai installé le module "better_messages", le site s'est effondré. Il n'y avait donc aucun moyen de désinstaller le module à partir de l'interface utilisateur. Je n'ai pas installé Drush. J'ai effectué de nombreux réglages dans les forums, mais c'est ainsi que cela a finalement fonctionné pour moi.

1 a renommé le module old_better_messages dans le dossier modules.

  1. Par le biais de l'URL, http: // IP: port / nom_dossier / rebuild.php . Cela garantissait le retour du site, mais uniquement en mode lecture seule. Je ne pouvais pas faire les activités administratives ni éditer des articles.

  2. Utilisé la commande suivante pour supprimer l'entrée de la base de données

DELETE FROM key_value WHERE collection = 'system.schema' AND name = 'better_messages';

Dans mon cas, il n'y avait aucune entrée dans la base de données. Je pense qu'il a peut-être été supprimé à cause des différentes cascades que j'ai faites plus tôt.

  1. Puis, à l’aide de DB visualizer, j’ai supprimé les entrées de toutes les tables commençant par le cache.

Cela a résolu le problème. Ceci est basé sur mon interprétation de https://www.drupal.org/node/2487215

Soumya Rajiv
la source
0

La réponse de Jigarius ci-dessus, en quelque sorte travaillé ...

Je devais: // Lire la configuration.

$module_data = \Drupal::config('core.extension')->get()['module'];

Ce qui devrait faire la même chose. Je ne sais pas pourquoi cela n'a pas fonctionné comme Jigarius l'a écrit ...

utilisateur356540
la source