gpt4 book ai didi

file-upload - TYPO3 6.2 - 如何在前端(FE)中创建 FileReference?

转载 作者:行者123 更新时间:2023-12-04 10:24:42 28 4
gpt4 key购买 nike

我有假设 Zoo我有 Animal 的扩展名型号为 photo具有典型 CRUD 操作的字段和前端 (FE) 插件。 photo字段是典型的 FAL 的 FileReference它在后端 (BE) 中完美运行,具有常见的 TCA IRRE 配置。

我能够成功地将文件上传到存储中,它在 中可见文件列表 模块,我可以在动物编辑期间在 BE 中使用它,反正我无法创建 FileReference在我的 FE 插件中。

我目前的方法如下所示:

/**
* @param \Zoo\Zoo\Domain\Model\Animal $animal
*/
public function updateAction(\Zoo\Zoo\Domain\Model\Animal $animal) {

// It reads proper uploaded `photo` from form's $_FILES
$file = $this->getFromFILES('tx_zoo_animal', 'photo');

if ($file && is_array($file) && $file['error'] == 0) {

/** @type $storageRepository \TYPO3\CMS\Core\Resource\StorageRepository */
$storageRepository = GeneralUtility::makeInstance('\TYPO3\CMS\Core\Resource\StorageRepository');
$storage = $storageRepository->findByUid(5); // TODO: make target storage configurable

// This adds uploaded file to the storage perfectly
$fileObject = $storage->addFile($file['tmp_name'], $storage->getRootLevelFolder(), $file['name']);

// Here I stuck... below line doesn't work (throws Exception no. 1 :/)
// It's 'cause $fileObject is type of FileInterface and FileReference is required
$animal->addPhoto($fileObject);

}

$this->animalRepository->update($animal);
$this->redirect('list');
}

无论如何尝试通过此行创建引用会引发异常:
$animal->addPhoto($fileObject);

我该如何解决这个问题?

已检查: DataHandler方法( link )也不起作用,因为它对 FE 用户不可用。

TL;DR

如何添加 FileReferenceAnimal来自现有(刚刚创建的)FAL 记录的模型?

最佳答案

你需要做几件事。这个issue on forge是我得到信息的地方,有些东西是从 Helmut Hummels frontend upload example 中取出的(以及 @derhansen 已经评论过的 accompanying blogpost )。

我不完全确定这是否是您需要的一切,所以请随意添加。这不使用 TypeConverter,您可能应该这样做。这将开辟更多的可能性,例如,很容易实现文件引用的删除和替换。

你需要:

  • 从 File 对象创建一个 FAL 文件引用对象。这可以使用 FAL 资源工厂来完成。
  • 将其包裹在 \TYPO3\CMS\Extbase\Domain\Model\FileReference 中(方法->setOriginalResource)
  • 编辑: TYPO3 6.2.11 和 7.2 不需要这一步,你可以直接使用类 \TYPO3\CMS\Extbase\Domain\Model\FileReference .

    但是,由于 extbase 模型在 6.2.10rc1 中遗漏了一个字段 ($uidLocal),所以这不起作用。您需要从 extbase 模型继承,添加该字段并填充它。不要忘记在 TypoScript 中添加映射以将您自己的模型映射到 sys_file_reference .
    config.tx_extbase.persistence.classes.Zoo\Zoo\Domain\Model\FileReference.mapping.tableName = sys_file_reference

    该类看起来像这样(取自 forge 问题):
     class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference {

    /**
    * We need this property so that the Extbase persistence can properly persist the object
    *
    * @var integer
    */
    protected $uidLocal;

    /**
    * @param \TYPO3\CMS\Core\Resource\ResourceInterface $originalResource
    */
    public function setOriginalResource(\TYPO3\CMS\Core\Resource\ResourceInterface $originalResource) {
    $this->originalResource = $originalResource;
    $this->uidLocal = (int)$originalResource->getUid();
    }
    }
  • 在配置部分中将其添加到图像字段的 TCA 中(当然要适应您的表和字段名称):
    'foreign_match_fields' => array(
    'fieldname' => 'photo',
    'tablenames' => 'tx_zoo_domain_model_animal',
    'table_local' => 'sys_file',
    ),
  • 编辑 : 使用 \TYPO3\CMS\Extbase\Domain\Model\FileReference如果在 TYPO3 6.2.11 或 7.2 或更高版本上,则在此步骤中。

    所以最后添加创建的$fileRef而不是 $fileObject
    $fileRef = GeneralUtility::makeInstance('\Zoo\Zoo\Domain\Model\FileReference');
    $fileRef->setOriginalResource($fileObject);

    $animal->addPhoto($fileRef);
  • 不要告诉任何人你做了什么。
  • 关于file-upload - TYPO3 6.2 - 如何在前端(FE)中创建 FileReference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28708064/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com