วิธีลบประเภทเนื้อหาโดยทางโปรแกรม


12

ฉันสร้างชนิดเนื้อหาโดยทางโปรแกรมในระหว่างการติดตั้งโมดูล (โดยใช้การกำหนดค่าที่เก็บข้อมูล)

ฉันต้องการลบประเภทเนื้อหานั้นขณะถอนการติดตั้งโมดูล

มีวิธีใดในการทำเช่นนี้กับ Drupal 8

คำตอบ:


15

เพียงตรวจสอบให้แน่ใจว่าประเภทโหนดขึ้นอยู่กับโมดูลของคุณจากนั้น Drupal จะลบมันให้คุณโดยอัตโนมัติ

ดูที่ node.type.book.yml ในโมดูลหนังสือสำหรับตัวอย่างนี่เป็นส่วนที่เกี่ยวข้อง:

dependencies:
  enforced:
    module:
      - book

โปรดทราบว่าผู้ใช้จะต้องลบเนื้อหาทั้งหมดของประเภทนั้นก่อนจึงจะสามารถถอนการติดตั้งโมดูลได้


9

ดูเหมือนว่าจะทำเพื่อฉัน

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

CLI หนึ่งซับของสิ่งนี้ที่ใช้ Drupal Console กับการหลบหนีที่เหมาะสมคือ:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

ไม่มีเครดิตเพียงพอที่จะแสดงความคิดเห็นฉันจะวางไว้ที่นี่:

@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();
  }
}

3

ในการทริกเกอร์การกระทำบางอย่างเมื่อถอนการติดตั้งโมดูลคุณต้องนำไปใช้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 คำตอบตามไม่หรือไม่? ฉันหมายถึงดูเหมือนว่าจะค่อนข้างแพง (ถ้ามีจำนวนมาก) และฉันต้องการใช้วิธีนี้เมื่อเป็นไปได้
ท็อปมาสเตอร์

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