Skip to content

Repository files navigation

Recycle Bin

Recycle Bin provides opt-in recovery for deleted Backdrop content and protects managed files from permanent deletion. It is designed for contrib/custom integrations and keeps Backdrop's normal permanent-delete behavior when an item is not enabled.

Features

  • Send deleted content of selected content types to the Recycle Bin instead of deleting it immediately, so it can be restored.
  • Optional metadata-only protection for managed files from permanent deletion.
  • Optional recovery for terms in selected taxonomy vocabularies.
  • List, preview where supported, restore, and permanently delete protected entities from the Recycle Bin administration page.
  • Adapter API for custom Backdrop entity types.
  • Bounded automatic permanent deletion of expired Recycle Bin items.

Recycle Bin does not move file data when a managed file is sent to the Recycle Bin. A known public file URL may still be reachable; this feature is a recovery and cleanup safeguard, not an access-control or private-file mechanism.

When a node is sent to the Recycle Bin, its file-field usage remains intact so restoring the node also restores its references. Permanently deleting the node runs Backdrop's normal field cleanup; files with no remaining usages become temporary and are then removed by the normal file cleanup process.

Installation

Configuration

Content types are disabled by default. Enable only content types whose delete and restore behavior has been verified for the site.

Protection for managed files from permanent deletion is also disabled by default. Enable it only after reviewing the metadata-only behavior and the direct-URL limitation.

Automatic permanent deletion is disabled by default. When enabled, items past the retention period below are deleted during cron, up to the per-run limit. Failed automatic deletions wait one day before retrying so one broken item does not permanently block cleanup of later items.

Disabling and uninstalling

Disable Recycle Bin only when you intend its deleted items to return to normal visibility. Because a disabled module cannot enforce query filtering, the disable hook explicitly restores or releases every current marker before the module stops running. Normal entity data is preserved; nothing is permanently deleted by disabling or uninstalling the module.

Review and empty the Recycle Bin first when deleted content must remain hidden. Uninstall removes Recycle Bin configuration and tables after disable has released the markers.

API

Contrib and custom entity modules can register an adapter with hook_recycle_bin_adapter_info() and provide a replacement controller that extends the original controller and uses RecycleBinStorageAdapterTrait:

function example_recycle_bin_adapter_info() {
  return array(
    'example_entity' => array(
      'entity type' => 'example_entity',
      'controller class' => 'ExampleEntityController',
      'replacement class' => 'ExampleRecycleBinEntityController',
      'base table' => 'example_entity',
      'id key' => 'id',
      'enabled callback' => 'example_recycle_bin_entity_enabled',
    ),
  );
}

class ExampleRecycleBinEntityController extends ExampleEntityController {
  use RecycleBinStorageAdapterTrait;
}

The integrating module owns bundle policy, relationship semantics, access checks, cache/query overrides, and special restore or permanent-deletion rules. Lifecycle notifications are available through hook_entity_recycle_bin_delete(), hook_entity_recycle_bin_restore(), and hook_entity_recycle_bin_purge().

Testing

The module includes Backdrop SimpleTest coverage for node, taxonomy-term, custom-entity, managed-file, cron, query visibility, permissions, upgrade, disable, and uninstall behavior. From the Backdrop root, run:

php core/scripts/run-tests.sh --url http://backdrop RecycleBinNodeTestCase RecycleBinDisableUninstallTestCase

Replace http://backdrop with the test site's URL.

Scope and limitations

Recycle Bin does not intercept arbitrary custom SQL, external indexes, direct public file URLs, or configuration changes. Configuration objects such as Views and Blocks are outside this module's scope.

Issues and contributions

Please report reproducible bugs with the Backdrop version, module version, enabled adapters, relevant configuration, and restore/permanent-deletion steps. New adapters should include lifecycle tests and document ownership of related records before being enabled by default.

Current Maintainer

Justin Keiser

Credits

  • Created for Backdrop CMS by Justin Keiser.
  • Inspired by the Drupal Trash module.
  • Developed with AI assistance.

License

This project is licensed under the GNU General Public License, version 2 or later. See LICENSE.txt.

About

Soft-delete and recover opted-in Backdrop entities without destroying their content.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages