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ı?
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:
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.
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();
}
}
book
modü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.yml
dosyası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"
Bir modülün kaldırılması üzerine bazı eylemleri tetiklemek hook_uninstall
için modülünüzün *.install
dosyası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();
}
bundle
birini 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.
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'