上传时调用数据对象函数(SilverStripe)

Calling to data object function on upload (SilverStripe)

我有一个名为 AdminUpload 的数据对象 class,它存储两个变量:UploadDate(它总是会被设置为当前日期)和 Total,这是一个整数。

调用函数 updateUploads() 并存储当前日期,并在每次调用时将 Total 递增 1。

<?php

class AdminUpload extends DataObject {

    private static $db = array(
        'UploadDate' => 'Date',
        'Total' => 'int'
    );

    // Tell the datagrid what fields to show in the table
    private static $summary_fields = array(
        'ID' => 'ID',
        'UploadDate' => 'Current Date',
        'Total' => 'Version Number'
    );

    public function updateUploads(){
        $uploadDate = SS_Datetime::now();
        $this->UploadDate = $uploadDate;
        $this->Total++;//increment the value currently stored in the database each time

        $this->write();
    }

}

我想做的是,当有人在管理视图中上传新图像时,updateCache() 函数会在 onAfterWrite() 过程中被调用。不过,我只想在数据库中保留一个条目,所以每次上传图像时,我只想在 AdminUpload 数据库 table 中保留一个条目。

public function onAfterWrite(){
        $updateGallery = parent::onAfterWrite();

        $adminUploading = AdminUpload::get();
        $adminUploading -> updateUploads();

        return $updateGallery;
    }

我从来没有尝试过像这样在 SilverStripe 中进行函数调用——这看起来很简单,但由于我不会在每次调用 updateUploads() 函数时向数据库添加新条目,所以我被困在哪里。任何提示都会有所帮助...

为一条记录创建整个 table 是不正确的做法。如果您打算在页面上使用这两个字段,那么将它们添加到该页面(创建新的页面类型)将是一个更好的主意。

如果你说的是文件上传,那么你总是可以直接从数据库中查询这些信息。

$uploadedFilesCount = File::get()->count();
$lastUploadedFileDate = File::get()->sort('CreatedDate', 'DESC')->first()->CreatedDate;

onAfterWrite 是一个钩子,从 DataExtension 开始使用。有直接在 DO 上调用 hook,然后在扩展上调用 hooks 的情况。

您的扩展代码可能看起来像这样来处理 'onCreated' 状态:

class UploadsCounter extends DataExtension {
    protected $isCreating = false;

    public function onBeforeWrite() {
       if (!$this->owner->isInDB()) {
           $this->isCreating = true;
       }
    }

    // called on validation or database error
    public function onAfterSkippedWrite() {
        $this->isCreating = false;
    }

    public function onAfterWrite() {
        if (!$this->isCreating) return;

        $this->isCreating = false;
        $adminUploading = AdminUpload::get()->first();

        if (!$adminUploading ) {
            $adminUploading = new AdminUpload();
            $adminUploading->write();
        }

        $adminUploading->updateUploads();
    }
}

您应该在要计数的数据对象上定义 UploadsCounter 扩展名,例如:

mysite/_config/config.yml

File:
  extensions:
    - UploadsCounter