Nachfolgend ein aktualisiertes Beispiel zum älteren Post "Extbase - FAL FileReference im Controller erzeugen" zum Erzeugen einer FAL FileReference und Hinzufügen der neuen FileReference zum Extbase Model. Dieses Beispiel basiert ebenfalls auf einer erweiterten Klasse "FileReference", welche in TYPO3 9 LTS für dieses Szenario leider immer noch erforderlich ist (aber vielleicht kommt das ja bald in den Core: https://forge.typo3.org/issues/88833).

In diesem Beispiel sind drei mögliche Varianten aufgeführt (Abschnitt "Extbase Controller"), wie vor der Erstellung der eigentlichen FileReference das Objekt "File" mit den Mitteln der TYPO3 Core API erzeugt werden kann.

Besonders wichtig ist, dass die TCA Konfiguration den "foreign_match_fields" Schlüssel enthält und dieser richtig definiert ist. Ebenso muss das Mapping der erweiterten FileReference via TypoScript gesetzt werden. Falsche Konfigurationen an dieser Stelle resultieren häufig in korrupten Einträgen in "sys_file_reference" (Spalten "tablenames" und "filedname" sind dann leer).

Extbase Model (FileReference)

<?php

namespace Vendor\Ext\Domain\Model;

/***************************************************************
 *  Copyright notice
 *
 *  (c) 2014 Helmut Hummel
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

/**
 * Class FileReference
 */
class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference {

    /**
     * uid of a sys_file
     *
     * @var integer
     */
    protected $originalFileIdentifier;

    /**
     * setOriginalResource
     *
     * @param \TYPO3\CMS\Core\Resource\FileReference $originalResource
     * @return void
     */
    public function setOriginalResource(\TYPO3\CMS\Core\Resource\FileReference $originalResource) {
        $this->originalResource = $originalResource;
        $this->originalFileIdentifier = (int)$originalResource->getOriginalFile()->getUid();
    }

    /**
     * setFile
     *
     * @param \TYPO3\CMS\Core\Resource\File $falFile
     * @return void
     */
    public function setFile(\TYPO3\CMS\Core\Resource\File $falFile) {
        $this->originalFileIdentifier = (int)$falFile->getUid();
    }

}

Extbase Model (Person)

<?php

namespace Vendor\Ext\Domain\Model;

/**
 * Class Person
 */
class Person extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * image
     *
     * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
     */
    protected $image = NULL;

    /**
     * Returns the image
     *
     * @return \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
     */
    public function getImage() {
        return $this->image;
    }

    /**
     * Sets the image
     *
     * @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
     * @return void
     */
    public function setImage(\TYPO3\CMS\Extbase\Domain\Model\FileReference $image) {
        $this->image = $image;
    }

}

Extbase Controller

<?php

namespace Vendor\Ext\Domain\Model;

/**
 * Class PersonController
 */
class PersonController  extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

   /**
    * personRepository
    *
    * @var \Vendor\Ext\Domain\Repository\PersonRepository
    * @inject
    */
    protected $personRepository;

    /**
     * Action addImage
     *
     * @param \Vendor\Ext\Domain\Model\Person $person
     * @return void
     */
    public function AddImageAction(\Vendor\Ext\Domain\Model\Person $person) {

        // A) File Objekt für bereits im Storage befindliche Datei erstellen (der Storage kennt sie aber noch nicht und sie soll da bleiben wo ist schon ist):
        $file = ResourceFactory::getInstance()->retrieveFileOrFolderObject('path_to_file');

        // B) File Objekt für (irgendwo) vorhandene Datei erstellen, die dabei in den Storage kopiert wird:
        $storage = ResourceFactory::getInstance()->getDefaultStorage();
        $file = $storage->getFolder('folder_name')->addFile('path_to_file');

        // C) File Objekt erstellen mit einer leeren Datei (also kein copy usw.), die später mit setContents() gefüllt wird:
        $storage = ResourceFactory::getInstance()->getDefaultStorage();
        $file = $storage->getFolder('folder_name')->createFile('path_to_file', $folder);

        // Und dann für alle 3 Varianten gleich, die Erzeugung der eigentlichen Dateireferenz:
        $fileReference = $objectManager->get(\Vendor\Ext\Domain\Model\FileReference::class);
        $fileReference->setFile($file);

        // Hinzufügen der neuen FileReference zum Model
        $person->setImage($fileReference);

        $this->personRepository->update($person);

    }

}

TCA Konfiguration (Person)

'image' => [
    'exclude' => 1,
    'label' => 'LLL:EXT:ext/Resources/Private/Language/locallang_db.xlf:tx_ext_domain_model_person.image',
    'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
        'image',
        [
            'minitems' => 0,
            'maxitems' => 1,
            'foreign_match_fields' => [
                'fieldname' => 'image',
                'tablenames' => 'tx_ext_domain_model_person',
                'table_local' => 'sys_file',
            ],
        ],
        $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
    ),
],

TypoScript Konfiguration (Mapping der FileReference)

config.tx_extbase {
    persistence {
        classes {
            Vendor\Ext\Domain\Model\FileReference {
                mapping {
                        tableName = sys_file_reference
                    columns {
                        uid_local.mapOnProperty = originalFileIdentifier
                    }
                }
            }
        }
        objects {
            TYPO3\CMS\Extbase\Domain\Model\FileReference.className = Vendor\Ext\Domain\Model\FileReference
        }
        updateReferenceIndex = 1
    }
}




Kommentare