Trash
Drupalコンテンツエンティティにソフトデリート(ゴミ箱)機能を提供し、削除されたコンテンツを完全に削除するのではなく復元できるようにします。
trash
インストール
composer require 'drupal/trash:^3.0'
概要
Trashモジュールは、Drupalコンテンツエンティティに「ソフトデリート」メカニズムを実装します。ユーザーがコンテンツを削除すると、完全に削除されるのではなく、エンティティに削除タイムスタンプが付けられ、通常のサイト運用からは非表示になります。これにより、一元化されたゴミ箱インターフェースからコンテンツを復元できます。
このモジュールは、有効化されたエンティティタイプに対してカスタムストレージクラスを動的に生成し、削除操作をインターセプトすることで機能します。エンティティが「削除」されると、データベースから実際にエンティティを削除するのではなく、内部タイムスタンプフィールドを設定します。ゴミ箱に入れられたエンティティは、エンティティクエリ、Views、およびエンティティアクセスフックによる直接アクセスから非表示になります。
Trashは、設定可能な期間後に古いゴミ箱コンテンツの自動パージ、特殊な動作のためのエンティティタイプ固有のハンドラー、DrupalのWorkspacesモジュールとの統合をサポートしています。このモジュールは、ゴミ箱コンテンツを管理するためのWebインターフェースと、一括操作のためのDrushコマンドの両方を提供します。
Features
- SQLベースのあらゆるコンテンツエンティティタイプに対応したソフトデリート機能
- /admin/content/trashにある一元化されたゴミ箱管理インターフェースで、削除されたコンテンツの表示と管理が可能
- 削除されたエンティティをすべてのデータを保持したまま元の状態に復元
- 不要になったゴミ箱内のエンティティを完全にパージ(削除)
- 指定した期間(例:30日)後にゴミ箱内のコンテンツを自動的に削除する設定可能な自動パージ機能
- エンティティタイプごと、バンドルごとにゴミ箱機能を有効化する設定
- Twigテンプレートを使用した動的ストレージクラス生成により削除操作をインターセプト
- 通常のリストからゴミ箱内のエンティティを非表示にするエンティティクエリとViewsクエリの変更
- ゴミ箱内のコンテンツへの不正なアクセスを防止するエンティティアクセス制御
- Workspaceコンテキストでのゴミ箱エンティティの処理のためのWorkspace統合
- 検索インデックスからゴミ箱内のエンティティを除外するSearch API統合
- 関連するURLエイリアスを自動的にゴミ箱に入れたり復元したりするパスエイリアス統合
- 適切なメニューツリー管理のためのMenu Link Contentハンドラー
- 一括復元およびパージ操作のためのDrushコマンド
- エンティティタイプ固有の動作のための拡張可能なゴミ箱ハンドラーシステム
- 3つのゴミ箱コンテキスト:active(通常の操作)、inactive(ゴミ箱での作業)、ignore(ゴミ箱をバイパス)
Use Cases
誤って削除したコンテンツの復元
コンテンツ編集者が重要な記事を誤って削除してしまいました。完全に失われるのではなく、記事はゴミ箱に移動されます。管理者は管理 > コンテンツ > ゴミ箱に移動し、リストで記事を見つけて「復元」をクリックすることで、すべてのデータ、リビジョン、URLエイリアスをそのまま復元できます。
スケジュールされたコンテンツクリーンアップ
大規模なニュースサイトは毎日何百もの記事を生成します。30日後にゴミ箱のコンテンツを自動的に削除するように自動パージを設定します。編集者は古いコンテンツを削除しても1ヶ月間は復元可能であることを知っていますが、無期限に蓄積されることはありません。必要に応じて即座に一括クリーンアップするには'drush trash:purge --all'を実行します。
マルチエンティティタイプのゴミ箱管理
サイトでノード、メディアエンティティ、カスタムコンテンツエンティティを使用しています。関連するすべてのエンティティタイプに対してゴミ箱を有効にします。ゴミ箱は各エンティティタイプ用のタブを持つ統合インターフェースを提供し、コンテンツ管理者は単一の場所からすべての削除されたコンテンツを確認および管理できます。
Workspace対応のコンテンツ削除
公開前にWorkspaceでコンテンツが編集されています。Workspaceでコンテンツがゴミ箱に入れられると、Workspaceが公開されるまでLiveでは表示されたままです。公開後、ゴミ箱の状態がLiveに伝播され、関連するメニューリンクが適切にクリーンアップされます。
Drushによる一括操作
開発者がステージング環境からテストコンテンツをクリーンアップする必要があります。'drush trash:purge node'を使用してすべてのゴミ箱内のノードを完全に削除するか、問題のあるデプロイメント後に'drush trash:restore --all'を使用してすべてのエンティティタイプのすべてのゴミ箱コンテンツを復元します。
バンドル固有のゴミ箱設定
サイトにはArticleとPageのコンテンツタイプがありますが、Articles(ページはめったに削除されない)にのみゴミ箱機能が必要です。ノードのArticleバンドルのみにゴミ箱を有効にするように設定し、Pagesはゴミ箱を経由せずに通常通り削除されるようにします。
Tips
- エンティティの正規URLで'?in_trash=true'クエリパラメータを使用すると、ゴミ箱内のエンティティを直接表示できます(適切な権限が必要)
- ゴミ箱コンテキストは、\Drupal::service('trash.manager')->executeInTrashContext('ignore', function() { ... })を使用して一時的に変更でき、ゴミ箱の状態に関係なくすべてのエンティティにアクセスする必要がある操作に使用できます
- Trashはエンティティがゴミ箱に入れられたり復元されたりするときに新しいリビジョンを作成し、完全なリビジョン履歴を維持します
- ゴミ箱リストの「削除者」列には、(リビジョン対応エンティティの場合)誰がエンティティを削除したかが表示されます
- 多くのエンティティタイプが有効になっている場合は、「コンパクト表示」を有効にしてゴミ箱インターフェースを簡素化することを検討してください
- エンティティクエリは->addMetaData('trash', 'inactive')を使用して明示的にゴミ箱内のエンティティをクエリできます
- カスタムゴミ箱ハンドラーは、TrashHandlerInterfaceを実装し、'trash_handler'タグでサービスにタグ付けすることで作成できます
Technical Details
Admin Pages 2
/admin/config/content/trash
どのエンティティタイプがゴミ箱を使用できるかを設定し、古いゴミ箱コンテンツの自動パージを設定します。
/admin/content/trash
すべてのゴミ箱内(ソフトデリートされた)コンテンツエンティティを表示および管理します。削除されたアイテムを一覧表示し、復元または完全パージのオプションを提供します。
権限 5
Hooks 8
hook_entity_pre_trash_delete
エンティティがソフトデリート(ゴミ箱に移動)される前に実行されます。
hook_ENTITY_TYPE_pre_trash_delete
特定のエンティティタイプがソフトデリートされる前に実行されます。
hook_entity_trash_delete
エンティティがソフトデリート(ゴミ箱に移動)された後に応答します。
hook_ENTITY_TYPE_trash_delete
特定のエンティティタイプがソフトデリートされた後に応答します。
hook_entity_pre_trash_restore
エンティティがゴミ箱から復元される前に実行されます。
hook_ENTITY_TYPE_pre_trash_restore
特定のエンティティタイプがゴミ箱から復元される前に実行されます。
hook_entity_trash_restore
エンティティがゴミ箱から復元された後に応答します。
hook_ENTITY_TYPE_trash_restore
特定のエンティティタイプがゴミ箱から復元された後に応答します。
Drush Commands 2
drush trash:restore [entity_type_id] [entity_ids]
ゴミ箱からエンティティをアクティブ状態に復元します。
drush trash:purge [entity_type_id] [entity_ids]
ゴミ箱内のエンティティをシステムから完全に削除します。
Troubleshooting 6
Trash設定(/admin/config/content/trash)で特定のエンティティタイプとバンドルに対してゴミ箱が有効になっていることを確認してください。また、エンティティタイプがSQLベースのストレージを使用していることも確認してください。
Viewsが'deleted'フィールドを明示的にクエリしていないことを確認してください。Trashモジュールは自動的にクエリを変更しますが、deletedフィールドへのカスタム条件はこれをバイパスします。カスタムコードでゴミ箱コンテキストが'ignore'に設定されていないか確認してください。
パスエイリアスの場合、同じパスを持つ別のエイリアスがすでに存在すると発生します。競合するエイリアスを先に削除または変更してください。他のエンティティタイプの場合、ゴミ箱ハンドラーでエンティティ固有のバリデーションを確認してください。
cronが正常に実行されていること、設定で自動パージが有効になっていることを確認してください。auto_purge.afterの値が有効な時間表現(例:'30 days')であることを確認してください。キュー処理エラーがないかDrupalログを確認してください。
カスタムストレージクラスがある場合、TrashStorageTraitのメソッドと互換性があることを確認してください。Trashはストレージクラスを継承するクラスを動的に生成します。代わりにTrashの生成クラスから継承することを検討してください。
PHPストレージが書き込み可能であることを確認してください。TrashはPhpStorageFactoryを使用して生成されたクラスを保存します。キャッシュをクリアし、生成されたPHPストレージディレクトリのファイル権限を確認してください。
Security Notes 4
- 'view deleted entities'権限は、意図的にパブリックアクセスから削除されたコンテンツの表示を許可するため、慎重に付与する必要があります
- 'purge'権限は復元オプションなしでデータを完全に削除します - 信頼できるロールにのみ割り当ててください
- 自動パージはcron経由で実行され、データを完全に削除します - コンプライアンス要件に適した保持期間を確保してください
- ゴミ箱内のエンティティは検索結果や通常のクエリから除外されますが、パージされるまでデータはデータベースに残ります