You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:52:23