web-dev-qa-db-fra.com

Comment supprimer un type de contenu, par programme?

J'ai créé par programme un type de conten lors de l'installation d'un module (en utilisant la configuration de stockage sur le terrain).

Je veux supprimer ce type de contenu pendant désinstallation le module.

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

12
Akash Jain

Assurez-vous simplement que le type de nœud dépend de votre module, puis 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.

15
Berdir

Cela semble le faire pour moi.

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

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 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 d'implémenter 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();
  }
}
5
Bundio

Pour déclencher une action lors de la désinstallation d'un module, vous devez implémenter hook_uninstall dans le module *.install fichier. 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();
}
3
leymannx