Bagaimana cara menghapus jenis konten, secara terprogram?

12

Saya secara terprogram membuat tipe konten selama instalasi modul (menggunakan konfigurasi penyimpanan lapangan).

Saya ingin menghapus tipe konten itu saat menghapus modul.

Apakah ada cara untuk melakukan ini dengan Drupal 8?

Akash Jain
sumber

Jawaban:

14

Pastikan saja bahwa tipe simpul tergantung pada modul Anda, maka Drupal akan menghapusnya secara otomatis untuk Anda.

Lihat node.type.book.yml dalam modul buku untuk contoh, ini adalah bagian yang relevan:

dependencies:
  enforced:
    module:
      - book

Perhatikan bahwa pengguna harus menghapus semua konten jenis itu sebelum mereka dapat menghapus modul itu.

Berdir
sumber
9

Ini sepertinya melakukannya untuk saya.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
el1
sumber
CLI one-liner ini yang menggunakan Drupal Console dengan melarikan diri dengan benar adalah:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic
5

Tidak memiliki kredit yang cukup untuk berkomentar, saya akan taruh di sini:

@Berdir, bagi saya tampaknya menegakkan modul dalam file node.type.custom.yml tidak cukup untuk menegakkan penghapusan node ketika menghapus instalan

Perhatikan bahwa pengguna harus menghapus semua konten jenis itu sebelum mereka dapat menghapus modul itu

Dalam kasus saya, tipe konten dihapus ketika menghapus modul. Tetapi penghapusan konten khusus (node) tidak diberlakukan. Untuk mencapai hal ini, modul khusus harus mengimplementasikan ModuleUninstallValidatorInterface.

Ketika diimplementasikan modul khusus tidak dapat dihapus sebelum simpul kustom dihapus. Kotak pilih akan dinonaktifkan.

Alih-alih mengimplementasikan Antarmuka saya melakukannya kotor dengan menghapus node di 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();
  }
}
Bundio
sumber
3

Untuk memicu beberapa tindakan setelah penghapusan modul Anda harus menerapkan hook_uninstalldalam *.installfile modul Anda . Sebelum menghapus tipe konten, Anda mungkin ingin memastikan semua node dari tipe konten itu juga dihapus. Akhirnya, setelah menghapus modul dan menghapus jenis konten jangan lupa untuk mengekspor konfigurasi yang diperbarui.

/**
 * 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();
}
leymannx
sumber
Apakah ini akan menghapus bundledari MACHINE_NAME_OF_TYPE, seperti permintaan simpul-id jawaban berdasarkan tidak, atau tidak? Maksud saya, sepertinya agak mahal (jika ada banyak NID) dan saya ingin menggunakan solusi ini jika memungkinkan.
Top-Master
1
@ Top-Master - Saya memperbarui jawaban saya. Perlu langkah ekstra untuk menghapus semua node terlebih dahulu.
leymannx