php - SilverStripe 4 - 将上传的文件保存为成员扩展属性
问题描述
我正在尝试通过 AJAX 请求将上传的文件保存到页面控制器,作为Member
扩展属性。
我得到了一个Member DataExtension
实现File
具有关系的属性many_many
,如下所示:
我的Member Extension
[...]
/**
* Classe Utente - Estensione
*/
class UtenteExtension extends DataExtension
{
// Dichiarazione Proprietà
private static $many_many = [
'AllegatiUpload' => File::class, // this field should save users file uploads
[...]
];
private static $owns = [
'AllegatiUpload',
[...]
];
[...]
涉案Controller
人员:
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\ErrorPage;
use SilverStripe\Assets\Folder;
use SilverStripe\Assets\File;
use SilverStripe\Assets\Upload;
use SilverStripe\Security;
use SilverStripe\Security\Group;
use SilverStripe\Assets\Storage\AssetStore;
/**
* Classe Controller Utente - Dashboard
*/
class UtenteDashboardController extends PageController
{
// Dichiarazione Proprietà
private static $allowed_actions = [
'carica'
];
/**
* Funzione gestione validazione ed invio form caricamento
* @param HTTPRequest $request Richiesta HTTP
* @return HTTPResponse Risposta HTTP
*/
public function carica(SS_HTTPRequest $request) {
if (!$request->isAjax()) {
return ErrorPage::response_for(404);
} else if (!$request->isPOST()) {
return $this->httpError(400, 'Metodo POST richiesto');
} else {
$documento = $request->postVar('documento'); // File data sent by FormData JS API
if (!isset($documento)) {
return $this->httpError(500, 'Dati richiesti mancanti');
} else {
// User check
$utente = Security::getCurrentUser();
if ($utente->inGroup(Group::get()->filter('Code', 'clienti')->first()->ID)) {
// File uploading
$cartellaUpload = 'clienti/'. strtolower($utente->Surname) .'/uploads';
Folder::find_or_make($cartellaUpload);
// I tried with the official guide approach, with this line - with no results
//$utente->AllegatiUpload()->setFromLocalFile($cartellaUpload, documento, AssetStore::CONFLICT_OVERWRITE);
// Then I tried with this approach
$file = File::create();
$upload = Upload::create();
$upload->loadIntoFile($documento, $file, $cartellaUpload);
// Upload check
if ($upload->isError()) {
return $this->httpError(400, 'Errore di caricamento file');
} else {
// Relate the file to the destinaion user field
$utente->{'AllegatiUpload.ID'} = $upload->getFile()->ID;
// Update user
$utente->write();
return new HTTPResponse;
}
} else {
return $this->httpError(401, 'Utente non abilitato');
}
}
}
}
}
为了将文件与正确的Member
. 我想我错过了正确的语法,因为我正在处理一个many_many
关系,而这个不适合它:
// Relate the file to the destinaion user field
utente->{'AllegatiUpload.ID'} = $upload->getFile()->ID;
我也尝试过这样的方法:
$allegato = $utente->AllegatiUpload();
$allegato->setField('Documento', $upload->getFile()->ID);
$allegato->write();
但我收到了这个例外:
[紧急] 未捕获的 BadMethodCallException: Object->__call(): 方法 'write' 在 'SilverStripe\ORM\ManyManyList' 上不存在
也许我必须转换AllegatiUpload
为DataObject
第一个,然后在其中添加一个File
属性以避免这种情况?
解决方案
$object->RelationName()->add($item)
在您的情况下,您可以使用语法将新项目添加到关系中:
$utente->AllegatiUpload()->add($file);
参考https://docs.silverstripe.org/en/4/developer_guides/model/relations/#adding-relations
推荐阅读
- php - Facebook 广告 API 尝试连接错误 - (不支持的获取请求。ID 为“act_”的对象)
- grafana - 通过 Grafana 接口关闭 Zabbix 问题?
- java - 在 Java Rundeck 插件中使用 jar 添加依赖项
- pandas - 在 pandas 中使用双字符串标题重塑数据
- godot - 使用单例更改另一个节点的颜色
- python - PySpark:基于公共字符串列比较两个数据框并生成结果布尔 withColumn()
- java - 将 Spring 批处理连接到 Spring 集成工作流
- java - 创建子类或将类型设置为字符串?
- postgresql - Postgres中用户定义的连接功能?
- javascript - 改变反应原生tabBar的背景颜色