ノードのリビジョンリストを取得してすべて削除する方法は?


7

リビジョンとそれらをすべて削除する方法。Drupal 7の場合、それを行うモジュールや、保持されるリビジョンを制限したり、x日より古いすべてのものを削除したりするモジュールはたくさんありますが、Drupal 8にはありません。

そこには何もないようです。データベースを検索することは、私がしたくないことです。

何か案は?


進歩はありますか?
エイドリアンCid Almaguer

回答:


8

はい、あなたが言うように、Drupal 7でこれを行うことができるモジュールのリストがあります:

ノードリビジョンの削除

ノードリビジョン削除モジュールを使用すると、コンテンツタイプの古いリビジョンを追跡およびプルーニングできます。コンテンツタイプごとに保持するリビジョンの最大量を定義します。Drush、cron実行、または別の期間(毎日、毎週など)で実行します。

ノードリビジョン制限

ノードリビジョン制限モジュールを使用すると、各コンテンツタイプのノードのリビジョンを制限できます。このモジュールには、利用可能な各コンテンツタイプのノードリビジョンしきい値を指定する管理インターフェイスがあります。可能な設定には、ノードリビジョン制限の構成フォームで提供される、対応するリビジョン制限を持つノードタイプが含まれます。このモジュールは、ノードの現在のリビジョンを削除しないことに注意してください。

ノードリビジョンのクリーンアップ

ノードリビジョンクリーンアップは、非常に大きなデータベース用に設計されています。Drushに慣れているサイト管理者。このモジュールの背後にある概念は、Drushを介して複数の呼び出しを同時に実行して、1秒あたりのノードリビジョンの削除数を最大化できるようにすることです。

リビジョン削除

このモジュールを使用すると、古いノードリビジョンを一括削除できます。可能な設定には、ノードタイプ、削除前のノードリビジョンの経過時間、Cron頻度設定などがあります。改訂は、管理ページでのレビュー後にも削除される場合があります。このモジュールは、ノードの現在のリビジョンを削除することも、削除することもできません。

Drupal 8の場合、現時点ではそれを行うためのモジュールはありませんが、使用できます。

ノードのリビジョンリストを取得するには:

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

参照ノードは現在、ストレージコントローラを持っています。node_revision_list()が削除されました。

リビジョンリビジョンを削除するには、node_revision_delete()関数を使用できますが、最後に関数コードを参照してください:

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

だから、あなただけを使用した方が良いです:

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


リビジョンリストを取得するために、代わりの方法はありentityManagerますか?その非推奨だと思います。
不明な開発者2018

1
@KimberlyW entityManager()のentityTypeManager()を変更するだけで機能します。
エイドリアンCid Almaguer

1
新しいビューの作成中にコンテンツのリビジョンを見つけることができます。そしてそこにリビジョンリンクを削除するオプションがあります。
Vishal Kumar Sahu

この回答でも同じです。entityTypeManager()-> getStorage()はEntityStorageInterfaceを返します。「revisionIds」メソッドはありません。メソッドを含めるには、NodeStorageInterfaceを明示的に注入する必要があります。
ssibal 2018


2

特定のノードの最新リビジョン以外をすべて削除するスニペット:

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

1
華麗なトーマス。エイドリアンの回答のモジュールがD8で実際に機能しないことを確認すると、これはより良いオプションであることがわかりました。MYTHEME.themeファイルに追加すると、実際に機能します。ループを最初に追加して、すべてのノードを通るようにすることはできますか?これは、開発サイトを本番環境に移行し、すべての開発リビジョンをダンプして無駄をなくしてクリーンアップするために、これを非常に優れたものにします。
ピエト

2

ここでの提案は正しいですが、いくつか言及する価値があります。

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

ただし、これは非推奨としてマークされているため、次のものに置き換える必要があります。

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

ここのコード例でもデフォルトのリビジョンを削除しようとすると、が発生し[error] Default revision can not be deletedます。それを回避するには、削除を次のようなものにラップすることをお勧めします。

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

これは完全に誤った答えです。entityTypeManager()-> getStorage()はEntityStorageInterfaceを返します。「revisionIds」メソッドはありません。
ssibal 2018

@ssibalはtrueですが、ノードストレージを扱っているため、NodeStorageInterfaceを取得します。
akalata

2

Drupal 8:Node Revisions Autoclean用の作業モジュールがあります。

このモジュールにより、ノードのリビジョンストアを管理できます。管理者の設定に従って、古いリビジョンは自動的に削除されます。

各ノードタイプに対して保持するリビジョンの数を選択できます。公開された改訂後の最新の下書きは削除されません。日付でリビジョンを削除することもできます。

多くのノードを持つ大規模なウェブサイトの場合、cronまたはdrushコマンド(drush 9のみ)でリビジョンを削除することを選択できます。

まだ通常のcronの実行で実行されるとは期待しないでください。ただし、更新ノードで実行するように設定できます。これは私が完全に理解していないcronの問題です:https : //www.drupal.org/project/node_revisions_autoclean/issues/2958655


1

常に適切な方法でストレージを注入してください:

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

この場合、クラスコンストラクターに次のものを既に含めることができます。

class MyService {

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

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

}

この場合、IDEは、このソリューションとは異なり、利用可能なすべてのメソッドを簡単にリストします。

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

EntityTypeManagerは、ほとんどの場合「多すぎる」能力です。必要な量だけ使用してください。サービス構成はそれを支援します。


私はあなたの答えをテストします、これについていくつかの参照を提供できますか?
エイドリアン・シド・アルマガー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.