Wie lösche ich einen Inhaltstyp programmgesteuert?

12

Ich habe programmgesteuert einen Inhaltstyp während einer Modulinstallation erstellt (mithilfe der Feldspeicherkonfiguration).

Ich möchte diesen Inhaltstyp während der Deinstallation des Moduls löschen .

Gibt es eine Möglichkeit, dies mit Drupal 8 zu tun?

Akash Jain
quelle

Antworten:

14

Stellen Sie einfach sicher, dass der Knotentyp von Ihrem Modul abhängt. Drupal löscht ihn dann automatisch für Sie.

Ein Beispiel finden Sie unter node.type.book.yml im Buchmodul. Dies ist der relevante Teil:

dependencies:
  enforced:
    module:
      - book

Beachten Sie, dass Benutzer alle Inhalte dieses Typs löschen müssen, bevor sie das Modul anschließend deinstallieren können.

Berdir
quelle
8

Das scheint es für mich zu tun.

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

Da ich nicht genug Kredit habe, um einen Kommentar abzugeben, werde ich ihn hier einfügen:

@Berdir, es scheint mir, dass das Erzwingen des Moduls in der Datei node.type.custom.yml nicht ausreicht, um das Löschen der Knoten bei der Deinstallation zu erzwingen

Beachten Sie, dass Benutzer alle Inhalte dieses Typs löschen müssen, bevor sie das Modul anschließend deinstallieren können

In meinem Fall wird der Inhaltstyp bei der Deinstallation des Moduls gelöscht. Das Löschen des benutzerdefinierten Inhalts (der Knoten) wird jedoch nicht erzwungen. Um dies zu erreichen, sollte das benutzerdefinierte Modul das implementieren ModuleUninstallValidatorInterface.

Nach der Implementierung kann das benutzerdefinierte Modul nicht deinstalliert werden, bevor die benutzerdefinierten Knoten gelöscht wurden. Das Auswahlfeld wird deaktiviert.

Anstatt das Interface zu implementieren, mache ich es unsauber, indem ich die Knoten lösche in 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
quelle
3

Um bei der Deinstallation eines Moduls eine Aktion auszulösen, müssen Sie diese hook_uninstallin der *.installDatei Ihres Moduls implementieren . Vor dem Löschen des Inhaltstyps möchten Sie möglicherweise sicherstellen, dass auch alle Knoten dieses Inhaltstyps gelöscht wurden. Vergessen Sie nach der Deinstallation des Moduls und dem Löschen des Inhaltstyps nicht, die aktualisierte Konfiguration zu exportieren.

/**
 * 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
quelle
Wird hierdurch eine bundleder folgenden Antworten gelöscht MACHINE_NAME_OF_TYPE, wie dies bei der auf Knoten-IDs basierenden Antwort der Fall ist oder nicht? Ich meine, das scheint etwas teuer zu sein (wenn es viele NIDs gibt) und ich würde diese Lösung gerne verwenden, wenn es möglich ist.
Top-Master
1
@ Top-Master - Ich habe meine Antwort aktualisiert. Es ist ein zusätzlicher Schritt erforderlich, um zuerst alle Knoten zu löschen.
Leymannx