回答:
コメントするのに十分なクレジットを持っていないので、ここに置きます:
@ 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のクエリベースの答えがないか、ではありませんか?つまり、(NIDが多数ある場合は)多少費用がかかるようで、可能な場合はこのソリューションを使用したいと思います。
drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'