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


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();однолінійного : Зауважте, що уникнутий знак долара, щоб командний рядок не трактував неправильно $moduleBash.
sillygwailo

Ура за ледачий один лайнер! В кінці
Метт Флетчер

Надзвичайно важливо зробити очищення кешу, а потім експортувати конфігурацію, щоб конфігурація не намагалася повторно встановити, поки ви не будете готові.
Ададдінсан

16

Зробити це:

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

Залежно від модуля, можливо, доведеться видалити деякі записи з таблиці конфігурацій (див. Відповідь valli) та деяких інших таблиць.
Туріон

Це не спрацювало для мене.
рубік

Ви повинні бігти 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

3

Подумайте про використання Drush. Drupal 8 все ще визначає, якими повинні бути "відключення модулів". Існує триває дискусія , якщо повинна бути такий варіант , або вона повинна бути вилучена.


Я розвиваюсь локально на комп'ютері з Windows, і востаннє, коли я виглядав, що Друш не готовий до Drupal 8. Мені доведеться знову подивитися.
шишка

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

І, використовуючи барабан, як один модуль "вручну видалити" таким чином, який відрізняється від процесу інтерфейсу? Ви, здається, не відповіли на питання.
кентхомас

3

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

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


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. Використовується наступна команда для видалення запису з бази даних

ВИДАЛИТИ З key_value WHERE collection = 'system.schema' AND name = 'better_messages';

У моєму випадку в базі даних не було записів. Я думаю, що його, можливо, видалили через різні трюки, які я робив раніше.

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

Це вирішило проблему. Це ґрунтується на моїй інтерпретації https://www.drupal.org/node/2487215


0

Відповідь Джигарія вище, спрацював ...

Мені довелося: // Прочитати конфігурацію.

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

Який повинен робити те саме. Не знаю, чому це не спрацювало так, як писав це Джигарій ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.