Hallo,
hier mal wie ich es gelöst habe.
1. Das '<f:form.upload/>' nicht mit Property sondern nur einem Name:
<f:form.upload name="foto" class="imageupload"/>
Da Extbase nicht mit dem Property
/**
* foto
*
* @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
* @cascade remove
*/
protected $foto = null;
umgehen kann - bzw. das Form liefert das Property eben nicht als FileReference.
2. Eine FileReference-Klasse erstellen:
<?php
namespace <MyNamespace>\<MyExtension>\Domain\Model;
class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference {
/**
* uid of a sys_file
*
* @var integer
*/
protected $originalFileIdentifier;
/**
* @param \TYPO3\CMS\Core\Resource\ResourceInterface $originalResource
*/
public function setOriginalResource(\TYPO3\CMS\Core\Resource\ResourceInterface $originalResource) {
parent::setOriginalResource($originalResource);
$this->originalResource = $originalResource;
$this->originalFileIdentifier = (int)$originalResource->getOriginalFile()->getUid();
}
/**
* @param \TYPO3\CMS\Core\Resource\File $falFile
*/
public function setFile(\TYPO3\CMS\Core\Resource\File $falFile) {
$this->originalFileIdentifier = (int)$falFile->getUid();
}
}
3. TCA-Overrides
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
// Imageupload
$GLOBALS['TCA']['tx_<extName>_domain_model_ansprechpartner']['columns']['foto']['config'] = ExtensionManagementUtility::getFileFieldTCAConfig('foto', [
'foreign_match_fields' => [
'fieldname' => 'foto',
'tablenames' => 'tx_<extName>_domain_model_ansprechpartner',
'table_local' => 'sys_file',
]
]);
4. Im Controller musst du eine Methode definieren:
/**
* @param $uploadFile
* @param $obj
* @param null $uid
* @param string $propertyName
*/
protected function setDateianhang($uploadFile, $obj, $uid = null, $propertyName = 'dateianhang') {
/** @var \TYPO3\CMS\Core\Resource\StorageRepository $storageRepository */
$storageRepository = $this->objectManager->get('TYPO3\\CMS\\Core\\Resource\\StorageRepository');
$storage = $storageRepository->findByUid('1'); // 1 ==> default to fileadmin
$folder = '<folderToStore>';
$targetFolder = null;
if ($storage->hasFolder($folder)) {
$targetFolder = $storage->getFolder($folder);
} else {
$targetFolder = $storage->createFolder($folder);
}
$originalFilePath = $uploadFile['tmp_name'];
$newFileName = $uploadFile['name'];
if (file_exists($originalFilePath)) {
$movedNewFile = $storage->addFile($originalFilePath, $targetFolder, $newFileName);
$newFileReference = $this->objectManager->get('<MyNamespace>\<MyExtension>\Domain\Model\FileReference');
$newFileReference->setFile($movedNewFile);
$method = 'set' . ucfirst($propertyName); // dem Obj. eine FileReference hinzufügen
$obj->{$method}($newFileReference);
}
}
5. In der Configuration/TypoScript/setup.ts noch ergänzen:
module.tx_<moduleName> {
persistence {
classes {
<MyNS>\<MyModule>\Domain\Model\FileReference {
mapping {
tableName = sys_file_reference
columns {
uid_local.mapOnProperty = originalFileIdentifier
}
}
}
}
}
}
6. Und als letztes musst du noch dein addAction() anpassen:
...
$requestArgs = $this->request->getArguments();
if ($requestArgs['foto']['name']) {
$this->setDateianhang($requestArgs['foto'], $ansprechpartner, null, 'foto', 'ansprechpartner');
}
...
Hoffe das beantwortet deine Frage 😉