例如,我有这段代码
for
当用户从admin
中的MyDataObject中删除文件时此文件仍保留在'文件中。 cms的一部分,在数据库和文件系统中,因此用户需要转到文件'并手动删除。
在实践中,他经常忘记在从某个数据对象中删除文件后删除文件,并且所有这些文件都占有很多位置。
当用户点击截屏时,SilverStripe如何自动从文件系统中删除文件?
答案 0 :(得分:1)
您的数据对象需要onAfterDelete()
。在那里你可以删除该文件。
(不要忘记在你的方法中致电Parent::onAfterDelete()
)
**更新**
或者,如果仅当用户正在编辑而正在删除您的对象时,则onAfterWrite()
是您的朋友。在那里,您可以比较图像的新旧ID,如果不同,请删除具有旧ID的图像。
答案 1 :(得分:0)
要解决问题,我已创建此扩展程序
<?php
use SilverStripe\ORM\DataExtension;
use SilverStripe\Assets\File;
class DataObjectRemoveImagesExt extends DataExtension {
private function killFile($fileId) {
$fileToRemove = File::get()->byId($fileId);
if ($fileToRemove) $fileToRemove->delete();
}
public function onAfterWrite() {
$changedFieldsArr = $this->owner->getChangedFields();
if (!$this->owner->config()->get('kill_on_detach')) return;
$detachList = $this->owner->config()->get('kill_on_detach');
foreach ($detachList as $fileFieldName) {
if (!isset($changedFieldsArr["{$fileFieldName}ID"])) continue;
$changedFieldValues = $changedFieldsArr["{$fileFieldName}ID"];
if (
(
$changedFieldValues['before'] != $changedFieldValues['after']
&&
$changedFieldValues['before'] != 0
&&
$changedFieldValues['after'] != 0
)
||
(
$changedFieldValues['after'] == 0
&&
$changedFieldValues['before'] != 0
)
){
$this->killFile($changedFieldValues['before']);
}
}
}
}
用法:
1.附加到DataObject
SilverStripe\ORM\DataObject:
extensions:
- DataObjectRemoveImagesExt
在自定义DataObject子项中,使用此属性设置要删除的文件/图像
private static $ kill_on_detach = [ &#39;图像&#39 ;, &#39;拇指&#39 ;, ];
解决方案并不完美:
如果有人想提出更好的决定 - 欢迎。