Silverstripe 4中如何扩展UploadField并在上传时获取额外FormField的POST值
在Silverstripe 4中扩展UploadField并获取额外字段值的实现
实现步骤
1. 扩展UploadField类并添加额外表单字段
要给UploadField添加自定义的TextField,需扩展UploadField类,通过重写FieldHolder方法注入额外字段,同时声明允许upload动作。
2. 重写upload方法获取POST参数
在重写的upload方法中,直接通过HTTPRequest对象获取额外字段的POST提交值,再结合业务逻辑完成数据处理。
完整代码示例
class UploadFieldExtension extends UploadField { private static $allowed_actions = [ 'upload' ]; /** * 渲染字段时插入额外文本字段 */ public function FieldHolder($properties = []) { // 创建名为ProductCategory的额外文本字段 $extraField = TextField::create('ProductCategory', '产品分类'); // 将额外字段加入模板渲染数据 $properties['ExtraField'] = $extraField->FieldHolder(); // 调用父类方法渲染原有上传字段 return parent::FieldHolder($properties); } public function upload(HTTPRequest $request, $dummyCategory = null) { // 获取上传文件 $tmpFile = $request->postVar('Upload'); // 获取额外字段的提交值 $productCategory = $request->postVar('ProductCategory'); $file = $this->saveTemporaryFile($tmpFile, $error); $folder = Folder::find_or_make('Products'); // 创建产品对象并赋值,使用获取到的额外字段值 $product = ProductObject::create(); $product->Title = $file->Title; $product->ProductImage = $file; $product->ProductImageID = $file->ID; $product->ProductCatObjectID = $productCategory; // 填入额外字段值 $id = $product->write(); $file->ProductObjectID = $id; $file->ProductSettingID = ''; $fileID = $file->write(); $file->doPublish(); $myimage = MyImage::create(); $myimage->ImageID = $fileID; $myimage->ProductObjectID = $id; $myimage->write(); $myimage->doPublish(); // 错误处理逻辑 if ($error) { $result = [ 'message' => [ 'type' => 'error', 'value' => $error, ] ]; $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result), 400))->addHeader('Content-Type', 'application/json'); } // 确保文件已存入数据库 if (!$file->isInDB()) { $file->write(); } // 返回成功响应 $result = [ AssetAdmin::singleton()->getObjectFromData($file) ]; // 保留客户端生成的图片缩略图 if ($result[0]['category'] === 'image') { unset($result[0]['thumbnail']); } $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result)))->addHeader('Content-Type', 'application/json'); } }
关键说明
- 添加额外字段:通过
FieldHolder方法创建并注入自定义TextField,确保该字段与UploadField一同渲染到页面,字段名称需与后续获取值时的名称一致。 - 获取POST值:使用
$request->postVar('字段名')即可获取额外字段的提交值,直接用于业务对象的属性赋值。 - 业务逻辑整合:将额外字段值与上传文件关联,完成产品、文件、图片对象的创建与存储。
内容的提问来源于stack exchange,提问作者seppzzz
相关产品推荐
相关产品推荐

