TYPO3 FAL in einer eigenen Extbase/Fluid Extension einsetzen

Mittlerweile klappt das mit dem File Abstraction Layer (FAL) immer besser.

Und wie es klappt, folgt nun. Ziel ist, zwei FAL Felder in eine eigene Extension zu integrieren und alle nötigen Schritte bis zur Ausgabe im Fluid Template zu zeigen.

Die Extension im Beispiel heißt „falusage“ und die Tabelle bzw das Model heißt „Root“.

  • Es wird von TYPO3 6.1 ausgegangen.
  • Es wird von einer Extension ausgegangen, die mit dem Extension Builder erstellt wurde. Dadurch bereits vorhandene Konfigurationen werden nicht erklärt.
  • Im Extension Builder wurden am Model „Root“ zwei Felder „image“ (ein Bild) und „files“ (Dateien) konfiguriert und der Controller beherrscht eine List-Action.

Datei ext_tables.sql

CREATE TABLE tx_falusage_domain_model_root (
	# ...
	image varchar(255) DEFAULT '' NOT NULL,
	files varchar(255) DEFAULT '' NOT NULL,
	# ...
);

Datei Configuration/TCA/Root.php

$TCA['tx_falusage_domain_model_root'] = array(
	// ...
	'image' => array(
		'exclude' => 1,
		'label' => 'Image',
		'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig('image', array(
			'appearance' => array(
				'createNewRelationLinkTitle' => 'LLL:EXT:cms/locallang_ttc.xlf:images.addFileReference'
			),
			'minitems' => 0,
			'maxitems' => 1,
		), $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),
	),
	'files' => array(
		'exclude' => 1,
		'label' => 'Files',
		'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig('files', array(
			'appearance' => array(
				'createNewRelationLinkTitle' => 'LLL:EXT:cms/locallang_ttc.xlf:images.addFileReference'
			),
		), $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),
	),
	// ...
);

An getFileFieldTCAConfig wird der aktuelle Feldname übergeben. Die Funktion erzeugt einen großen Schwung Konfiguration.

Datei Classes/Domain/Model/Root.php

class Root extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
	// ...
	
	/**
	 * Image
	 * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
	 */
	protected $image;

	/**
	 * Files
	 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
	 */
	protected $files;
	
	// ...
	
	/**
	 * Returns the image
	 *
	 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $image
	 */
	public function getImage() {
		return $this->image;
	}

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

	/**
	 * Returns the files
	 *
	 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $files
	 */
	public function getFiles() {
		return $this->files;
	}

	/**
	 * Sets the files
	 *
	 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $files
	 * @return void
	 */
	public function setFiles($files) {
		$this->files = $files;
	}
	
	// ...
}

„\TYPO3\CMS\Extbase\Domain\Model\FileReference“ als Typ ist wichtig, „File“ funktioniert wider erwarten nicht und zu ganz wilden Fehlern.

Datei Classes/Controller/RootController.php

class RootController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
	// ..
	public function listAction() {
		$roots = $this->rootRepository->findAll();
		$this->view->assign('roots', $roots);		
	}
	// ..
}

Datei Resources/Private/Templates/Root/List.html

Es folgen eine ganze Reihe Fluid Beispiel; wie man an welche Information rankommt.

Mein Model:                       root
Das FileReference Model:          root.image
Der sys_file_reference Datensatz: root.image.originalResource
Der sys_file Datensatz:           root.image.originalResource.originalFile

<f:for each="{roots}" as="root">
Orginal-Attribute:<br />
Dateiname:    {root.image.originalResource.originalFile.name}<br />
Titel:        {root.image.originalResource.originalFile.title}<br />
Beschreibung: {root.image.originalResource.originalFile.description}<br />
Alt-Text:     {root.image.originalResource.originalFile.alternative}<br />
UID:          {root.image.originalResource.originalFile.uid}<br />
Pfad:         {root.image.originalResource.publicUrl}<br /><br />

Referenz-Attribute:<br />
Titel:        {root.image.originalResource.title}<br />
Beschreibung: {root.image.originalResource.name}<br /><br />

Ausgabe als Bild:<br />
<f:image src="{root.image.originalResource.originalFile.uid}" alt="" /><br />
<f:image src="{root.image.uid}" alt="" treatIdAsReference="TRUE" /><br /><br />

Als Link:<br />
<a href="{file.originalResource.publicUrl}">{file.originalResource.title}</a><br /><br />

<f:for each="{root.files}" as="file">				
	<p>{file.originalResource.originalFile.title}</p>
</f:for>

</f:for>

Für Typoscript:

Für Typoscript gibt es hier ein paar Beispiele, aber keine Garantie ob insb. Forenbeiträge aktuell sind.

23 comments
  1. ist irgendwie nirgends dokumentiert:

    file extension (filetype) // file size (filesize) // type?

    {yourfile.originalResource.originalFile.extension}
    {yourfile.originalResource.originalFile.size}
    {yourfile.originalResource.originalFile.type}

  2. Tolle Anleitung!
    Ich hab da nur noch eine Sache, die ich nicht check. Es gibt ja bei FAL auch die metadata. Ich hab es endlich geschafft, dass neu hochgeladene Dateien automatisch die Metadaten ausgelesen bekommen in der Tabelle abgespeichert werden. Nur funktioniert die Ausgabe hier überhaupt nicht.

    in der Referenz von MEDIA steht man solle mit {xxx.metadata.title} zB den Titel aus der Tabelle Metadata ausgeben können. Aber das funktioniert bei mir überhaupt nicht. Wobei es bei mir nicht um den Titel sondern um die copyright_notice geht. Weil bei jedem Foto der Urheberrechtsnachweis dabei stehen muss.

    Hast du da eine Idee woran es liegt?

    lg Matthias

  3. Vielen Dank für das tolle Tutorial! Es hat mir sehr weitergeholfen.

    Ich habe länger gebraucht, bis ich herausgefunden habe, dass in meiner Ext. evt auch ein „Multiple Files“ Feld habe (vgl. die Antwort an Ganybhat), weil ich nämlich das FileReference-Model noch durchloopen muss, um eine Ausgabe zu erhalten.

    Die TCA-Einstellungen habe ich aber analog zum obigen Beispiel vorgenommen. Ist ein solches „Multiple Files“ Verhalten denn etwa anderswo definiert?

  4. Danke für die Anleitung, funktioniert gut.

    Sobald ich im Ausgabetemplate jedoch wie in deinem Beispiel each verwende (möchte mehrere Bilder ausgeben) bekomme ich folgende Fehlermeldung:
    The argument „each“ was registered with type „array“, but is of type „object“ in view helper „TYPO3\CMS\Fluid\ViewHelpers\ForViewHelper“

    Ich verwende TYPO3 6.1.6

  5. Danke für die tolle Anleitung!

    @Ganybhat: In the fluid-template use file.originalResource.publicUrl instead of file.originalResource.originalFile.publicUrl

  6. Hi,

    danke für den tollen Beitrag!
    Läuft eigenlich ohne Problem bis wir probieren mehr als eine Datei anzusprechen..
    Dann bleibt das einfach leer..

  7. I have done same thing, but I am unable to get the originalResource. If I debug the file array, I see the originalResource is null. How to solve this ?
    Thank you.

    • Hi Ganybhat,
      maybe you’re not using 6.1? I don’t know about the state in e.g. 6.0. Maybe try surfing the code to find a hint.
      Or have you made a „multiple files“ field and try to access it as if it was one?
      Hope it helps. Good luck.
      Regards, Rüdiger

  8. Super!
    Danke für die schöne Zusammenfassung.

    Hast Du auch ne Ahnung wie ich in Extbase eine neue Datei zu FAL hinzufüge?
    z.B. Ich erzeuge eine txt- oder pdf-Datei mit meiner Extension (kein Problem), will die unter fileadmin speichern (kein Problem) und dann an einen eigenen Record anfügen (???).

    Gruß
    Joerg

  9. Vielen Dank für das Tutorial!

    Kann man das soweit abwandeln, dass man auch mehr als ein Bild über den Weg ausgeben lassen kann?

    Danke für einen Tipp!

  10. Vielen Dank für dieses Tutorial…
    Läuft soweit super!

    Gibt es auch die Möglichkeit mehr als nur ein Bild via Fluid auszugeben? Mit dem IRRE Modul kann man ja so intuitiv mehrere Bilder anlegen – nur wie wertet man das dann aus? Ich steh da gerade wie der Ochs vorm Berg..

    • Hi Sebastian,

      mit IRRE ist es gar kein Problem, Datensätze in Fluid zu verarbeiten. im TCA ist für die Zuordnung ein Feldname definiert (für eine Menge „postcard“ Datensätze hast Du vielleicht „postcards“ als Feldname gewählt). Diesen Feldnamen für die Iteration benutzen. Bspw.:

      <f:for each="{postcards}" as="item">
        <p>Test: {item.title}</p>
      </f:for>
      

Add Comment

Required fields are marked *. Your email address will not be published.