ฉันสร้างชนิดเนื้อหาโดยทางโปรแกรมในระหว่างการติดตั้งโมดูล (โดยใช้การกำหนดค่าที่เก็บข้อมูล)
ฉันต้องการลบประเภทเนื้อหานั้นขณะถอนการติดตั้งโมดูล
มีวิธีใดในการทำเช่นนี้กับ Drupal 8
ฉันสร้างชนิดเนื้อหาโดยทางโปรแกรมในระหว่างการติดตั้งโมดูล (โดยใช้การกำหนดค่าที่เก็บข้อมูล)
ฉันต้องการลบประเภทเนื้อหานั้นขณะถอนการติดตั้งโมดูล
มีวิธีใดในการทำเช่นนี้กับ Drupal 8
คำตอบ:
เพียงตรวจสอบให้แน่ใจว่าประเภทโหนดขึ้นอยู่กับโมดูลของคุณจากนั้น Drupal จะลบมันให้คุณโดยอัตโนมัติ
ดูที่ node.type.book.yml ในโมดูลหนังสือสำหรับตัวอย่างนี่เป็นส่วนที่เกี่ยวข้อง:
dependencies:
enforced:
module:
- book
โปรดทราบว่าผู้ใช้จะต้องลบเนื้อหาทั้งหมดของประเภทนั้นก่อนจึงจะสามารถถอนการติดตั้งโมดูลได้
ดูเหมือนว่าจะทำเพื่อฉัน
$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
ไม่มีเครดิตเพียงพอที่จะแสดงความคิดเห็นฉันจะวางไว้ที่นี่:
@Berdir ดูเหมือนว่าการบังคับใช้โมดูลในไฟล์ node.type.custom.yml นั้นไม่เพียงพอที่จะบังคับใช้การลบโหนดเมื่อถอนการติดตั้ง
โปรดทราบว่าผู้ใช้จะต้องลบเนื้อหาทั้งหมดของประเภทนั้นก่อนจึงจะสามารถถอนการติดตั้งโมดูลได้
ในกรณีของฉันชนิดเนื้อหาจะถูกลบเมื่อทำการถอนการติดตั้งโมดูล แต่การลบเนื้อหาที่กำหนดเอง (โหนด) จะไม่ถูกบังคับใช้ ModuleUninstallValidatorInterface
เพื่อให้บรรลุนี้โมดูลที่กำหนดเองควรดำเนินการ
เมื่อใช้งานโมดูลที่กำหนดเองจะไม่สามารถถอนการติดตั้งก่อนที่จะลบโหนดที่กำหนดเอง กล่องที่เลือกจะถูกยกเลิกการใช้งาน
แทนที่จะใช้ส่วนต่อประสานฉันกำลังทำสกปรกโดยการลบโหนดในhook_uninstall()
:
function MYMODULE_uninstall() {
// Delete custom_type nodes when uninstalling.
$query = \Drupal::entityQuery('node')
->condition('type', 'custom_type');
$nids = $query->execute();
// debug($nids);
foreach ($nids as $nid) {
\Drupal\node\Entity\Node::load($nid)->delete();
}
}
ในการทริกเกอร์การกระทำบางอย่างเมื่อถอนการติดตั้งโมดูลคุณต้องนำไปใช้hook_uninstall
ใน*.install
ไฟล์โมดูลของคุณ ก่อนที่จะลบประเภทเนื้อหาคุณอาจต้องการให้แน่ใจว่าโหนดทั้งหมดของประเภทเนื้อหานั้นถูกลบเช่นกัน สุดท้ายหลังจากถอนการติดตั้งโมดูลและลบประเภทเนื้อหาแล้วอย่าลืมส่งออกการกำหนดค่าที่อัปเดต
/**
* Place a short description here.
*/
function MYMODULE_uninstall() {
// Delete all nodes of given content type.
$storage_handler = \Drupal::entityTypeManager()
->getStorage('node');
$nodes = $storage_handler->loadByProperties(['type' => 'MACHINE_NAME_OF_TYPE']);
$storage_handler->delete($nodes);
// Delete content type.
$content_type = \Drupal::entityTypeManager()
->getStorage('node_type')
->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
}
bundle
ของMACHINE_NAME_OF_TYPE
เช่นแบบสอบถามโหนด-ID คำตอบตามไม่หรือไม่? ฉันหมายถึงดูเหมือนว่าจะค่อนข้างแพง (ถ้ามีจำนวนมาก) และฉันต้องการใช้วิธีนี้เมื่อเป็นไปได้
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'