プログラムでコンテンツタイプを削除する方法は?


12

モジュールのインストール中に(フィールドストレージ構成を使用して)プログラムでコンテンツタイプを作成しました。

モジュールのアンインストール中にそのコンテンツタイプを削除したい。

Drupal 8でこれを行う方法はありますか?

回答:


14

ノードタイプがモジュールに依存していることを確認するだけで、Drupalは自動的にノードを削除します。

例については、bookモジュールのnode.type.book.ymlを参照してください。これは関連する部分です。

dependencies:
  enforced:
    module:
      - book

ユーザーがモジュールをアンインストールする前に、そのタイプのすべてのコンテンツを削除する必要があることに注意してください。


9

これは私のためにそれを行うようです。

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

適切なエスケープでDrupalのコンソールを使用しています。このA CLIワンライナーです: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のクエリベースの答えがないか、ではありませんか?つまり、(NIDが多数ある場合は)多少費用がかかるようで、可能な場合はこのソリューションを使用したいと思います。
トップマスター

1
@ Top-Master –回答を更新しました。最初にすべてのノードを削除するには、追加の手順が必要です。
leymannx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.