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?

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.


9

Cela semble le faire pour moi.

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

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();
  }
}

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();
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.