Wie kann ich die Revisionsliste eines Knotens abrufen und alle löschen?

7

Revisionen und wie man sie alle löscht. Für Drupal 7 gibt es viele Module, die dies tun oder sogar die beibehaltenen Revisionen einschränken oder sogar alles löschen, was älter als x Tage ist, aber nicht für Drupal 8.

Es scheint, dass da draußen nichts ist. Das Durchsuchen der Datenbank möchte ich nicht tun.

Irgendwelche Ideen?

Daniel
quelle
Hast du einen Vorschuss?
Adrian Cid Almaguer

Antworten:

8

Ja, wie Sie sagen, gibt es eine Liste von Modulen, die dies in Drupal 7 tun können, wie:

Knotenrevision löschen

Mit dem Modul "Knotenrevision löschen" können Sie alte Revisionen von Inhaltstypen verfolgen und bereinigen. Definieren Sie die maximale Anzahl von Revisionen, die pro Inhaltstyp beibehalten werden sollen. Laufen Sie auf Drush, Cron Run oder in einem anderen Zeitraum (täglich, wöchentlich usw.).

Knotenrevisionsbeschränkung

Mit dem Modul "Knotenrevisionsbeschränkung" können Sie die Knotenrevisionen für jeden Inhaltstyp einschränken. Dieses Modul verfügt über eine Administrationsoberfläche, über die der Schwellenwert für die Knotenrevision für jeden verfügbaren Inhaltstyp angegeben werden kann. Die mögliche Einstellung umfasst den Knotentyp mit dem entsprechenden Revisionslimit, der im Konfigurationsformular "Node Revision Restrict" angegeben ist. Beachten Sie, dass dieses Modul die aktuellen Revisionen eines Knotens nicht löscht und nicht löschen kann.

Bereinigung der Knotenrevision

Node Revision Cleanup wurde für wirklich große Datenbanken entwickelt. Und Site-Administratoren, die mit Drush vertraut sind. Das Konzept hinter diesem Modul besteht darin, über Drush mehrere Aufrufe gleichzeitig ausführen zu können, um die Anzahl der Löschungen von Knotenrevisionen pro Sekunde zu maximieren.

Revision löschen

Dieses Modul ermöglicht das Massenlöschen alternder Knotenrevisionen. Mögliche Einstellungen sind der Knotentyp, das Alter der Knotenrevision vor dem Löschen sowie eine Cron-Frequenzeinstellung. Die Revisionen können auch nach Überprüfung auf einer Verwaltungsseite gelöscht werden. Dieses Modul löscht NIEMALS die aktuelle Version eines Knotens und erlaubt Ihnen dies auch nicht.

Und für Drupal 8 gibt es derzeit kein Modul dafür, aber Sie können Folgendes verwenden:

So rufen Sie die Revisionsliste eines Knotens ab:

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

Siehe Knoten haben jetzt einen Speichercontroller. node_revision_list () entfernt.

Um eine Revision zu löschen, können Sie die Funktion node_revision_delete () verwenden. Am Ende finden Sie jedoch den Funktionscode:

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

Also, ist besser, wenn Sie nur verwenden:

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

Adrian Cid Almaguer
quelle
Gibt es eine Alternative, um die Revisionsliste zu erhalten entityManager? Ich denke, es ist veraltet.
The Unknown Dev
1
@KimberlyW Ändern Sie einfach entityTypeManager () für entityManager () und sollten funktionieren.
Adrian Cid Almaguer
1
Sie können die Inhaltsrevision finden, während Sie eine neue Ansicht erstellen. Dort können Sie auch den Revisionslink löschen.
Vishal Kumar Sahu
Gleiches gilt für diese Antwort: entityTypeManager () -> getStorage () gibt ein EntityStorageInterface zurück. Es gibt keine "revisionIds" -Methode. Sie müssen NodeStorageInterface explizit einfügen, um die Methode zu erhalten.
ssibal
@ssibal gerade gelesen: api.drupal.org/api/drupal/…
Adrian Cid Almaguer
2

Snippet zum Löschen aller bis auf die letzte Version eines bestimmten Knotens:

<?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();
  }
?>
Thomas
quelle
1
brillanter Thomas. Ich fand dies eine bessere Option, da keines der Module in Adrians Antwort tatsächlich in D8 funktioniert. Ihre funktioniert tatsächlich, wenn sie zur Datei MYTHEME.theme hinzugefügt wird. Könnten Sie dem Start vielleicht eine Schleife hinzufügen, damit sie alle Knoten durchläuft? Das würde das super machen, wenn man eine Entwickler-Site in die Produktion bringt und alle Entwickler-Revisionen ablegt, um sich aufzuräumen und aufzuräumen.
Piet
2

Die Vorschläge hier sind richtig, obwohl einige Dinge erwähnenswert sind.

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

Da dies jedoch als veraltet markiert ist, sollte es ersetzt werden durch:

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

Der Beispielcode hier versucht auch, die Standardversion zu löschen, und das wird dazu führen [error] Default revision can not be deleted. Um dies zu vermeiden, schlage ich vor, dass Sie die Entfernung in etwas wie Folgendes einwickeln:

  // If revision id is not default, remove it.
  if ($vid !== $node->getLoadedRevisionId()) {
    print 'Removing revision ' . $vid . PHP_EOL;
    \Drupal::entityTypeManager()->getStorage('node')->deleteRevision($vid);
  }
steinmb
quelle
Dies ist eine völlig falsche Antwort. entityTypeManager () -> getStorage () gibt ein EntityStorageInterface zurück. Es gibt keine "revisionIds" -Methode.
ssibal
@ssibal true, aber da es sich um Knotenspeicher handelt, erhalten wir NodeStorageInterface.
Akalata
2

Es gibt ein Arbeitsmodul für Drupal 8: Node Revisions Autoclean .

Mit diesem Modul kann der Revisionsspeicher des Knotens verwaltet werden: Gemäß den Einstellungen des Administrators werden ältere Revisionen automatisch gelöscht.

Sie können auswählen, wie viele Revisionen Sie für jeden Knotentyp behalten möchten. Neueste Entwürfe, die nach einer veröffentlichten Überarbeitung eingehen, werden niemals gelöscht. Sie können Revisionen auch nach Datum löschen.

Bei größeren Websites mit vielen Knoten können Sie die Revision per Cron oder einem Drush-Befehl löschen (nur Drush 9).

Erwarten Sie noch nicht, dass es auf normalen Cron-Läufen läuft. Es kann jedoch so eingestellt werden, dass es beim Aktualisieren von Knoten ausgeführt wird. Hier ist das Problem für den Cron, das ich nicht vollständig verstehe: https://www.drupal.org/project/node_revisions_autoclean/issues/2958655

user25246
quelle
1

Bitte injizieren Sie immer eine Lagerung in der richtigen Weise:

  # 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']

In diesem Fall können Sie bereits Folgendes in Ihrem Klassenkonstruktor haben:

class MyService {

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

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

}

In diesem Fall listet Ihre IDE im Gegensatz zu dieser Lösung auch problemlos alle verfügbaren Methoden auf:

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

Denken Sie daran, dass EntityTypeManager in den meisten Fällen "zu viel" Leistung bietet: Verwenden Sie nur so viel, wie Sie benötigen, aber nicht mehr. Servicekonfigurationen können Ihnen dabei helfen.

ssibal
quelle
Ich werde Ihre Antwort testen. Können Sie hierzu einige Hinweise geben?
Adrian Cid Almaguer