Bir içerik türü programlı olarak nasıl silinir?


12

Modül yüklemesi sırasında programlı olarak bir içerik türü oluşturdum (alan depolama yapılandırmasını kullanarak).

Modülü kaldırırken bu içerik türünü silmek istiyorum .

Drupal 8 ile bunu yapmanın bir yolu var mı?

Yanıtlar:


15

Düğüm türünün modülünüze bağlı olduğundan emin olun, ardından Drupal bunu sizin için otomatik olarak siler.

Örnek için kitap modülündeki node.type.book.yml dosyasına bakın, bu ilgili bölümdür:

dependencies:
  enforced:
    module:
      - book

Kullanıcıların modülü kaldırmadan önce bu türdeki tüm içeriği silmeleri gerektiğini unutmayın.


9

Bu benim için yapıyor gibi görünüyor.

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

Uygun bir kaçış ile Drupal Konsolu kullanan bir CLI tek-astar:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic

5

Yorum yapmak için yeterli krediye sahip değilim, buraya koyacağım:

@Berdir, bana, node.type.custom.yml dosyasında modülün zorla kaldırılmasının, kaldırırken düğümlerin silinmesini zorlamak için yeterli olmadığı anlaşılıyor

Kullanıcıların modülü kaldırabilmeleri için önce bu türdeki tüm içeriği silmeleri gerektiğini unutmayın.

Benim durumumda, modül kaldırılırken içerik türü silinir. Ancak özel içeriğin (düğümlerin) silinmesi zorunlu değildir. Bunu başarmak için özel modül ModuleUninstallValidatorInterface.

Uygulandığında, özel düğümler silinmeden önce özel modül kaldırılamaz. Seçim kutusu devre dışı bırakılacak.

Arayüzü uygulamak yerine, içindeki düğümleri silerek kirli yapıyorum 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();
  }
}

Drupal core'un bookmodülü, hala ilgili içerik varsa bir modülün kaldırılmayacağından emin olmanın iyi bir örneğidir. A ProxyClass, Kitap services.ymldosyasını kopyalarken de gereklidir . Bu durumda aşağıdaki komut yararlı bulunur: php core/scripts/generate-proxy-class.php 'Drupal\custom_module\CustomModuleUninstallValidator' "modules/custom/custom_module/src"
vensires

3

Bir modülün kaldırılması üzerine bazı eylemleri tetiklemek hook_uninstalliçin modülünüzün *.installdosyasına uygulamanız gerekir . İçerik türünü silmeden önce, bu içerik türündeki tüm düğümlerin de silindiğinden emin olmak isteyebilirsiniz. Son olarak, modülü kaldırdıktan ve içerik türünü sildikten sonra güncellenmiş yapılandırmayı dışa aktarmayı unutmayın.

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

Bu , düğüm-kimlik sorgusu tabanlı yanıtın yaptığı gibi herhangi bundlebirini siler mi MACHINE_NAME_OF_TYPE, silmez mi? Yani, bu biraz pahalı gibi görünüyor (çok fazla NID varsa) ve mümkün olduğunda bu çözümü kullanmak istiyorum.
Top-Master

1
@ Top-Master - Cevabımı güncelledim. Önce tüm düğümleri silmek için fazladan bir adım gerekiyor.
leymannx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.