如何从SilverStripe管理员中的DataObject分离文件系统时删除文件(图像)?

时间:2018-02-11 20:33:51

标签: forms orm silverstripe

例如,我有这段代码

for

当用户从admin

中的MyDataObject中删除文件时

[screen]

此文件仍保留在'文件中。 cms的一部分,在数据库和文件系统中,因此用户需要转到文件'并手动删除。

在实践中,他经常忘记在从某个数据对象中删除文件后删除文件,并且所有这些文件都占有很多位置。

当用户点击截屏时,SilverStripe如何自动从文件系统中删除文件?

2 个答案:

答案 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
  1. 在自定义DataObject子项中,使用此属性设置要删除的文件/图像

    private static $ kill_on_detach = [     &#39;图像&#39 ;,     &#39;拇指&#39 ;, ];

  2. 解决方案并不完美:

    • 即使它附加到另一个DataObject实例
    • ,它也会杀死文件
    • 如果用户从管理员面板分离文件并忘记了,它就不会杀死文件 保存DataObject

    如果有人想提出更好的决定 - 欢迎。