Verwendung von FAL (File Abstraction Layer) mit TemplaVoila

Seit TYPO3 6.0 gibt es einen eingebauten File Abstraction Layer (kurz FAL) mit dem es möglich ist, eine Datei als Referenz statt einer Kopie zu erstellen. Üblicherweise wird beim auswählen eines Bildes oder Datei in TYPO3 immer eine Kopie im Ordner „uploads/tx_extension“ erstellt. Wenn man aber nun mit vielen hundert Dateien arbeiten muss, ist abzusehen, dass über einen längeren Zeitraum alle Verzeichnisse gelinde gesagt „zumüllen“. Um dieses Problem zu verhindern, gibt es nun den FAL, der dazu dient Dateien zu indizieren und zu referenzieren. Ebenso ist es mit diesem Layer ohne weiteres möglich, eine Verbindung zu einer externen Datenquelle wie Google Drive, Dropbox oder Amazon herzustellen.

Ich allerdings, bin starker Benutzer von TemplaVoila und dort ist dieses Feature des FAL noch nicht angekommen (wird bestimmt bald passieren). Möchte man aber trotzdem das Referenzieren von Bildern in TemplaVoila verwenden, gibt es eine Möglichkeit, die allerdings etwas Geschick erfordert.

Zuerst sollte man im TemplaVoila-Wizard für das Feld den Typ „Benutzerdefinierte Formularkonfiguration (keine Voreinstellung)“ auswählen. Damit die gemachten Einstellungen nicht gelöscht werden, sollte man das Objekt nochmal bearbeiten. Nun editiert die „TemplaVoilà-Datenstruktur“ in der Listenansicht des Template-Ordners und sucht sich das XML-Tag heraus, dass so heißt wie das Feld auf dem die Dateireferenz liegen soll.

Beispielsweise das Feld „field_image“:

<field_image type="array">

Nun sucht man den Knoten <TypoScript type="NULL"> und entfernt das type="NULL". Als Inhalt zwischen „<TypoScript></TypoScript>“ trägt man folgenden Code ein:

<![CDATA[
10 = FILES
10 {
	references {
		table = tt_content
		uid.data = TSFE:register|tx_templavoila_pi1.parentRec.uid
		fieldName = field_image
	}
	renderObj = IMAGE
	renderObj {
		file {
			import.data = file:current:publicUrl
			width = 150
		}
	}
}
]]>

Einstellungen:
table = tt_content: tt_content bei einem Flexiblen Inhaltselement und pages bei einer Seitenvorlage.
uid.data = TSFE:register|tx_templavoila_pi1.parentRec.uid: TSFE:register|tx_templavoila_pi1.parentRec.uid bei einem Flexiblen Inhaltselement und page : uid bei einer Seitenvorlage.
fieldName = field_image: muss mit dem aktuellen Feldnamen übereinstimmen.
file { }: hier kann man die gewünschten Einstellungen für das angezeigte Bild bzw. die Bilder vornehmen.

Nun muss das Formularfeld definiert werden. Die TCA-Einstellungen für die Referenzdateien findet man in den TYPO3-Sources unter „typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php::getFileFieldTCAConfig“. Dort befindet sich allerdings nur die Definition als Array, TemplaVoila verwendet in seinen Datenstrukturen aber ein XML-Format. Die Konvertierung habe ich hier einmal vorgenommen.

Zwischen </tx_templavoila> und </field_image> folgende Zeilen hinzufügen:

<TCEforms type="array">
	<label>Bild</label>
	<config type="array">
		<type>inline</type>
		<maxitems>1</maxitems>
		<foreign_table>sys_file_reference</foreign_table>
		<foreign_field>uid_foreign</foreign_field>
		<foreign_sortby>sorting_foreign</foreign_sortby>
		<foreign_table_field>tablenames</foreign_table_field>
		<foreign_match_fields>
			<fieldname>field_image</fieldname>
		</foreign_match_fields>
		<foreign_label>uid_local</foreign_label>
		<foreign_selector>uid_local</foreign_selector>
		<foreign_selector_fieldTcaOverride>
			<config>
				<appearance>
					<elementBrowserType>file</elementBrowserType>
					<elementBrowserAllowed>jpg,png</elementBrowserAllowed>
				</appearance>
			</config>
		</foreign_selector_fieldTcaOverride>
		<appearance>
			<useSortable>TRUE</useSortable>
			<headerThumbnail>
				<field>uid_local</field>
				<width>64</width>
				<height>64</height>
			</headerThumbnail>
			<showPossibleLocalizationRecords>TRUE</showPossibleLocalizationRecords>
			<showRemovedLocalizationRecords>TRUE</showRemovedLocalizationRecords>
			<showSynchronizationLink>TRUE</showSynchronizationLink>

			<enabledControls>
				<info>FALSE</info>
				<new>FALSE</new>
				<dragdrop>TRUE</dragdrop>
				<sort>FALSE</sort>
				<hide>TRUE</hide>
				<delete>TRUE</delete>
				<localize>TRUE</localize>
			</enabledControls>
		</appearance>
		<behaviour>
			<localizationMode>select</localizationMode>
			<localizeChildrenAtParentLocalization>TRUE</localizeChildrenAtParentLocalization>
		</behaviour>
	</config>
</TCEforms>

Einstellungen:
<label>jpg,png</label>: Titel des Feldes im Backend.
<maxitems>1</maxitems>: Anzahl an Bildern, die ausgewählt werden können.
<fieldname>field_image</fieldname>: Feldname aus TemplaVoila.
<elementBrowserAllowed>jpg,png</elementBrowserAllowed>: Erlaubte Dateiendungen für den Dateibrowser.

Nun muss noch der Eintrag <HSC>1</HSC> in <HSC>0</HSC> geändert werden. Dies verhindert, dass der entstandene Inhalt durch PHPs-Htmlspecialchars kodiert wird.

Nach dem Speichern sollte nun im Backend das neue Modell zum auswählen der Dateien erscheinen

FAL im Backend

FAL im Backend

Ich hoffe, dass das Feature bald komplett in TemplaVoila eingebaut wird, eine Ankündigung gab es bereits vor einigen Wochen.

9 Comments

  1. Gregor Meyer sagt:

    Hallo Stefan,

    danke für Deine Lösung, die funktioniert bei uns prima. Allerdings nur, solange sich das Feld für das Bild nicht innerhalb einer Section befindet. Ist das der Fall (etwa bei einer Bildergalerie), passieren schlimme Dinge: Im Backend tauchen nach dem Speichern alle Bilder jeweils in allen Feldern auf, bei zwei Containern also zwei mal zwei Bilder, bei dreien schon drei mal drei. Im Frontend werden auch jeweils mehrere Bilder gerendert.

    Ich vermute, dass das Abspeichern mit field_image nicht damit klar kommt, dass es mehrere Felder mit diesem Namen gibt. Die Dokumentation der TCEforms gibt leider nichts erhellendes her. Hast Du eine Idee, wo ich da ansetzen kann?

    Liebe Grüße,
    Gregor

    • Mo sagt:

      Hallo Gregor,
      hast Du in der Zwischenzeit eine Lösung für Dein beschriebenes Problem? Ich habe auch das gleiche Phänomen und noch keine Idee, wie ich es umgehen kann.
      VG, Mo

  2. Andreas sagt:

    Hallo Stefan,

    danke für das Posten der Lösung.
    Hast du auch schon mal eine Verbindung zur „sys_file_collection“ Tabelle hergestellt? Damit müsste man dann einen Ordner angeben können und alle darin befindlichen Files ausgeben können.

    Leider konnte ich bisher noch keine passende Flexform-Konfiguration dafür finden.

    Schönen Abend
    Andreas

  3. Markus sagt:

    Vielen Dank für den Tip. Es schimpfen ja viele über TV aber ich muss sagen ich finde es immer noch die beste Möglichkeit um eine Seite aufzubauen.

    Ich habe gerade versucht das Link und Alt-Text Feld einzufügen (so wie wenn ein normales Bild-Element eingefügt wird)- jedoch ohne Erfolg.

    Hast du das zufällig schon mal gemacht?

    Markus

  4. Ganybhat sagt:

    Thank you for the post.
    How to use this in templavoila section container ?

    If I use in section container, the last uploaded image overwrites previous images 🙁

  5. Marcos sagt:

    Hast du es schon mit Workspaces ausprobiert? Ich habe etwas ähnliches Benutzt und beim Publizieren des Workspaces gehen alle Bilder verloren.
    Grüße,
    Marcos

  6. Christian Sonntag sagt:

    Eine spitzen Blogbeitrag! Dieser funktioniert in abgewandelter Form übrigens auch hervorragend für Gridelements!

  7. Nette Doku, hab es mal versucht in eine Extension zu packen (inkl. Preview im Page-Modul). http://typo3.org/extensions/repository/view/dhbw_fal_templavoila

  8. Funktioniert einwandfrei, auch die Extension.
    Mit kleinen Anpassungen auch für Nicht-Bilder. 😎

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

question razz sad evil exclaim smile redface biggrin surprised eek confused cool lol mad twisted rolleyes wink idea arrow neutral cry mrgreen

*

Sicherheitsfrage * Time limit is exhausted. Please reload the CAPTCHA.