Отключить модуль вручную


39

В Drupal 7 я мог вручную редактировать {system}таблицу в базе данных, чтобы отключить стаб-модуль. На моем сайте Drupal 8 эта таблица исчезла.

Как я могу вручную отключить модуль в Drupal 8?

Ответы:


34

Данные systemтаблицы Drupal 7 теперь хранятся в configтаблице в Drupal 8 относительно core.extensionпараметра.

Решение 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

В зависимости от модуля может потребоваться удалить некоторые записи из таблицы конфигурации (см. Ответ Валли) и некоторых других таблиц.
Турион

Это не сработало для меня.
Роби

Вы должны бежать drush cache-rebuildтоже
Sky

16
  • Вручную отредактируйте configтаблицу, где name = 'core.extension'и удалите модуль из большого двоичного объекта данных, который является сериализованным массивом.
  • Будьте внимательны, чтобы уменьшить длину массива модулей (...s:6:"module";a:HERE;{...)
  • Обрежьте cache_configтаблицу из phpmyadmin или используя командную строку.

1
Спасибо, это помогло мне. Ответ должен гласить «Вручную отредактируйте таблицу {config}». Текстовая часть для удаления из содержимого BLOB:i:0;s:8:"name of the module";
Хендрик

2
Этот ответ помог разрешить ситуацию, когда модуль не мог быть ни удален, ни переустановлен, потому что пользовательский объект, который он определил, отсутствовал.
Дэниелс

1
@hendrick это может сработать для вас, но строка для удаления каждого модуля должна быть структурирована как s:8:"name of the module";i:0;. @Valli имел в виду, что массив, описывающий количество модулей, должен быть уменьшен в количестве на количество удаленных модулей. Начало создания блоба в моей настройке: a:4:{s:6:"module";a:59:{массив из 59 модулей. Если вы удалите два, измените значение этого массива на 57.
dimmech

4

В Drupal 8 попробуйте удалить модуль из папки вашего модуля и запустите rebuild.php.

Попробуй drush pm-uninstall module-nameтакже.


3

Подумайте об использовании Drush. Drupal 8 все еще определяет, какими должны быть «отключающие модули». Существует продолжающаяся дискуссия , если должна быть такой вариант , или она должна быть удалена.


Я работаю локально на Windows PC, и в прошлый раз я смотрел, что Drush не был готов к Drupal 8. Мне придется поискать снова.
Bumpaw

@bumpaw Drush также должен работать на Windows. Это, по крайней мере, поможет вам на местном уровне. Когда дело доходит до рабочих серверов, я знаю, что многие общие хостинги не предоставляют вам Drush или даже SSH, что обычно делает управление более трудоемким. drush.org/drush_windows_installer
hampusn

И, используя drush, как «вручную удалить» модуль способом, отличным от процесса пользовательского интерфейса? Вы, кажется, не ответили на вопрос.
1kenthomas

2

Я попробовал все остальные ответы, но продолжал получать сообщение об ошибке друпала. Чтобы решить эту проблему, мне пришлось удалить строку из таблицы key_value (искать имя модуля в столбце имени)


2

Если вам нужно обновить что-либо, связанное с конфигурацией Drupal, в этом случае core.extensionиспользуйте Drush:

[Drush 8.x в этом примере]

drush cedit core.extension

1

Для этого есть модуль. Этот модуль был размещен в августе 2013 года на drupal.org . На случай, если кому-то нужно.

Отключить модули

Как указано на странице этого модуля,

Drupal 8 убрал возможность отключения модулей по многим причинам. См. # 1199946: Отключенные модули сломаны и не подлежат восстановлению, поэтому необходимо удалить функцию «отключить» и многие другие проблемы в очереди различных основных и добавленных модулей.

Этот модуль возвращает возможность (временно) отключить модули из пользовательского интерфейса или с помощью Drush. Обратите внимание, что нет никаких гарантий для вашего контента, конфигурации или даже вашего сайта после отключения модуля.


0

Таким образом, я вручную удалил модуль с именем "better_messages" из своего экземпляра Drupal 8. Как только я установил модуль "better_messages", сайт вышел из строя. Таким образом, не было никакого способа удалить модуль из пользовательского интерфейса. У меня не установлен Drush. Я сделал много настроек, заданных на форумах, но вот как это наконец-то сработало для меня.

1 Переименовал модуль в old_better_messages в папке модулей.

  1. Через URL запустили http: // IP: порт / имя_фолдера / rebuild.php . Это гарантировало, что сайт вернулся, но только в режиме только для чтения. Я не мог выполнять действия администратора или редактировать статьи.

  2. Использовал следующую команду для удаления записи из базы данных

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

В моем случае не было записи в базе данных. Я думаю, что это могло быть удалено из-за различных трюков, которые я делал ранее.

  1. Затем, используя визуализатор БД, я удалил записи из всех таблиц, которые начинаются с кеша.

Это решило проблему. Это основано на моей интерпретации https://www.drupal.org/node/2487215


0

Ответ Jigarius выше, вроде работал ...

Мне пришлось: // Читать конфигурацию.

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

Который должен делать то же самое. Не уверен, почему это не сработало, поскольку Джигариус написал это ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.