在前端上下文中上传和更新具有 FAL 引用和属性值 TYPO3 的资源

问题描述 投票:0回答:1

我正在尝试更新具有 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 extbase typo3-11.x fal typo3-12.x
1个回答
0
投票

首先,在 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 就会自行注意到哪个属性更改属于哪个现有图像,它将保留它们并更新属性。

© www.soinside.com 2019 - 2024. All rights reserved.