Comment supprimer un type de contenu, par programme?

12

J'ai créé par programme un type de contenu lors de l'installation d'un module (à l'aide de la configuration de stockage sur site).

Je souhaite supprimer ce type de contenu lors de la désinstallation du module.

Existe-t-il un moyen de le faire avec Drupal 8?

Akash Jain
la source

Réponses:

15

Assurez-vous simplement que le type de nœud dépend de votre module, Drupal le supprimera automatiquement pour vous.

Voir node.type.book.yml dans le module livre pour un exemple, c'est la partie pertinente:

dependencies:
  enforced:
    module:
      - book

Notez que les utilisateurs devront supprimer tout le contenu de ce type avant de pouvoir désinstaller le module.

Berdir
la source
9

Cela semble le faire pour moi.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();
el1
la source
Un one-liner CLI de cela qui utilise Drupal Console avec un échappement approprié est:drupal snippet --code='$content_type = \Drupal::entityManager()->getStorage("node_type")->load("MACHINE_NAME_OF_TYPE"); $content_type->delete();'
komlenic
5

N'ayant pas assez de crédit pour commenter, je vais le mettre ici:

@Berdir, il me semble que l'application du module dans le fichier node.type.custom.yml n'est pas suffisante pour imposer la suppression des nœuds lors de la désinstallation

Notez que les utilisateurs devront supprimer tout le contenu de ce type avant de pouvoir désinstaller le module, puis

Dans mon cas, le type de contenu est supprimé lors de la désinstallation du module. Mais la suppression du contenu personnalisé (nœuds) n'est pas appliquée. Pour ce faire, le module personnalisé doit implémenter le ModuleUninstallValidatorInterface.

Une fois implémenté, le module personnalisé ne peut pas être désinstallé avant la suppression des nœuds personnalisés. La case de sélection sera désactivée.

Au lieu de mettre en œuvre l'interface, je le fais sale en supprimant les nœuds dans 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
la source
3

Pour déclencher une action lors de la désinstallation d'un module, vous devez implémenter hook_uninstalldans le *.installfichier de votre module . Avant de supprimer le type de contenu, vous pouvez également vous assurer que tous les nœuds de ce type de contenu ont également été supprimés. Enfin, après avoir désinstallé le module et avoir supprimé le type de contenu, n'oubliez pas d'exporter la configuration mise à jour.

/**
 * 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
la source
Est-ce que ce supprimer tout bundlede MACHINE_NAME_OF_TYPE, comme la réponse basée sur une requête noeud-id ne, ou non? Je veux dire, cela semble être un peu cher (s'il y a beaucoup de NID) et j'aimerais utiliser cette solution lorsque cela est possible.
Top-Master
1
@ Top-Master - J'ai mis à jour ma réponse. Il faut une étape supplémentaire pour supprimer tous les nœuds en premier.
leymannx