purplespider/silverstripe-asset-delete-if-unused-extension

为File类提供deleteIfUnused()方法

安装次数: 1,008

依赖项: 1

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

类型:silverstripe-vendormodule

1.0.1 2023-06-01 09:27 UTC

This package is auto-updated.

Last update: 2024-08-30 01:20:32 UTC


README

此Silverstripe模块为SilverStripe\Assets\File对象提供了新的deleteIfUnused()方法,当调用此方法时,将删除文件,但在它没有被其他地方使用的情况下,例如另一个PageDataObject

我什么时候想使用这个功能?

比如说你有一个主页幻灯片,每个幻灯片可以有一个图片。

如果CMS用户删除了一个幻灯片,理想情况下也应该删除为该幻灯片上传的任何图片(以避免孤儿图片浪费磁盘空间),但存在这样的风险,即这张图片在其他地方也被使用,例如CMS用户可能通过WYSIWYG编辑器添加了相同的图片到页面上,或者他们选择了相同的图片作为另一个幻灯片的图片,而没有重新上传。

此模块允许你告诉图片要被删除(例如从你的幻灯片的onAfterDelete方法),但当它没有与任何其他页面或数据对象关联时。

如果它与另一个对象关联,则不会删除,除非你删除了其他对象,此时由于它不再与任何东西关联,因此将删除图片。

安装

  1. 通过composer安装模块
composer require purplespider/silverstripe-asset-delete-if-unused-extension "1.*"
  1. 执行dev/build?flush=1

  2. 在你的代码中利用新的deleteIfUnused()方法:例如SlideshowSlide.php

protected function onAfterDelete()
{
    $this->MyImage()->deleteIfUnused();

    parent::onAfterDelete();
}

它是如何判断一个资产是否被使用的?

它使用现有的findAllRelatedData()方法,这是填充CMS文件部分中“使用于”标签页的方法。

它还排除了与“使用于”标签页相同的类,不将这些资产计为“被使用”,例如ChangeSetItemMember FileLinkFolder

我应该注意其他什么吗?

始终保留备份!我无法保证此模块不会删除已使用的资产,是否在您希望的场景中完全测试它取决于您。

警告,如果您在一个从Silverstripe 3升级的网站上使用此功能,则很可能WYSIWYG字段中的图片在img标签上没有ImageID属性,因此它不会检测到该图片在该页面上被使用,可能导致used图片被删除。