手动禁用模块


39

在Drupal 7中,我可以手动编辑{system}数据库中的表以禁用Stubbon模块。在我的Drupal 8网站上,这张桌子不见了。

如何在Drupal 8中手动禁用模块?

Answers:


34

现在,Drupal 7 system表数据config根据core.extension参数存储在Drupal 8 中的表中。

解决方案1:更新配置

您可以使用drush eval,也可以使用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();

您可以使用,快速完成所有工作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();"

解决方案2:如果无法执行PHP,则编辑配置表

如果该站点由于有问题的模块而损坏,甚至不能运行PHP代码,则可以config直接编辑该表。

config表中的行中,name = "core.extension"并编辑BLOB列data。该data是序列化PHP数组,你必须删除你想获得从消除模块module配置的关键。

解决方案3:快速又肮脏的解决方案

  • 从文件系统中删除模块
  • 截断表格 cache_config

但是,此解决方案可能会导致出现消息,指出该模块在文件系统中不存在,这意味着出现了问题。但是至少损坏的模块会被禁用,并且在大多数情况下您可以访问您的站点。

清除缓存

有时您可能需要按照上述步骤清除缓存。阅读有关如何清除缓存的方便文档


1
在卸载模块方面,我认为这是最好的解决方案。
大卫,

1
如果您需要卸载模块但由于缺少模块表而不能卸载,则可以将第三个选项与一起使用drush eval。一个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();单线示例是:注意转义的美元符号,以便命令行不会误解$module为Bash变量。
sillygwailo

为这个懒惰的班轮加油!末尾缺少报价
马特·弗莱彻

非常重要的一点是先清除缓存,然后导出配置,以便在准备就绪之前,配置不会尝试重新安装。
Adaddinsane

16

做这个:

rm -rf modules/your_stubborn_module
rm -rf sites/default/files/php

根据模块的不同,您可能必须从config表(请参阅valli的答案)和其他一些表中删除一些条目。
特里

这对我不起作用。
rooby

你必须跑drush cache-rebuild
天空

16
  • 手动编辑该config表所在的位置,name = 'core.extension'然后从数据blob中删除该模块,该数据blob是序列化的数组。
  • 注意也要减少模块阵列的长度 (...s:6:"module";a:HERE;{...)
  • cache_config从phpmyadmin或使用命令行截断表。

1
谢谢,这对我有帮助。答案应为“手动编辑 {config}表”。从BLOB内容中删除的文本部分是:i:0;s:8:"name of the module";
Hendrik

2
此答案有助于解决由于缺少定义的自定义实体而无法卸载或重新安装模块的情况。
丹尼尔斯,2016年

1
@hendrick这可能对您有用,但是删除每个模块的字符串应构造为s:8:"name of the module";i:0;。@valli的意思是,描述模块数量的数组应按删除的模块数量减少数量。在我的设置中a:4:{s:6:"module";a:59:{,blob的开头是,它是59个模块的数组。如果删除两个转变即数组值57
dimmech

3

考虑使用Drush。Drupal 8仍在定义什么是“禁用模块”。目前正在进行讨论,是否应该选择该选项或将其删除。


我是在Windows PC上本地开发的,上次我看到Drush还没有为Drupal 8做好准备。我必须再次查看。
13年

@bumpaw Drush也应在Windows上运行。这至少会在本地为您提供帮助。对于生产服务器,我知道许多共享主机都无法为您提供Drush甚至SSH,这通常会使管理方式变得更加麻烦。drush.org/drush_windows_installer
hampusn

并且,使用drush,如何以与UI流程不同的方式“手动删除”模块?您似乎尚未回答问题。
1kenthomas

3

在Drupal 8中,尝试从模块文件夹中删除模块,然后运行rebuild.php。

也尝试一下drush pm-uninstall module-name


2

我尝试了所有其他答案,但一直收到drupal错误消息。为了解决这个问题,我必须从key_value表中删除一行(在名称列中查找模块名称)



1

有一个模块。该模块于2013年8月发布在drupal.org上。万一有人需要。

禁用模块

如本模块页面所述,

Drupal 8出于多种原因取消了禁用模块的功能。 请参阅#1199946:禁用的模块无法修复,因此需要删除“禁用”功能,并且各种核心模块和贡献模块的队列中还有许多其他问题。

该模块恢复了从UI或使用Drush暂时禁用模块的功能。请注意,禁用模块后,无法保证您的内容,配置甚至站点。


0

这样,我从Drupal 8实例中手动删除了一个名为“ better_messages”的模块。一旦我安装了“ better_messages”模块,该站点就关闭了。因此,无法从用户界面中卸载模块。我没有安装Drush。我已经完成了论坛中提供的许多设置,但是这终于对我起作用了。

1在modules文件夹中将模块重命名为old_better_messages。

  1. 通过url运行http:// IP:port / foldername / rebuild.php。这样可以确保该站点返回,但仅处于只读模式。我无法进行管理活动或编辑文章。

  2. 使用以下命令从数据库中删除条目

从key_value中删除WHERE collection ='system.schema'并且name ='better_messages';

就我而言,数据库中没有任何条目。我认为可能由于我之前所做的各种特技而被删除了。

  1. 然后,使用DB Visualizer从所有以缓存开头的表中删除条目。

这解决了问题。这是基于我对https://www.drupal.org/node/2487215的解释


0

Jigarius在上面的回答,有点奏效了...

我必须://阅读配置。

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

哪个应该做同样的事情。不知道为什么它不如Jigarius所写...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.