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

时间:2016-03-23 19:22:04

标签: php silverstripe

我有一个名为AdminUpload的DataObject类,它存储两个变量:UploadDate(总是打赌设置为当前日期)和Total,这是一个int。< / p>

调用函数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数据库表中只有一个条目。

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

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

        return $updateGallery;
    }

我从来没有尝试像SilverStripe那样进行函数调用 - 看起来很简单但是因为我不打算在每次调用updateUploads()函数时向数据库添加一个新条目, #39;我被困的地方。任何提示都会有所帮助......

1 个答案:

答案 0 :(得分:2)

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

如果您正在谈论文件上传,那么您始终可以直接从数据库中查询此信息。

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

onAfterWrite是一个钩子,用于DataExtension。有些情况下直接在DO上调用钩子然后在扩展上调用。

您的扩展程序代码可能如下所示,以便处理&#39; onCreated&#39;状态:

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