上传时调用数据对象函数(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
我有一个名为 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