web-dev-qa-db-fra.com

Comment obtenir la liste des révisions d'un nœud et les supprimer toutes?

Révisions et comment les supprimer toutes. Pour Drupal 7, il y a beaucoup de modules qui font cela ou même limitent les révisions qui sont conservées ou même suppriment tout ce qui est plus ancien que x-days, mais pas pour Drupal 8.

Il semble qu'il n'y ait rien. Rechercher dans la base de données est quelque chose que j'aime ne pas faire.

Des idées?

7
Daniel

Oui, comme vous le dites, il existe une liste de modules qui peuvent le faire dans Drupal 7 comme:

Suppression de la révision du nœud

Le module Node Revision Delete vous permet de suivre et d'élaguer les anciennes révisions des types de contenu. Définissez le nombre maximal de révisions à conserver par type de contenu. Exécuter sur Drush, cron run ou sur une période différente ( quotidien, hebdomadaire, etc.).

Node Revision Restrict

Le module Node Revision Restrict vous permet de restreindre les révisions du nœud pour chaque type de contenu. Ce module dispose d'une interface d'administration pour spécifier le seuil de révision du nœud pour chaque type de contenu disponible. Le paramètre possible inclut le type de nœud avec limite de révision correspondante, fournie sur le formulaire de configuration Node Revision Restrict. Notez que ce module ne supprime pas et ne peut pas supprimer les révisions actuelles d'un nœud.

Nettoyage de révision de nœud

Node Revision Cleanup est conçu pour les très grandes bases de données. Et les administrateurs de site qui sont à l'aise avec Drush. Le concept derrière ce module est de pouvoir exécuter plusieurs invocations en même temps, via Drush pour maximiser le nombre de suppressions de révision de nœud par seconde.

Suppression de la révision

Ce module permet de supprimer en masse les révisions de nœuds vieillissants. Les paramètres possibles incluent le type de nœud, l'âge de la révision du nœud avant d'être supprimé, ainsi qu'un paramètre de fréquence Cron. Les révisions peuvent également être supprimées après examen sur une page d'administration. Ce module ne supprimera JAMAIS la révision actuelle d'un nœud, ni ne vous permettra de le faire.

Et pour Drupal 8 , eh bien en ce moment il n'y a pas de module pour faire ça, mais vous pouvez utiliser:

Pour obtenir la liste de révision d'un nœud:

$vids = \Drupal::entityManager()->getStorage('node')->revisionIds($node);

Voir Les nœuds ont maintenant un contrôleur de stockage; node_revision_list () supprimé.

Pour supprimer une révision de révision, vous pouvez utiliser la fonction node_revision_delete () , mais à la fin, voir le code de la fonction:

function node_revision_delete($revision_id) {
  \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);
}

Donc, c'est mieux si vous utilisez simplement:

\Drupal::entityTypeManager()->getStorage('node')->deleteRevision($revision_id);

8

Les suggestions ici sont correctes, bien que quelques points méritent d'être mentionnés.

$vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));

Mais comme cela est marqué comme obsolète, il doit être remplacé par:

$vids = \Drupal::entityTypeManager()->getStorage('node')->revisionIds($node);

L'exemple de code ici essaie également de supprimer la révision par défaut et cela entraînera [error] Default revision can not be deleted. Pour éviter cela, je vous suggère d'envelopper la suppression dans quelque chose comme:

  // If revision id is not default, remove it.
  if ($vid !== $node->getLoadedRevisionId()) {
    print 'Removing revision ' . $vid . PHP_EOL;
    \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
  }
2
steinmb

Extrait pour supprimer tout sauf la dernière révision d'un nœud spécifique:

<?php
  try {
    $nid = 123; // Your node id
    $vids = \Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));
    foreach($vids as $vid){        
      \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
    }
  } catch (Exception $e) {
    // Latest revision will not be deleted but throws an error
    return $e->getMessage();
  }
?>
2
Thomas

Il existe un module de travail pour Drupal 8: Node Revisions Autoclean .

Ce module permet de gérer le magasin de révisions du nœud: selon les paramètres de l'administrateur, les anciennes révisions sont automatiquement supprimées.

Vous pouvez choisir le nombre de révisions que vous souhaitez conserver pour chaque type de nœud. Les derniers brouillons venant après une révision publiée ne sont jamais supprimés. Vous pouvez également choisir de supprimer les révisions par date.

Pour les sites Web plus grands avec de nombreux nœuds, vous pouvez choisir de supprimer la révision par cron ou une commande drush (drush 9 uniquement).

Ne vous attendez pas à ce qu'il fonctionne sur des exécutions cron normales, pour l'instant. Mais il peut être configuré pour s'exécuter sur des nœuds de mise à jour. Voici le problème pour le cron, que je ne comprends pas complètement: https://www.drupal.org/project/node_revisions_autoclean/issues/2958655

2
user25246

Veuillez toujours injecter un stockage de la manière appropriée:

  # my_module.services.yml
  node_storage: 
    class: Drupal\node\NodeStorage
    factory: entity_type.manager:getStorage
    arguments: ['node']
  my_service:
    class: Drupal\my_module\MyService
    arguments: ['@node_storage']

Dans ce cas, vous pouvez déjà avoir dans votre constructeur de classe les éléments suivants:

class MyService {

  /**
   * @var \Drupal\node\NodeStorageInterface
   */
  private $storage;

  public function __construct(NodeStorageInterface $storage) {
    $this->storage = $storage;
  }

}

Dans ce cas, votre IDE listera également facilement toutes les méthodes disponibles contrairement à cette solution:

\Drupal::entityManager()->getStorage('node')->revisionIds(node_load($nid));

N'oubliez pas qu'EntityTypeManager est dans la plupart des cas "trop" de puissance: n'utilisez que ce dont vous avez besoin mais pas plus. Les configurations de service peuvent vous y aider.

1
ssibal