purplespider / silverstripe-asset-delete-if-unused-extension
为File类提供deleteIfUnused()方法
Requires
- silverstripe/cms: ^4 || ^5
This package is auto-updated.
Last update: 2024-08-30 01:20:32 UTC
README
此Silverstripe模块为SilverStripe\Assets\File对象提供了新的deleteIfUnused()
方法,当调用此方法时,将删除文件,但仅在它没有被其他地方使用的情况下,例如另一个Page
或DataObject
。
我什么时候想使用这个功能?
比如说你有一个主页幻灯片,每个幻灯片可以有一个图片。
如果CMS用户删除了一个幻灯片,理想情况下也应该删除为该幻灯片上传的任何图片(以避免孤儿图片浪费磁盘空间),但存在这样的风险,即这张图片在其他地方也被使用,例如CMS用户可能通过WYSIWYG编辑器添加了相同的图片到页面上,或者他们选择了相同的图片作为另一个幻灯片的图片,而没有重新上传。
此模块允许你告诉图片要被删除(例如从你的幻灯片的onAfterDelete
方法),但仅当它没有与任何其他页面或数据对象关联时。
如果它与另一个对象关联,则不会删除,除非你删除了其他对象,此时由于它不再与任何东西关联,因此将删除图片。
安装
- 通过composer安装模块
composer require purplespider/silverstripe-asset-delete-if-unused-extension "1.*"
-
执行
dev/build?flush=1
-
在你的代码中利用新的
deleteIfUnused()
方法:例如SlideshowSlide.php
protected function onAfterDelete()
{
$this->MyImage()->deleteIfUnused();
parent::onAfterDelete();
}
它是如何判断一个资产是否被使用的?
它使用现有的findAllRelatedData()
方法,这是填充CMS文件部分中“使用于”标签页的方法。
它还排除了与“使用于”标签页相同的类,不将这些资产计为“被使用”,例如ChangeSetItem
、Member
FileLink
、Folder
。
我应该注意其他什么吗?
始终保留备份!我无法保证此模块不会删除已使用的资产,是否在您希望的场景中完全测试它取决于您。
警告,如果您在一个从Silverstripe 3升级的网站上使用此功能,则很可能WYSIWYG字段中的图片在img
标签上没有ImageID
属性,因此它不会检测到该图片在该页面上被使用,可能导致used
图片被删除。