wenn man in andere Fußstapfen tritt!
Tab Allgemein
Auf dem Tab Allgemein wird unter "Titel" der Name des DCEs festgelegt, unter dem es später im Backend unter den Inhaltselementen zu finden ist.
Unter "Identifier" kann, muss aber nicht, die eindeutige Identifizierung des DCEs verändert werden. Diese ist standardmäßig "dceuidX" und wird in älteren Typo3s in der automatisch angelegten Klasse "frame-type-dce_dceuidX", die um Elemente gelegt wird, verwendet.
Mit Inaktiv lässt sich festlegen, ob das DCE im Backend überhaupt eingesetzt werden darf. Wenn man dieses Auswahlfeld wählt, dann werden alle Instanzen dieses DCEs als ungültig angezeigt.
Eingabefelder
Unter "Felder" lässt sich festlegen, welche Eingabefelder dem Redakteur im Backend angezeigt werden und wie diese aussehen sollen. Wird ein neues Feld erzeugt, so müssen zunächst zwei Felder ausgefüllt werden.
Das erste bestimmt den "Titel dieses Feldes", der dem Redakteur im Backend zu dem Feld angezeigt wird. Im zweiten wird eine, in diesem DCE eindeutige, "Variable" angegeben. Diese wird dazu verwendet, um im Template die Stelle anzugeben, an der die Eingaben des Feldes verwendet werden sollen.
Das Feld kann drei unterschiedliche Typen besitzen: Element, Reiter (Tab) oder Abschnitt (Sektion).
Element
Als Vorauswal hat ein Feld immer den Typ "Element". Ein Element ist eine bestimmte Form eines Eingabefelds im Backend. Mit Hilfe der "Konfiguration" wird das Aussehen des Eingabefelds bestimmt. Mit Hilfe von "Binde Feldwert an TCA-Spalte" ist es möglich die Eingaben aus der DCE-Instanz in der Datenbank direkt unter "tt_content" zu speichern. Dabei kann man ein schon bestehendes Feld überschreiben, oder sich direkt selbst eine neue eigene Spalte erzeugen lassen.
Tab
Ein "Tab" erzeugt bei der Dateneingabe im Backend einen neuen Reiter. Alle Elemente oder Sektionen, die hier unterhalb eines Tabs angeordnet sind werden im Backend auf diesem Tab dargestellt.
Wenn nur ein Tab vorhanden ist, oder sich keine Elemente auf einem Tab befinden, wird dieses im Backend nicht angezeigt.
Sektion
Eine "Sektion" besteht aus einer Gruppe von Eingabe-Elementen.
Diese kann im Backend vom Redakteur beliebig häufig verwendet werden und wir innerhalb einer einzigen DCE-Instanz gespeichert.
Tab DCE-Container
Mit Hilfe des DCE-Containers werden alle Instanzen dieses DCEs, die direkt nacheinander im Backend eingefügt werden, in einen Container gelegt.
In diesem Template kann ein Rahmen definiert werden, der um die Instanzen gelget wird. Wenn jedoch eine Instanz eines anderen DCEs eingefügt wird, so wird der Container geschlossen. Wird danach wieder eine Instanz des Container-DCEs eingefügt, so wird ein neuer Container eröffnet.
Das Limit gibt an, wie viele Objekte sich in einem Container befinden dürfen. Ein Limit von "0" bedeutet unendlich viele Objekte. Bei einem Limit von zum Beispiel "5" würde nach fünf Objekten der Container geschlossen und für das sechste Objekt ein neuer Container eröffnet. Außerdem lässt sich ein neuer Container eröffnen, indem bei der Eingabe eines neuen Objektes der Haken bei "Neuen DCE-Container bilden" gesetzt wird.
Tab Backend-Template
Das "Backend Template" beschreibt, wie gespeicherte Instanzen eines DCEs im Backend aussehen. Dazu ist initial der einfache Modus gewählt. Hier wird nur der Titel des DCEs und die eventuelle Containerfarbe angezeigt. Alle anderen Inhaltselemente können per Hand hinzugefügt werden.
Wird die einfache Ansicht deaktiviert, kann nun ein Fluid-Template für die Backend Ansicht definiert werden.
In der Sektion "header" wird festgelegt, wie der Name der Instanz lautet und in "bodytext" können alle anderen Inhaltselemente angegeben werden.
Tab Icon & Wizard
Auf diesem Tab kann das Icon ausgewählt werden, mit dem das DCE im Backend angezeigt werden soll.
Außerdem kann man hier auch bestimmen, ob das DCE überhaupt angezeigt werden soll, wenn man zum Beispiel verhindern will, das ein Element vom Redaktuer eingebunden werden kann.
Zusätzlich kann die Wizard Kategorie und diedortige Beschreibung bestimmt werden.
Tab Detailseite
Auf der Detailseite kann ein Fluid-Template angegeben werden, welches zunächst verborgen ist und mit Hilfe eines Buttons eingeblendet werden kann.
Tab Sonstiges
Auf dem Tab "Sonstiges" können die Caching Eigenschaften verändert werden.
Außerdem kann unter "Flexform Label" eingestellt werden, welcher Text über den eigenen Tabs oder Eingabefeldern angezeigt wird. Dieser ist standartmäßig "Inhalte".
Unter den nächsten beiden Punkten kann eingestellt werden, welche typischen tt_conent-Eigenschaften angezeigt werden sollen, wie zum Beispiel die Tabs "Zugriff" oder "Medien" und die Auswahlfelder "Sprache", "Sichtbar" und so weiter.
Konfiguration
Mit Hilfe der Konfiguration lässt sich bestimmen, wie ein Eingabe-Element im Backend aussehen soll. Es gibt eine Reihe von Standard-Vorgaben, die direkt aus dem Drop-Down Feld "Konfiguration" ausgewählt werden können. Diese können entweder so gelassen, oder noch angepasst werden.
Wir aus dem Feld der Konfiguration nichts ausgewält, so wird folgendes gezeigt:
- <config>
- <type>input</type>
- </config>
Diese Eingabe erzeugt ein einfaches leeres Eingabefeld, ohne jegliche Vorgaben.
TYPE: input
Simple input field
Die Standardkonfiguration lautet:
- <config>
- <type>input</type>
- <size>30</size>
- <eval>trim,required</eval>
- </config>
Damit ergibt sich ein einfaches Inputfeld, das im Backend ausgefüllt werden muss. Das"required" kann auch einfach entfernt werden, dann ist das Eingabefeld optional.
Wenn das "trim" durch ein "date" ersetzt wird, erhält man eine einfache Datumseingabe.
- <config>
- <type>input</type>
- <size>30</size>
- <eval>date</eval>
- </config>
Typolink
Die Standardkonfiguration lautet:
- <config>
- <type>input</type>
- <renderType>inputLink</renderType>
- <size>30</size>
- <eval>trim</eval>
- <softref>typolink,typolink_tag,images,url</softref>
- <fieldControl>
- <linkPopup>
- <options>
- <!--<blindLinkOptions>file,mail,page,spec,url</blindLinkOptions>-->
- <!--<blindLinkFields>class,params,target,title</blindLinkFields>-->
- </options>
- </linkPopup>
- </fieldControl>
- </config>
Damit wird ein Eingabefeld erzeugt, welches das Standard-Eingabefenster für Verlinkungen in Typo3 öffnet. Es werden die üblichen Eingabemöglichkeiten erzeugt.
Diese können jedoch beeinflusst werden, indem man zum Beispiel die Optionen "mail" oder "params" ausblendet.
- <options>
- <blindLinkOptions>mail,url</blindLinkOptions>
- <blindLinkFields>params</blindLinkFields>
- </options>
Die Option "Ordner" lässt sich auch aus dem Link Browser entfernen, indem man die <blindLinkOptions> um die Option "folder" erweitert.
Wenn unter <options> die Eigenschaft <allowedExtensions> ergänzt wird, kann bestimmt werden, welche Datei-Typen nur ausgewählt werden dürfen:
- <options>
- <allowedExtensions>pdf</allowedExtensions>
- </options>
TYPE: text
RTE
Die Standardkonfiguration lautet:
- <config>
- <type>text</type>
- <rows>5</rows>
- <cols>30</cols>
- <eval>trim,required</eval>
- <enableRichtext>1</enableRichtext>
- <richtextConfiguration>default</richtextConfiguration>
- </config>
Mit dieser Konfiguration wird ein CKEditor RTE aufgerufen mit der im Typo3 festgelegten Standardkonfiguration.
Hier können im Feld <richtextConfiguration> auch "minimal" und "full" eingetragen werden, um jeweils den minimalen bzw. vollständigen CKEditor zu erhalten. Auch, wenn eine eigene Konfiguration des CKEditors angelegt wurde, wird die entsprechende Variable hier eingetragen.
Simple textarea
Die Standardkonfiguration lautet:
- <config>
- <type>text</type>
- <rows>5</rows>
- <cols>30</cols>
- <eval>trim,required</eval>
- </config>
Diese Konfiguration erzeugt eine einfache Textbox.
TYPE: check
Simple checkbox
Die Standardkonfiguration lautet:
- <config>
- <type>check</type>
- <default>0</default>
- </config>
Setzt man <default> auf "1", wird die Checkbox beim Erstellen einer neuen Instanz direkt angehakt.
Wenn man die Konfiguration etwas erweitert, können auch mehrere verschiedene Checkboxen erzeugt werden.
- <config>
- <type>check</type>
- <items type="array">
- <numIndex index="0" type="array">
- <numIndex index="0">Label A</numIndex>
- <numIndex index="1">0</numIndex>
- </numIndex>
- <numIndex index="1" type="array">
- <numIndex index="0">Label B</numIndex>
- <numIndex index="1">1</numIndex>
- </numIndex>
- <numIndex index="2" type="array">
- <numIndex index="0">Label B</numIndex>
- <numIndex index="1">2</numIndex>
- </numIndex>
- </items>
- <minitems>0</minitems>
- <maxitems>3</maxitems>
- </config>
TYPE: select
Automatical list of items
Die Standardkonfiguration lautet:
- <config>
- <type>select</type>
- <!-- uncomment this, if you want to add an empty option before -->
- <!-- <items type="array">
- <numIndex index="0" type="array">
- <numIndex index="0"></numIndex>
- <numIndex index="1"></numIndex>
- </numIndex>
- </items> -->
- <foreign_table>pages</foreign_table>
- <size>1</size>
- <minitems>0</minitems>
- <maxitems>1</maxitems>
- </config>
Wenn man die Standard Konfiguration nicht verändert, wird eine Liste aller vorhandenen Seiten in der Reihenfolge ihrer Seiten-Ids gezeigt.
Das <foreign_table> zeigt an, aus welcher Datenbankspalte die Werte ausgelesen werden sollen. Hier können auch eigene Werte verwendet werden, wichtig ist nur, das es eine über $GLOBALS['TCA'] definierte Datenbankspalte gibt.
Mit Hilfe von <foreign_table_where> kann die Reihenfolge der Seiten geändert werden. Zum Beispiel nach dem Alphabet:
- <foreign_table_where>ORDER BY pages.title</foreign_table_where>
Außerdem kann auch die Auswahl der Seiten begrenzt werden, zum Beispiel auf die Unterseiten einer bestimmte, oder der aktuellen Seite:
- <foreign_table_where>AND pages.pid = ###CURRENT_PID### ORDER BY pages.title</foreign_table_where>
Es gibt auch die Möglichkeit nur auf Elemente des tt_content zuzugreifen, und dabei nur die zu wählen, die auf der selben Seite, oder einer Unterseite dieser Seite, sind und ein bestimmtes Datenbankfeld ausgefüllt haben:
- <foreign_table>tt_content</foreign_table>
- <foreign_table_where>AND tt_content.pid = ###CURRENT_PID### AND dceid != ''</foreign_table_where>
Oder für Kategorien:
- <foreign_table_where>AND sys_category.sys_language_uid IN (0,-1) ORDER BY sys_category.title ASC</foreign_table_where>
Die Ansicht der Auswahlliste kann auch verändert werden. Mit Hilfe von:
- <renderType>selectMultipleSideBySide</renderType>
- <size>10</size>
Eine weitere Möglichkeit ist die Checkbox-Ansicht:
- <renderType>selectCheckBox</renderType>
Mit Hilfe von <multiple> kann eine Mehrfach-Auswahl zugelassen werden:
- <multiple>1</multiple>
Mit Hilfe von <enableMultiSelectFilterTextfield> kann eine Suche angezeigt werden:
- <enableMultiSelectFilterTextfield>1</enableMultiSelectFilterTextfield>
Eine weitere Möglichkeit ist die Checkbox-Ansicht:
- <renderType>selectCheckBox</renderType>
Außerdem gibt es noch eine Baumansicht:
- <config>
- <type>select</type>
- <renderType>selectTree</renderType>
- <foreign_table>pages</foreign_table>
- <treeConfig>
- <parentField>pid</parentField>
- <appearance>
- <expandAll>1</expandAll>
- <showHeader>1</showHeader>
- </appearance>
- </treeConfig>
- <maxitems>5</maxitems>
- <size>20</size>
- </config>
Diese lässt sich mit:
- <rootUid>5</rootUid>
direkt unter <parentField> auf die ID einer Unterseite beschränken.
Manual list of items
Die Standardkonfiguration lautet:
- <config>
- <type>select</type>
- <items type="array">
- <numIndex index="0" type="array">
- <numIndex index="0">Label A</numIndex>
- <numIndex index="1">0</numIndex>
- </numIndex>
- <numIndex index="1" type="array">
- <numIndex index="0">Label B</numIndex>
- <numIndex index="1">1</numIndex>
- </numIndex>
- </items>
- <size>1</size>
- <minitems>1</minitems>
- <maxitems>1</maxitems>
- </config>
- <!-- <onChange>reload</onChange> -->
Die Auswahl lässt sich mit Symbolen versehen:
- <numIndex index="0" type="array">
- <numIndex index="0">Layout 1</numIndex>
- <numIndex index="1">0</numIndex>
- <numIndex index="2">EXT:eigene_extension/layout1.png</numIndex>
- </numIndex>
Und auch mit einer Symbolliste unter dem Drop-Down:
- <showIconTable>1</showIconTable>
Wenn man
- <renderType>selectCheckBox</renderType>
verwendet, dann kann auch noch eine Beschreibung (description) hinzufügen mit Hilfe von:
- <numIndex index="0" type="array">
- <numIndex index="0">Layout 1</numIndex>
- <numIndex index="1">0</numIndex>
- <numIndex index="2">EXT:eigene_extension/layout1.png</numIndex>
- <numIndex index="3">Beschreibung</numIndex>
- </numIndex>
TYPE: group
File Upload
Die Standardkonfiguration lautet:
- <config>
- <type>group</type>
- <internal_type>file</internal_type>
- <allowed>jpg,jpeg,png,gif</allowed>
- <size>1</size>
- <minitems>0</minitems>
- <maxitems>1</maxitems>
- <uploadfolder>uploads/pics</uploadfolder>
- <show_thumbs>1</show_thumbs>
- </config>
Über den Button "Ordner" können Bilder aus dem fileadmin eingebunden werden und über "Datei auswählen" vom PC direkt.
Dadurch wird die im Backend ausgewählte Datei zu dem Ordner "uploads/pics" hinzugefügt. Jede erneute Auswahl des Bildes fügt das Bild wieder zu diesem Ordner hinzu und versieht es hinten mit einer fortlaufenden Nummer. Dadurch ist die Verwaltung der Bilder relativ schwer und sie lassen sich nicht so einfach ersetzen, da das Bild an jeder Stelle von Hand ausgetauscht werden muss. Man kann den Ordner natürlich ändern, aber auch entfernen. Dazu löscht man die gesamte Zeile <uploadfolder>. Dann wird keine neue Datei erzeugt, sondern direkt die Datei aus dem Backend verwendet. Es wird jedoch keine Verknüpfung auf die Datei gelegt. Das bedeutet, sie kann ohne Fehlermeldung über das Backend gelöscht werden und kann dann im Frontend nicht mehr angezeigt werden.
Link Pages and get pages as associative array
Die Standardkonfiguration lautet:
- <config>
- <type>group</type>
- <internal_type>db</internal_type>
- <allowed>pages</allowed>
- <size>5</size>
- <minitems>0</minitems>
- <maxitems>999</maxitems>
- <show_thumbs>1</show_thumbs>
- <!-- This enables the access on properties/attributes of given table/object
- example: {field.yourvariable.title} -->
- <dce_load_schema>1</dce_load_schema>
- <!-- If enabled, will automatically translate pages or records if translation exists. -->
- <dce_enable_autotranslation>1</dce_enable_autotranslation>
- </config>
Mit Hilfe von "Link Pages and get pages as associative array" kann eine Reihe von internen Seiten ausgewählt werden, zu denen verlinkt werden kann.
Link internal page with suggest wizard
Die Standardkonfiguration lautet:
- <config>
- <type>group</type>
- <internal_type>db</internal_type>
- <allowed>pages</allowed>
- <size>2</size>
- <minitems>0</minitems>
- <maxitems>1</maxitems>
- <show_thumbs>1</show_thumbs>
- <wizards>
- <_PADDING>1</_PADDING>
- <_VERTICAL>1</_VERTICAL>
- <suggest>
- <type>suggest</type>
- <default>
- <searchWholePhrase>1</searchWholePhrase>
- </default>
- </suggest>
- </wizards>
- </config>
Mit Hilfe von "Link internal page with suggest wizard" kann eine interne Seite ausgewählt werden, zu der verlinkt wird.
Nest DCE content elements
Die Standardkonfiguration lautet:
- <config>
- <type>group</type>
- <internal_type>db</internal_type>
- <allowed>tt_content</allowed>
- <size>5</size>
- <minitems>0</minitems>
- <maxitems>999</maxitems>
- <show_thumbs>1</show_thumbs>
- <dce_load_schema>1</dce_load_schema>
- </config>
Mit Hilfe von "Nest DCE content elements" können andere tt-content Elemente mit Hilfe eines Wizards ausgewählt werden.
TYPE:miscellaneous
Color Picker
Die Standard Konfiguration lautet:
- <config>
- <type>input</type>
- <size>10</size>
- <eval>trim</eval>
- <wizards>
- <_PADDING>2</_PADDING>
- <link>
- <type>colorbox</type>
- <title>Color Picker</title>
- <module>
- <name>wizard_colorpicker</name>
- <urlParameters>
- <mode>wizard</mode>
- </urlParameters>
- </module>
- <icon>link_popup.gif</icon>
- <script>browse_links.php?mode=wizard</script>
- <JSopenParams>height=500,width=500,status=0,menubar=0,scrollbars=1</JSopenParams>
- <!--
- Color can be picked from image if provided:
- <exampleImg>EXT:introduction/Initialisation/Files/images/theme/IntroductionPackage.png</exampleImg>
- -->
- </link>
- </wizards>
- </config>
Mit "Color Picker" lässt sich ein Eingabefeld erzeugen, in das mit Hilfe eines Wizards eine Farbe eingetragen werden kann.
Die "Display Conditions" lassen sich zu jedem Elemententyp hinzufügen. Sie sorgen dafür, dass ein Element bei der Backendeingabe nur unter bestimmten Bedingungen angezeigt wird.
Die "Display Conditions" lassen sich auf viele verschiedene Arten verwenden. Mit der direkt vorgegebenen Standard-Version kann überprüft werden, ob ein bestimmtes Feld einen bestimmten Wert hat:
- <displayCond>FIELD:settings.relatedField:=:1</displayCond>
Dabei wird auf demselben Tab also demselben "Sheet" überprüft, ob das Feld mit der Variablen "relatedField" auch dem Wert "1" entspricht. Stimmt dies, so wird das Feld eingeblendet.
Es kann aber auch eine Oder-Abfrage
- <displayCond>
- <OR>
- <numIndex index="0">FIELD:settings.detailauswahl:=:1</numIndex>
- <numIndex index="1">FIELD:settings.detailauswahl:=:2</numIndex>
- </OR>
- </displayCond>
und eine Und-Abfrage gestellt werden:
- <displayCond>
- <AND>
- <numIndex index="0">FIELD:settings.detailauswahl:=:1</numIndex>
- <numIndex index="1">FIELD:settings.bildauswahl:=:2</numIndex>
- </AND>
- </displayCond>
Die Display Conditions können aber nicht nur innerhalb eines Tabs, sondern auch Tab übergreifend (Sheet übergreifend), innerhalb einer Sektion und sogar Sektion und Tab übergeifend verwendet werden. Und durch einen Trick kann man sogar ganze Tabs, bzw Sheets ausblenden, wenn sie nicht benötigt werden.
Mit Hilfe von
- <displayCond>FIELD:sheet.layouttab.settings.layout:=:1</displayCond>
wird auf dem Tab (sheet) mit der Variablen "layouttab" das Feld mit der Variablen "layout" überprüft. Dieser Code funktioniert auch aus einer Sektion heraus. Das heißt, man kann auf einem anderen Tab bestimmen, welche Elemente in der Sektion angezeigt werden.
Soll innerhalb einer Sektion ein Wert abgefragt werden, so wird
- <displayCond>FIELD:layout:=:1</displayCond>
dazu verwendet.
Will man einen ganzen Tab erst bei Auswahl einer bestimmten Option zeigen, so kann die <displayCond> ganz einfach bei jedem der Felder auf dem ensprechenden Tab eingefügt werden. So wird ein leerer Tab erzeugt. Leere Tabs werden jedoch im Backend nicht gezeigt. Das heißt der Tab erscheint erst, wenn die Option gewählt wurde.
TYPE:FAL
Mit Hilfe der "File Abstraction Layer" kann eine beliebige Datei aus dem fileadmin ausgewählt und eingebunden werden. Dabei wird zwischen zwei Typen unterschieden, einmal das normale FAL und dann das FAL für die Sectionen.
File Abstraction Layer (recommended)
Die Standard Konfiguration lautet:
- <config>
- <type>inline</type>
- <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>{$variable}</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>gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg</elementBrowserAllowed>
- </appearance>
- </config>
- </foreign_selector_fieldTcaOverride>
- <foreign_types type="array">
- <numIndex index="2">
- <showitem>--palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,--palette--;;filePalette</showitem>
- </numIndex>
- </foreign_types>
- <minitems>0</minitems>
- <maxitems>99</maxitems>
- <appearance>
- <useSortable>1</useSortable>
- <headerThumbnail>
- <field>uid_local</field>
- <width>45c</width>
- <height>45</height>
- </headerThumbnail>
- <showPossibleLocalizationRecords>0</showPossibleLocalizationRecords>
- <showRemovedLocalizationRecords>0</showRemovedLocalizationRecords>
- <showSynchronizationLink>0</showSynchronizationLink>
- <useSortable>1</useSortable>
- <enabledControls>
- <info>1</info>
- <new>0</new>
- <dragdrop>0</dragdrop>
- <sort>1</sort>
- <hide>1</hide>
- <delete>1</delete>
- <localize>1</localize>
- </enabledControls>
- <createNewRelationLinkTitle>LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference</createNewRelationLinkTitle>
- </appearance>
- <behaviour>
- <localizationMode>select</localizationMode>
- <localizeChildrenAtParentLocalization>1</localizeChildrenAtParentLocalization>
- </behaviour>
- <dce_load_schema>1</dce_load_schema>
- <dce_get_fal_objects>1</dce_get_fal_objects>
- </config>
Mit "File Abstraction Layer (recommended)" lässt sich eine Datei im Fileadmin auswählen und einbinden.
File Abstraction Layer (recommended)
Die Standard Konfiguration lautet:
- <config>
- <type>inline</type>
- <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>{$variable}</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>gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg</elementBrowserAllowed>
- </appearance>
- </config>
- </foreign_selector_fieldTcaOverride>
- <foreign_types type="array">
- <numIndex index="2">
- <showitem>--palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,--palette--;;filePalette</showitem>
- </numIndex>
- </foreign_types>
- <minitems>0</minitems>
- <maxitems>99</maxitems>
- <appearance>
- <useSortable>1</useSortable>
- <headerThumbnail>
- <field>uid_local</field>
- <width>45c</width>
- <height>45</height>
- </headerThumbnail>
- <showPossibleLocalizationRecords>0</showPossibleLocalizationRecords>
- <showRemovedLocalizationRecords>0</showRemovedLocalizationRecords>
- <showSynchronizationLink>0</showSynchronizationLink>
- <useSortable>1</useSortable>
- <enabledControls>
- <info>1</info>
- <new>0</new>
- <dragdrop>0</dragdrop>
- <sort>1</sort>
- <hide>1</hide>
- <delete>1</delete>
- <localize>1</localize>
- </enabledControls>
- <createNewRelationLinkTitle>LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference</createNewRelationLinkTitle>
- </appearance>
- <behaviour>
- <localizationMode>select</localizationMode>
- <localizeChildrenAtParentLocalization>1</localizeChildrenAtParentLocalization>
- </behaviour>
- <dce_load_schema>1</dce_load_schema>
- <dce_get_fal_objects>1</dce_get_fal_objects>
- </config>
Mit "File Abstraction Layer (recommended)" lässt sich eine Datei im Fileadmin auswählen und einbinden.
(copy 1)
File Abstraction Layer (section use only)
Die Standard Konfiguration lautet:
- <config>
- <type>group</type>
- <internal_type>db</internal_type>
- <appearance>
- <elementBrowserType>file</elementBrowserType>
- <elementBrowserAllowed>gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg</elementBrowserAllowed>
- </appearance>
- <allowed>sys_file</allowed>
- <size>5</size>
- <minitems>0</minitems>
- <maxitems>5</maxitems>
- <show_thumbs>1</show_thumbs>
- <dce_load_schema>1</dce_load_schema>
- <dce_get_fal_objects>1</dce_get_fal_objects>
- </config>
Mit "File Abstraction Layer (section use only)" lässt sich innerhalb einer Sektion eine Datei im Fileadmin auswählen und einbinden.
Fluid-Programmierung
Die Templates der DCEs werden mit Fluid-Programmierung festgelegt. Das bedeutet, sie alleine bestimmen, wie die Backend-Eingaben im Frontend ausgegeben werden.
Fluid ist eine "Template engine". Sie ist einfach zu verwenden und zu erweitern. Diese Art der Programmierung wird seit einiger Zeit in Typo3 selbst und auch in den neueren Extensionen verwendet. Daher kommt sie auch in der Extension DCE zum Einsatz.
Ein großer Vorteil von Fluid ist es, dass sich bequem Abfragen, Schleifen und Bedingungen mit HTML und CSS verbinden lassen. Das Template kann entweder als Datei oder Inline definiert werden.
Als Datei lassen sich Templates schnell in verschiedenen Typo3 Systemen verwenden und einfacher in verschiedene Unter-Templates aufteilen. Das Template direkt "Inline" auf diesem Reiter zu definieren, ist jedoch sinnvoller, wenn ein einfaches Template verwendet wird, welches sich nicht in einem anderen DCE wiederholt.
Über Die Schaltfläche "Template-Inhalt" lassen sich Variablen und einige "ViewHelper" direkt auswählen.
Verfügbare Variablen
Die verfügbaren Variablen sind diejenigen, die vorher mit Hilfe der Konfigurationen festgelegt wurden.
Verfügbare Basis-Variablen
Die Basis Variablen sind System eigene Variablen, die bestimmte systemweite Werte enthalten, beispielsweise die ausgewählte Sprache.
- {dce} – Informationen über das DCE
- {dce.uid} – gibt die ID des DCE zurück
- {dce.title} – gibt den Titel des DCEs zurück
- {contentObject} – Informationen über die Instanz
- {contentObject.uid} – gibt die ID der DCE-Instanz zurück
- {contentObject.pid} – gibt die Seiten-ID zurück, auf der sich die DCE-Instanz befindet
- {TSFE} – TSFE-Objekt (tslib_fe)
- {TSFE.id} – gibt die Seiten-ID zurück
- {TSFE.lang} – gibt die aktuelle Sprache zurück
- {page} – Informationen über die Seite
- {page.uid} – gibt die Seiten-ID zurück
- {page.pid} – gibt die DCE-ID zurück
- {page.title} – gibt den Seitentitel zurück
- {tsSetup} – ermöglicht Zugriff auf das Seiten TS
Meist verwendete ViewHelper
f:count - Zählt die Anzahl der Elemente inerhalb eines Arrays
- <f:if condition="{field.items -> f:count()} > 1">
f:debug - Gibt alle Eigenschaften des Objekts als Debug aus
- <f:debug>{field.item}</f:debug>
f:for - Lässt eine FOR-Schleife über ein Array laufen
- <f:for each="{items}" as="item" iteration="iterator">
- </f:for>
f:format.crop - Verkürzt einen Text auf maximal 30 Buchstaben.
- {text -> f:format.crop(maxCharacters="30")}
f:format.html - Verwendete HTML-Tags werden auch als solche umgesetzt
- {text -> f:format.html()}
f:format.nl2br - Rahmen für PHPs nl2br Funktionen
- {text -> f:format.nl2br()}
f:if - IF-Abfrage zur Überprüfung von Eigenschaften
- <f:if condition="">
- <f:then>
- </f:then>
- <f:else>
- </f:else>
- </f:if>
- <div class="{f:if(condition:'{field.cc}',then:'color',else:'nocolor')}"></div>
f:image - Bindet ein Bild ein
- <f:image image="{field.image}" />
f:link.email - E-Mail-Verlinkung
- <f:link.email email="your@mailaddress.tld">Content</f:link.email>
f:link.external - Verlinkt auf eine externe Website
- <f:link.external uri="www.typo3.org" target="_blank">Website</f:link.external>
f:link.page - Verlinkt per Seiten-ID auf eine interne Seite
- <f:link.page pageUid="1">Page</f:link.page>
f:link.typolink- Verlinkt auf interne oder externe Seite, für Bild Meta-Verlinkungen geeignet
- <f:link.typolink parameter="{field.link}" target="_blank" class="ico-class" title="some title" useCacheHash="true">
- Linktext
- </f:link.typolink>
f:render - Rendert eine externe Partial-Datei
- <f:render partial="NameOf/Partial" arguments="{fields:fields}" />
f:uri.typolink - Verlinkt auf eine interne Seite
- {f:uri.typolink(parameter:'{field.link}')}
DCE Viewhelper
dce:GP - Gibt php Variablen zurück
- <!-- Gets get or post variables. Never use this viewhelper for direct output!! This would provoke XSS (Cross site scripting). -->
- {dce:GP(subject:'myCoolGetParameter')}
dce:arrayGetIndex - liefert den Wert eines Indexes aus einem nicht-numerischen Array
- <!-- normally you can access array values with: {array.0}, {array.1}, etc. if they have numeric keys. This viewhelper
- converts named keys to numeric ones. Futhermore if you are able to set the index dynamically (codemirrorCycle.e. from variable).-->
- {array -> dce:arrayGetIndex(index:'{iteration.index}')}
dce:explode - wandelt einen String in ein Array um und trennt die Werte anhand des gegebenen Delimeters
- {string -> dce:explode(delimiter:'\n')}
dce:fileInfo - gibt den entsprechenden Wert einer Datei wieder
- <dce:fileInfo fileUid="{fileUid}" attribute="width" />
dce:format.addcslashes - fügt Slashes an eine gegebene Variable
- <dce:format.addcslashes>{field.myVariable}</dce:format.addcslashes>
dce:format.raw - stellt Text nach dem raw-Format da
- <!-- use f:format.raw on TYPO3 4.6 or higher -->
- <dce:format.raw>{code}</dce:format.raw>
dce:format.tiny - entfernt Zeilenumbrüche
- <dce:format.tiny>
- Removes tabs and
- linebreaks.
- </dce:format.tiny>
dce:format.ucfirst - konvertiert den ersten Buchstaben eines strings zu einem Großbuchstaben
- {variable -> dce:format.ucfirst()}
dce:format.wrapWithCurlyBraces - umrahmt den Text mit schweiften Klammern
- <!-- Use this viewhelper if you want to wrap something with curly braces {} -->
- <dce:format.wrapWithCurlyBraces prepend="" append="">{field.myVariable}</dce:format.wrapWithCurlyBraces>
dce:isArray - testet, ob eine Variable ein Array ist
- <!-- Returns TRUE or FALSE, should be used in if conditions -->
- {variable -> dce:isArray()}
dce:thisUrl - gibt die aktuelle URL zurück
- {dce:thisUrl(showHost:1, showRequestedUri:1, urlencode:0)}
Eingabefelder
Unter "Felder" lässt sich festlegen, welche Eingabefelder dem Redakteur im Backend angezeigt werden und wie diese aussehen sollen. Wird ein neues Feld erzeugt, so müssen zunächst zwei Felder ausgefüllt werden.
Das erste bestimmt den "Titel dieses Feldes", der dem Redakteur im Backend zu dem Feld angezeigt wird. Im zweiten wird eine, in diesem DCE eindeutige, "Variable" angegeben. Diese wird dazu verwendet, um im Template die Stelle anzugeben, an der die Eingaben des Feldes verwendet werden sollen.
Das Feld kann drei unterschiedliche Typen besitzen: Element, Reiter (Tab) oder Abschnitt (Sektion).
Datumskonfiguration
Wenn in der Konfiguration ein Datumsfels definiert wurde, so kann das Datum mit folgedem Code ausgegeben werden:
- <f:format.date format="Y-m-d">{field.datumposted}</f:format.date>
Mit format="Y-m-d" kann bestimmt werden, in welcher Reihenfolge und mit welchen Trennzeichen die Zahlen gezeigt werden,
If-Abfragen
Eine IF-Abfrage besteht aus einer "condition", der Bedingung, einem "then"-Teil und einem "else"-Teil. Zunächst wird abgefragt, welche Bedingung erfüllt sein muss, um entweder bei Erfüllung den "then"-Teil, oder bei nicht Erfüllung den "else"-Teil auszuführen. Wobei der "else"-Teil auch weggelassen werden kann. IF-Abfragen können beliebig oft verschachtelt werden.
- <f:if condition="">
- <f:then>
- </f:then>
- <f:else>
- </f:else>
- </f:if>
Mit einer IF-Abfrage kann gesteuert werden, welcher HTML-Code im Frontend ausgegeben wird. Zunächst kann überprüft werden, ob ein Inputfeld generell ausgefüllt worden ist. Und dann gibt es zwei Möglichkeiten, wie die Eingaben für IF-Abfragen aussehen können. Mit einer Checkbox kann zum Beispiel "entweder - oder" abgefragt werden und mit einer manuellen Liste lassen sich die eingegebenen "conditions" abfragen.
Es kann abgefragt werden, ob das Feld "Text" ausgefüllt wurde:
- <f:if condition="{field.text}">
Das Gegenteil, wenn ein Feld nicht ausgefüllt wurde, wäre dann:
- <f:if condition="!{field.text}">
Es kann eine "OR" (||) und eine "AND" (&&) Abfrage gestellt werden:
- <f:if condition="{field.header} || {field.text}">
Es kann ein konkreter Wert überprüft werden (auch <, <=, >, <= und !=):
- <f:if condition="{field.text} == 1">
Die if-Abfrage kann auch mit einer verkürzten Schreibweise durchgeführt werden:
- <f:if condition="{test}==0">
- <f:then>Option A</f:then>
- <f:else if="{test}==1">Option B</f:else>
- <f:else>Option C</f:else>
- </f:if>
FOR-Schleifen
Wenn eine Sektion verwendet wird, dann müssen die Eingaben aus dieser mit einer FOR-Schleife ausgegeben werden:
- <f:for each="{field.testsektion}" as="test">
- <h1>{test.header}</h1>
- </f:for>
Sollen nicht alle Elemente aus seiner Sektion verwendet werden, so lässt sich das zum Beispiel über einen Iterator steuern:
- <f:for each="{field.testsektion}" as="test" iteration="iterator">
- <f:if condition="{iterator.index} <= 5">
- <f:then>
- <h1>{test.header}</h1>
- </f:then>
- </f:if>
- </f:for>
Das bedeutet, dass nur die ersten fünf Iterationen der Sektion ausgegeben werden. Achtung, der Iterator beginnt bei 0 zu zählen! Mit folgendem Code lässt sich nur die erste Iteration ausgeben:
- <f:for each="{field.testsektion}" as="test" iteration="iterator">
- <f:if condition="{iterator.isFirst}">
- </f:then>
- <h1>{test.header}</h1>
- </f:then>
- </f:if>
- </f:for>
Analaog kann mit {iterator.isLast} das letzte Element gewählt werden, {iterator.isEven} und {iterator.isOdd} geben die entsprechenden geraden und ungeraden Durchläufe aus.
Wenn mit "Link Pages and get pages as associative array" eine Dateisammlung eingefügt werden soll, wird auch dafür eine FOR-Schleife verwendet:
- <f:for each="{field.testgroup}" as="collection">
- <f:for each="{collection.items}" as="item">
- <f:image src="{item.uid}" treatIdAsReference="{f:if(condition:'{item.originalFile}',then: '1', else: '0')}" />
- </f:for>
- </f:for>
Mit Hilfe von FOR-Schleifen ist es auch möglich einer Reihe von <div>-Elementen eine fortlaufende ID zuzuweisen:
- <f:for each="{field.items}" as="item" iteration="iterator">
- <div id="unique-name-{iterator.index}"></div>
- </f:for>
Soll die ID nicht nur auf dieser Seite, sondern allgemein einzigartig sein, so ist dies über die UID der Seite möglich. Diese wird mit {contentObject.pid} ausgelesen:
- <f:for each="{field.items}" as="item" iteration="iterator">
- <div id="unique-name-{contentObject.pid}-{iterator.index}"></div>
- </f:for>
Variablen
Mit Hilfe von
- <f:variable name="myvar" value="{field.anzahl}" />
lässt sich eine Variable namens {myvar} erzeugen. Diese kann zum Beispiel so verwendet werden:
- <f:if condition="{myvar} > 8">
Wenn eine "Manuel List" erzeugt worden ist und man aus dieser eine Reihe von abfragbaren Variablen erzeugen will, geht dies zum Beispiel so:
- <f:if condition="{field.einstellungen}">
- <f:then>
- <f:for each="{field.einstellungen -> dce:explode(delimiter:',')}" as="item" iteration="iterator">
- <f:variable name="{item}" value="1" />
- </f:for>
- </f:then>
- </f:if>
Abfragbar wäre das dann mit:
- <f:if condition="{item}">
Bilder einbauen
Wenn ein Bild als "File Abstraction Layer"-Element hinzugefügt wird, muss zusätzlich eine FOR-Schleife verwendet werden, da das FAL ein Array zurückgibt.
- <f:for each="{field.image}" as="item" iteration="iterator">
- <f:image image="{item}" />
- </f:for>
Mit Hilfe der Angabe "width" und "cropVariant" kann das Bild verkleinert und zugeschnitten werden:
- <f:for each="{field.image}" as="item" iteration="iterator">
- <f:image image="{item}" width="200" cropVariant="header" />
- </f:for>
Wenn das Bild als Hintergrundbild verwendet werden soll, muss dazu der <f:uri.image>-Viewhelper verwendet werden:
- <f:for each="{field.image}" as="item" iteration="iterator">
- <div style="background-image:url({f:uri.image(src:'{item.uid}', treatIdAsReference:'1')})"></div>
- </f:for>
Auf die Eigenschaften des Bildes kann mit
- {item.title},
- {item.alternative},
- {item.description} und
- {item.link}
zugegriffen werden.
Da der Link aber nicht die Seiten Id, sondern den direkten Typo-Linkt zurück gibt, nämlich "t3://page?uid=2", muss man den <f:link.typolink>-Viewhelper verwenden.
- <f:link.typolink parameter="{item.link}" target="_blank" class="ico-class" title="some title" useCacheHash="true">
- Linktext
- </f:link.typolink>
Responsive Bilder
Responsive Bilder können wieder mit Hilfe des <f:uri.image>-Viewhelpers eingebaut werden:
- <f:for each="{field.image}" as="item" iteration="iterator">
- <picture>
- <source srcset="<f:uri.image src='{item.uid}' treatIdAsReference='1' width='700' cropVariant='header' />" media="(max-width: 768px)">
- <source srcset="<f:uri.image src='{item.uid}' treatIdAsReference='1' width='1000' cropVariant='header' />" media="(max-width: 1024px)">
- <source srcset="<f:uri.image src='{item.uid}' treatIdAsReference='1' width='1500' cropVariant='header' />">
- <f:image image="{item}" width="200" cropVariant="header"/>
- </picture>
- </f:for>
Bild-Auswahl nach Name oder Dateiendung
Mit Hilfe von "{item.name}" kann auf den Dateinamen eines Bildes zurückgegriffen werden. Dieser kann dann direkt geprüft werden, oder mit Hilfe des <v:condition.string.contains>-Viewhelpers auf einen bestimmten Substring geprüft werden.
In "{item.extension}" findet sich die Dateiendung eines Bildes, so kann zum Beispiel für svg-Dateien eine Ausnahme hinzugefügt werden.
Mehrsprachigkeit
Mit einem ganz einfachen Trick kann man schnell an einer Stelle einen verschiedensprachigen Button einbauen. Die Variable {page.sys_language_uid} gibt die aktuelle Sprache der Seite zurück:
- <f:if condition="{page.sys_language_uid}==0">
- <f:then>mehr</f:then>
- <f:else if="{page.sys_language_uid}==1">more</f:else>
- <f:else>plus</f:else>
- </f:if>
Wenn man zum Beispiel einen Button einbauen möchte, der immer den gleichen Text enthalten soll, aber an vielen verschiendenen Stellen eingesetzt wird, so ist es leichter, ihn an einer zentralen Stelle zu definieren. Dies ist auch praktischer, wenn das, was übersetzt werden muss, später an einen Übersetzer gegeben wird. Dann muss nicht viel im Code geändert werden, sondern nur die eine Datei.
Das geht mit Hilfe einer XML Datei und einem Verweis auf diese. Man erstellt also eine lang.xml mit folgendem Inhalt:
- <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
- <T3locallang>
- <meta type="array">
- <typ>module</type>
- <description>Language labels for the DCEs in backend</description>
- </meta>
- <data type="array">
- <languageKey index="de" type="array">
- <label index="buttontext">Weiter</label>
- </languageKey>
- <languageKey index="default" type="array">
- <label index="buttontext">Next</label>
- </languageKey>
- </data>
- </T3locallang>
Und schreibt dann ins FLUID-Template:
- <a href="#">
- <f:translate key="LLL:fileadmin/lang/dce.xml:buttontext" />
- </a>
Auf diese Weise können mehrere Sprachen definiert werden. Wichtig ist nur zu wissen, das Englisch, also "en" immer "default" ist. Auch wenn die eigentliche Default-Sprache Deutsch ist.
PDF einbinden
Ein PDF kann mit Hilfe von FAL-Objekten genauso wie ein Bild oder Video eingefügt werden. Wenn man aber hier den selben Code wie bei einem Bild verwendet, wird lediglich ein Bild der PDF angezeigt.
Will man einen Button "Download" erzeugen, bei dem sich die PDF-Datei öffnet, so muss dies mit "publicUrl" umgesetzt werden:
- <f:for each="{field.pdf}" as="pdf">
- <a href="{pdf.publicUrl}" target="_blank">Download</a>
- </f:for>
Gleichzeitig kann man auch ein Bild der PDF anzeigen, bei dem sich dann auch der Download auf Klick öffnet:
- <f:for each="{field.pdf}" as="pdf">
- <a href="{pdf.publicUrl}" target="_blank">
- <f:image image="{pdf}"/>
- </a>
- </f:for>
Andere DCEs oder tt-content-Elemente einbinden und anzeigen
Wenn in einem "Nest DCE content element" oder eine "automatical list" ein oder mehrere Elemente ausgewählt wurden, kann mit Hilfe folgender Konfiguration auf alle Variablen des anderen DCEs zugegriffen werden:
- <f:for each="{field.image}" as="item" iteration="iterator">
- {item.text}
- </f:for>
In einigen DCE-Versionen muss "{item.get.text}" verwendet werden, aber dieses Problem wurde in den neueren DCE-Versionen behoben.
DCEs exportieren
Mit Hilfe der Standard Export-Funktion von Typo können auch DCEs ganz leicht aus einem bestehenden System in ein neues exportiert werden. Dazu geht man direkt aus der DCE Ansicht über den Button "Die Listenansicht aufrufen". Dort dann den Export auswählen und, ganz wichtig, unter "Tabellen einschließen" muss überall "tx_dce_domain_model_dce" und "tx_dce_domain_model_dcefield" ausgewählt werden, damit nicht nur die Templates, sondern auch die Eingabefelder exportiert werden. Es können auch nur einzelne DCEs ausgewählt werden, in dem man alle ausschließt, die nicht benötigt werden. Dann kann man den Export als .t3d Datei herunterladen.
Importieren kann man das Ganze, in dem man auf der Root-Ebene auf das Typo3 Zeichen klickt und dann "Importieren aus .t3d" auswählt. Dann werden alle gespeicherten DCEs diesem System hinzugefügt und können sofort verwendet werden.
DCE-Container sortieren
DCE-Container Elemente alphabetisch sortieren
Dazu wird das Template ganz normal für jedes Element definiert und der DCE-Container folgendermaßen geändert:
- <f:section name="main">
- <div class="team">
- <f:for each="{dces->v:iterator.sort(order: 'ASC', sortBy: 'item.value')}" as="dce">
- {dce.render -> f:format.raw()}
- </f:for>
- </div>
- </f:section>
Es wird zusätzlich die Extension VHS installiert und oben in das Template geschrieben:
- {namespace v=FluidTYPO3\Vhs\ViewHelpers}
DCE-Container Elemente nach bestimmten Werten sortieren.
Dazu wird zuerst mit <f:alias> das Array angelegt, in dem sich die Werte befinden. Danach kann eine for-Schleife über das Array laufen, für jede DCE-Instanz des Containers wird überprüft, ob diese Instanz zu dem entsprechenden Wert passt, dann wird diese entweder ausgegeben oder im nächsten Array Durchlauf wieder überprüft.
- <f:section name="main">
- <f:alias map="{alpha: {obst: 'Obst', gemuese: 'Gemüse'}}">
- <f:for each="{alpha}" as="wert">
- <h2>{wert}</h2>
- <f:for each="{dces}" as="dce" iteration="iterator">
- <f:if condition="{dce.sorte}=={wert}">
- <f:then>
- {dce.name}
- </f:then>
- </f:if>
- </f:for>
- </f:for>
- </f:alias>
- </f:section>
Wäre die Eingabe in den Instanzen nun {dce.name} -> {dce.sorte}:
- Bohnen -> Gemüse
- Erdbeeren -> Obst
- Brokkoli -> Gemüse
- Äpfel -> Obst
Dann ergibt sich die Ausgabe:
- Obst
- Erdbeeren
- Äpfel
- Gemüse
- Bohnen
- Brokkoli
Substring auslesen
Wenn aus einer Reihe von Bildern, die in einem FAL-Element eingebunden wurden, anhend des Dateinamens ein bestimmtes Bild ausgewählt werden soll, so kann man dafür denVHS ViewHelper <v:condition.string.contains> verwenden:
- <f:for each="{field.image}" as="image" iteration="iterator">
- <v:condition.string.contains haystack="{image.name}" needle="icons">
- <f:then></f:then>
- <f:else></f:else>
- </v:condition.string.contains>
- </f:for>
Der ViewHelper untersucht den gegebenen String nach dem angegebenen Sub-String. Danach wird dann entweder der "then" oder der "else" Teil ausgeführt.
Es wird zusätzlich die Extension VHS installiert und oben in das Template geschrieben:
- {namespace v=FluidTYPO3\Vhs\ViewHelpers}
Konfiguration Backend Template
Alle Eingabe-Felder, außer FAL Elemente, können im Backend-Template genauso ausgegeben werden, wie im normalen Template für das Frontend. Die FAL Elemente geben allerdings einen Fehler zurück, wenn kein Element vorhanden ist. Es muss dafür eine Array-Prüfung eingebaut werden, damit der Code nicht ausgeführt wird, wenn das Feld leer ist:
- <f:section name="bodytext">
- <f:if condition="{field.image -> dce:isArray()}">
- <f:then>
- <f:for each="{field.image}" as="image" iteration="iterator">
- <img src="<f:uri.image src='{image.uid}' treatIdAsReference='1' width='200' cropVariant='free' />" style="padding:10px;" width="200" /><br>
- </f:for>
- </f:then>
- </f:if>
- </f:section>
Mit Hilfe von Inline-Styles lassen sich alle Elemente in der Backend-Ansicht verändern.
Konfiguration der Detailseite
Damit eine Detailseite geöffnet werden kann muss zunächst ein Button im normalen Template untergebracht werden. Dieser lautet zum Beispiel:
- <f:link.page additionalParams="{detailDceUid:contentObject.uid}">Weiter</f:link.page>
Durch diesen wird auf der aktuellen Seite die ID dieses speziellen DCE-Objektes aufgerufen und die zusätzlichen Informationen ausgelesen, die sich auf der Detailseite befinden. Mit dem Button:
- <f:link.page pageUid="{page.uid}">Zurück</f:link.page>
kann dann wieder zur Original-Seite zurückgekehrt werden.