我正在尝试更新具有 FAL 图像的记录。这是我的更新操作,
$obj = $this->mediaAlbumRepository->findByUid(GeneralUtility::_GP('album'));
$obj->setTitle(GeneralUtility::_GP('title'));
$obj->setDescription(GeneralUtility::_GP('description'));
$obj->setWebdescription(GeneralUtility::_GP('webdescription'));
$obj->setType(GeneralUtility::_GP('type'));
$obj->setDatetime(new \DateTime());
$obj->setGalleryOwner($this->user['uid']);
$assetsMetaData = GeneralUtility::_GP('imgMetaData');
$utilityObj = GeneralUtility::makeInstance(UploadAssetsProviderUtility::class);
$fileObj = $utilityObj->processAssets($_FILES, $assetsMetaData, $uploadFolderId);
$fileObjStorage = GeneralUtility::makeInstance(ObjectStorage::class);
foreach($fileObj as $item) {
$fileObjStorage->attach($item);
}
if(GeneralUtility::_GP('type') == 'static') {
$obj->setFiles($fileObjStorage);
}
$this->mediaAlbumRepository->update($obj);
UploadAssetsProviderUtility.php
我有以下函数,可以使用实用程序类将 $_FILE 转换为 Filereference 对象。
/**
* Create file reference object
*
* @param UploadedFile $fileImage
* @param Folder $uploadFolder
* @param String $uploadFolderId
* @param Array $metainfo
* @return FileReference $fileReference
*/
protected function uploadFile($fileImage, $uploadFolder, $uploadFolderId, $fileMeta = []): FileReference
{
[$storageId, $storagePath] = explode(':', $uploadFolderId, 2);
$storage = $this->resourceFactory->getStorageObject($storageId);
$fileReference = GeneralUtility::makeInstance(
FileReference::class,
$assetProp,
$this->resourceFactory
);
if(is_array($fileImage)) {
$file = $storage->addFile(
$fileImage['tmp_name'],
$uploadFolder,
$fileImage['name']
);
$assetProp = [
'uid_local' => $file->getUid(),
'uid_foreign' => StringUtility::getUniqueId('NEW_'),
'uid' => StringUtility::getUniqueId('NEW_'),
'crop' => null,
];
$metaTitle = $fileImage['falMetaData']['title'] ? $fileImage['falMetaData']['title'] : $fileImage['name'];
$metaAlt = $fileImage['falMetaData']['alt'] ? $fileImage['falMetaData']['alt'] : $fileImage['name'];
$metaLink = $fileImage['falMetaData']['link'] ? $fileImage['falMetaData']['link'] : '';
$metaDescription = $fileImage['falMetaData']['description'] ? $fileImage['falMetaData']['description'] : '';
$fileReference->setOriginalResource($file);
} else {
// here $metainfo->uid has existing Filereference UID if already exist and find Filereference object
$fileImage = $this->resourceFactory->getFileReferenceObject($metainfo->uid);
$properies = $fileImage->getReferenceProperties();
$metaTitle = $fileMeta['falMetaData']['title'] ? $fileMeta['falMetaData']['title'] : $fileMeta['name'];
$metaAlt = $fileMeta['falMetaData']['alt'] ? $fileMeta['falMetaData']['alt'] : $fileMeta['name'];
$metaLink = $fileMeta['falMetaData']['link'] ? $fileMeta['falMetaData']['link'] : '';
$metaDescription = $fileMeta['falMetaData']['description'] ? $fileMeta['falMetaData']['description'] : '';
$fileReference->setUidLocal($properies['uid_local']);
}
$fileReference->setTitle($metaTitle);
$fileReference->setAlternative($metaAlt);
$fileReference->setDescription($metaDescription);
$fileReference->setLink($metaLink);
$fileReference->setTableLocal('sys_file');
$fileReference->setTablenames($this->foreignTable);
return $fileReference;
}
在这里,如果您检查条件
if(is_array($fileImage)) {
以检查其新文件($_FILE)。现在,如果它是新的,它可以正常工作并返回 Filereference 对象并存储到表中。
现在,我遇到更新问题。当我尝试更新文件时,它会创建另一个 Filereference 对象,而不是更新现有的对象。
现在,如果 Filereference 存在,有没有办法更新 FAL 元属性。如果它不存在,则创建一个新的。
首先,在 TYPO3 版本中,您可以避免通过
$_FILES
全局,而是在 Extbase-Controller 内签出 $this->request->getUploadedFiles();
,否则您会在 $GLOBALS['TYPO3_REQUEST']
中找到它们。从这里处理图像比使用提到的全局变量要容易得多。
但是:如果确实发生了真正的上传,请求中只会包含有关上传文件的信息。因此,如果没有上传,您可以确定从 Fluid-Form 提交的任何其他信息都是现有关系的属性,Extbase 应自行处理。假设您的
<f:form>
中有一个对象“Car”,并且它包含属性“carPictures”内的图像,您可以迭代所有现有图像,并通过使用“property”属性定位这些信息来添加有关其参考属性的表单字段每个表单字段。
因此,迭代 <f:for each...>
中的所有现有图像并解决它们的属性,例如 <f:form.textfield property="carPictures.{fileReference.uid}.title" />
,然后向每个图像添加额外的隐藏字段,例如 <f:form.hidden property="carPictures.{fileReference.uid}" value="{fileReference}" />
,这样 extbase 就会自行注意到哪个属性更改属于哪个现有图像,它将保留它们并更新属性。