ปิดการใช้งานโมดูลด้วยตนเอง


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" dataThe dataเป็นอาร์เรย์ PHP แบบอนุกรมที่คุณต้องลบโมดูลที่คุณต้องการกำจัดออกจากmoduleคีย์ของการกำหนดค่า

โซลูชันที่ 3: โซลูชันที่รวดเร็วและสกปรก

  • ลบโมดูลออกจากระบบไฟล์
  • ตัดทอนตาราง cache_config

อย่างไรก็ตามการแก้ปัญหานี้อาจส่งผลให้ข้อความบอกว่าโมดูลไม่ได้อยู่ในระบบไฟล์ซึ่งหมายถึงบางสิ่งผิดปกติ แต่อย่างน้อยโมดูลที่เสียหายจะถูกปิดการใช้งานและคุณสามารถเข้าถึงเว็บไซต์ของคุณในกรณีส่วนใหญ่

การล้างแคช

บางครั้งคุณอาจต้องล้างแคชหลังจากทำตามขั้นตอนด้านบน อ่านที่มีประโยชน์นี้เอกสารเกี่ยวกับวิธีการล้างแคช


1
ในแง่ของการถอนการติดตั้งโมดูลฉันคิดว่านี่เป็นทางออกที่ดีที่สุด
David

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();สังเกตเครื่องหมายดอลลาร์ที่ใช้ Escape เพื่อที่บรรทัดคำสั่งจะไม่ตีความผิด$moduleเป็นตัวแปร Bash
sillygwailo

ขอบคุณสำหรับคนขี้เกียจคนหนึ่ง! ไม่มีคำพูดในตอนท้ายแม้ว่า
Matt Fletcher

เป็นเรื่องสำคัญมากที่คุณต้องล้างแคชแล้วส่งออกการกำหนดค่าดังนั้นการกำหนดค่าจะไม่พยายามติดตั้งใหม่จนกว่าคุณจะพร้อม
Adaddinsane

16

ทำเช่นนี้:

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

คุณอาจต้องลบบางรายการออกจากตารางการกำหนดค่า (ดูคำตอบของ valli) และตารางอื่น ๆ ทั้งนี้ขึ้นอยู่กับโมดูล
Turion

สิ่งนี้ไม่ได้ผลสำหรับฉัน
rooby

คุณต้องทำงานdrush cache-rebuildมากเกินไป
สกาย

16
  • แก้ไขconfigตารางด้วยตนเองname = 'core.extension'และลบโมดูลออกจาก data blob ซึ่งเป็นอาเรย์ที่ต่อเนื่องกัน
  • ระวังที่จะลดความยาวของอาเรย์โมดูลด้วย (...s:6:"module";a:HERE;{...)
  • ตัดทอนcache_configตารางจาก phpmyadmin หรือใช้บรรทัดคำสั่ง

1
ขอบคุณสิ่งนี้ช่วยฉัน คำตอบควรอ่าน " แก้ไขตาราง {config}" ด้วยตนเอง ส่วนข้อความที่จะลบออกจากเนื้อหา BLOB คือ:i:0;s:8:"name of the module";
Hendrik

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 PC และครั้งสุดท้ายที่ฉันดู Drush ยังไม่พร้อมสำหรับ Drupal 8 ฉันจะต้องดูอีกครั้ง
bumpaw

@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 (มองหาชื่อโมดูลในคอลัมน์ชื่อ)


2

หากคุณต้องการอัปเดตสิ่งที่เกี่ยวข้องกับการกำหนดค่า Drupal ในกรณีนี้core.extensionให้ใช้ Drush:

[Drush 8.x ในตัวอย่างนี้]

drush cedit core.extension

1

มีโมดูลสำหรับสิ่งนั้น โมดูลนี้ถูกโพสต์ใน ส.ค. 2013 เมื่อ drupal.org ในกรณีที่มีคนต้องการ

ปิดการใช้งานโมดูล

ตามที่ระบุไว้ในหน้าของโมดูลนี้

Drupal 8 ได้ลบความสามารถในการปิดการใช้งานโมดูลด้วยเหตุผลหลายประการ ดูที่ # 1199946: โมดูลที่ปิดใช้งานนั้นไม่สามารถใช้งานได้เกินกว่าจะซ่อมได้ดังนั้นจึงจำเป็นต้องลบฟังก์ชั่น "ปิด" ออกและปัญหาอื่น ๆ ในคิวของแกนหลักและโมดูลที่สนับสนุน

โมดูลนี้นำความสามารถในการปิดใช้งาน (ชั่วคราว) โมดูลจาก UI หรือด้วย Drush โปรดทราบว่าไม่มีการรับประกันสำหรับเนื้อหาของคุณกำหนดค่าหรือแม้กระทั่งเว็บไซต์ของคุณหลังจากที่คุณปิดการใช้งานโมดูล


0

นี่คือวิธีที่ฉันลบโมดูลชื่อ "better_messages" ด้วยตนเองออกจากอินสแตนซ์ Drupal 8 ของฉัน ทันทีที่ฉันติดตั้งโมดูล "better_messages" ไซต์ก็หยุดทำงาน ดังนั้นจึงไม่มีวิธีในการถอนการติดตั้งโมดูลจากส่วนต่อประสานผู้ใช้ ฉันไม่ได้ติดตั้ง Drush ฉันได้ทำการตั้งค่าหลายอย่างในฟอรัม แต่นี่เป็นวิธีที่ใช้งานได้ในที่สุด

1 เปลี่ยนชื่อโมดูลเป็น old_better_messages ในโฟลเดอร์โมดูล

  1. ผ่านทาง URL วิ่งhttp: // IP: พอร์ต / 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 เขียน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.