我有一个名为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;我被困的地方。任何提示都会有所帮助......
答案 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