Ahoi,
seit Typo3 6.0 habe ich auch mit der Tabelle sys_file_reference zu tun und möchte hier einfach mal meine Lösung posten, wie ich die Referenzen in einem Flexform definiere und in einem Plugin wieder raushole. Die Lösung wird wahrscheinlich nicht der Standard-Weg sein, funktioniert aber auf's erste, bis ich mehr Infos zum FAL bekomme.
Das Plugin, welches ich erstellen musste, ist eine simple kleine Bilder-Galerie. Einfach ein paar Bilder in einem Slider. Dazu bekommt der Redakteur ein Inhaltselement vom Typ Plugin an die Hand, in dessen Einstellungen er einfach Datei-Referenzen zu Bildern setzt.
Hier der Bilder-Bereich im Plugin-Flexform (myext/Configuration/FlexForms/flexform_pi1.xml). Sämtliche Parameter habe ich im Backend-Modul "Konfiguration" unter "TCA -> tt_content -> columns -> image -> config" entnommen:
<settings.images>
<TCEforms>
<label>Bilder</label>
<config>
<appearance>
<createNewRelationLinkTitle>LLL:EXT:cms/locallang_ttc.xlf:images.addFileReference</createNewRelationLinkTitle>
<enabledControls>
<delete>1</delete>
<dragdrop>1</dragdrop>
<hide>1</hide>
<info></info>
<localize></localize>
<new></new>
<sort></sort>
</enabledControls>
<headerThumbnail>
<field>uid_local</field>
<width>64</width>
<height>64</height>
</headerThumbnail>
<showPossibleLocalizationRecords>1</showPossibleLocalizationRecords>
<showRemovedLocalizationRecords>1</showRemovedLocalizationRecords>
<showSynchronizationLink>1</showSynchronizationLink>
<useSortable>1</useSortable>
</appearance>
<behaviour>
<localizationMode>select</localizationMode>
<localizeChildrenAtParentLocalization>1</localizeChildrenAtParentLocalization>
</behaviour>
<filter>
<numIndex index="0">
<parameters>
<allowedFileExtensions>gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai</allowedFileExtensions>
<disallowedFileExtensions></disallowedFileExtensions>
<userFunc>TYPO3\CMS\Core\Resource\Filter\FileExtensionFilter->filterInlineChildren</userFunc>
</parameters>
</numIndex>
</filter>
<foreign_field>uid_foreign</foreign_field>
<foreign_label>uid_local</foreign_label>
<fieldname>galleryimages</fieldname>
<foreign_selector>uid_local</foreign_selector>
<foreign_selector_fieldTcaOverride>
<config>
<appearance>
<elementBrowserAllowed>gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai</elementBrowserAllowed>
<elementBrowserType>file</elementBrowserType>
</appearance>
</config>
</foreign_selector_fieldTcaOverride>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_table>sys_file_reference</foreign_table>
<foreign_table_field>tablenames</foreign_table_field>
<foreign_types>
<numIndex index="2">
<showitem>--palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, --palette--;;filePalette</showitem>
</numIndex>
</foreign_types>
<maxitems>50</maxitems>
<minitems>1</minitems>
<type>inline</type>
</config>
</TCEforms>
</settings.images>
In der tabelle sys_file_reference werden nun Einträge erzeugt, bei denen das Feld "uid_foreign" die UID des Inhaltselements besitzt und im Feld "tablenames" "tt_content" steht.
Um diese Daten im Plugin wieder auszulesen, hole ich die Daten des Inhaltselements in meiner Controller-Action, beauftrage das FileRepository die Daten zu holen und erstelle Datei-Objekte.
Im FileRepository gibt es die Methode "findByRelation()", bei der man uid_foreign, tablenames und fieldname übergibt. Leider fehlt aber im Datensatz die Information fieldname. Deswegen habe ich diese Methode überschrieben, indem ich im Plugin die Repository-Klasse erweiterte.
FileRepository im Plugin (myext/Classes/Domain/Repository/FileRepository.php):
namespace VENDOR\Myext\Domain\Repository;
class FileRepository extends \TYPO3\CMS\Core\Resource\FileRepository {
/**
* Find FileReference objects by relation to other records
*
* @param int $tableName Table name of the related record
* @param int $uid The UID of the related record (needs to be the localized uid, as translated IRRE elements relate to them)
* @return array An array of objects, empty if no objects found
* @throws \InvalidArgumentException
* @api
*/
public function findByRelation($tableName, $uid) {
$itemList = array();
if (!\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($uid)) {
throw new \InvalidArgumentException('Uid of related record has to be an integer.', 1316789798-);
}
$references = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
'*',
'sys_file_reference',
'tablenames=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($tableName, 'sys_file_reference') .
' AND deleted = 0' .
' AND hidden = 0' .
' AND uid_foreign=' . intval($uid),
'',
'sorting_foreign'
);
foreach ($references as $referenceRecord) {
$itemList[] = $this->createFileReferenceObject($referenceRecord);
}
return $itemList;
}
}
Diese Methode nutze ich in der Action, um die Referenzen zu holen. Dazu muss ich im Controller zuerst das Repo bekannt machen, dann die Referenzen holen und aus den Referenz-Objekten Datei-Objekte erzeugen.
Hier der relevante Teil des Controllers zur Übersicht (myext/Classes/Controller/Pi1Controller.php):
namespace VENDOR\Myext\Controller;
class Pi1Controller extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* @var VENDOR\Myext\Domain\Repository\FileRepository
* @inject
*/
protected $fileRepository;
/**
* action show
*
* @return void
*/
public function showAction() {
/*
* get the data of this content-element
*/
$data = $this->configurationManager->getContentObject()->data;
/*
* try to find the relations
*/
$fileReferences = $this->fileRepository->findByRelation("tt_content", $data['uid']);
/*
* create file-objects
*/
$images = array();
if ($fileReferences) {
foreach ($fileReferences as $fileReference) {
try {
$images[] = $fileReference->toArray();
} catch (Exception $e) {
}
}
}
/*
* assign the view
*/
$this->view->assignMultiple(array(
'images' => $images,
'data' => $data
));
}
}
Anm. 1: Der try-catch-Part ist nur ein Versuch auf fehlende Original-Dateien zu reagieren, der aber noch nicht funktioniert).
Anm. 2: Wie sich das mit Übersetzungen verhält, weiß ich noch nicht.
LG sun