Fluid - Snippets: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(31 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Links ==
 
== Links ==
  
http://wiki.typo3.org/Category:De:fluid
+
http://wiki.typo3.org/Category:De:fluid
 +
http://docs.typo3.org/typo3cms/ExtbaseGuide/Fluid/Index.html
  
http://docs.typo3.org/typo3cms/ExtbaseGuide/Fluid/Index.html
+
=== ViewHelper ===
 +
https://www.typo3lexikon.de/typo3-tutorials/core/systemextensions/fluid/fluid-viewhelper.html
  
 
== Debugging ==
 
== Debugging ==
Zeile 12: Zeile 14:
 
  <f:translate key="tx_gbbandpass_domain_model_band.name" />
 
  <f:translate key="tx_gbbandpass_domain_model_band.name" />
 
  Tool zum erstellen der Lokalisierungsdateien (Sprachdateien): http://lbrmedia.net/tools/xliff_translation_file_erstellen/xlfC/Pi1/
 
  Tool zum erstellen der Lokalisierungsdateien (Sprachdateien): http://lbrmedia.net/tools/xliff_translation_file_erstellen/xlfC/Pi1/
 +
 +
== Template Teile in Partials auslagern und Daten übergeben ==
 +
Um Fluid Templates übersichtlich zu gestalten kann man Teile in Partials auslagern. Dem Partial muß man aber die Objekte übergeben, die es rendern soll. So funktioniert es:
 +
<f:render partial="Rma/ListDevices" arguments="{rma:rma}" />
 +
Das Objekt rma soll als Objekt rma übergeben werden. Das Partial findet sich in diesem Fall im Extension Ordner unter
 +
Resources/Private/Partials/Rma/Log.html
 +
 +
<f:render partial="Rma/Log" arguments="{_all}" />
 +
Hier werden alle Objekte übergeben
 +
 +
<f:render partial="Rma/ListDevices" arguments="{rma:rma,device:device}" />
 +
Mehrere Objekte mit Komma getrennt übergeben
  
 
== Links erzeugen ==
 
== Links erzeugen ==
Zeile 28: Zeile 42:
 
=== Seitenlink - f:link.page ===
 
=== Seitenlink - f:link.page ===
 
  <f:link.page pageUid="1" additionalParams="{foo: 'bar'}">page link</f:link.page>
 
  <f:link.page pageUid="1" additionalParams="{foo: 'bar'}">page link</f:link.page>
 +
 +
=== Link Beispiele ===
 +
==== Springen zu einem Anchor-Punkt====
 +
Section entspricht der ID eines Divs
 +
<f:link.page section="frame">Top</f:link.page>
 +
====Link auf eine interne Seite====
 +
<f:link.page pageUid="3">Kontakt</f:link.page>
 +
==== Link mit Parameter Übergabe ====
 +
<f:link.page pageUid="3"  additionalParams="{name: 'wert'}">Kontakt</f:link.page>
 +
====Link auf eine externe Adresse====
 +
<f:link.external url="http://www.typo3.org" target="_blank">Link zy TYPO3</f:link.external>
 +
====Link auf eine E-Mail-Adresse====
 +
<f:link.email email="adresse@domain.com" />
 +
 +
==== Link mit mehreren Argumenten ====
 +
<f:link.action action="addDevice" arguments="{rma:rma,deviceClassUid:deviceClass.uid}">{deviceClass.classTitle} </f:link.action>
  
 
== Bilder ==
 
== Bilder ==
 
  <f:image src="EXT:myext/Resources/Public/typo3_logo.png" alt="alt text" maxWidth="200"/>
 
  <f:image src="EXT:myext/Resources/Public/typo3_logo.png" alt="alt text" maxWidth="200"/>
 +
=== Beispiele ===
 +
Beispiel in Originalgröße
 +
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" />
 +
 +
Beispiel: Beibehaltung der Proportionen
 +
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" width="50" />
  
 +
Beispiel: Geschnittenes Bild
 +
<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" width="100c" height="100c" />
 +
 +
Die kürzere Seite wird auf 100 Pixel gesetzt und bei der längeren Seite wird nach 100 Pixeln einfach abgeschnitten.
 
==== Beispiele für Bilder einer eigenen Extension in Fluid ====
 
==== Beispiele für Bilder einer eigenen Extension in Fluid ====
  
Zeile 70: Zeile 110:
 
</pre>
 
</pre>
  
== If-Else-Bedingungen in Fluid Templates ==
+
== Conditions, If-Else-Bedingungen in Fluid Templates ==
 
http://www.extbasefluid.com/fluid/bedingungen-ifelse/
 
http://www.extbasefluid.com/fluid/bedingungen-ifelse/
 +
 +
<pre>
 +
<f:if condition="{meineBedingungsVariable}">
 +
  <f:then> Dieser Text wird ausgegeben, wenn meineBedingungsVariable weder leer noch 0 ist. </f:then>
 +
  <f:else> Dieser Text wird ausgegeben, wenn meineBedingungsVariable leer oder 0 ist. </f:else>
 +
</f:if>
 +
</pre>
 +
<f:if condition="{meineBedingungsVariable} > 3">
 +
...
 +
<pre>
 +
// Modulo
 +
<f:for each="{photos}" as="photo" cycle="cycle">
 +
<div class="photo">{photo.name}</div>
 +
<f:if condition="{cycle} % 2"> <br/> </f:if>
 +
</f:for>
 +
</pre>
 +
<f:if condition="{meineBedingungsVariable} == {meinWertZumPruefen}">
 +
...
 +
<pre>
 +
<f:if condition="<f:count subject='{post.comments}' /> > 0">
 +
<f:then> [...] {comments} [...] </f:then>
 +
<f:else> Keine Kommentare gefunden. </f:else>
 +
</f:if>
 +
//Um eigene Viewhelper in der Bedingung zu verwenden müssen einfache Hochkommas in der Bedingung verwendet werden.
 +
</pre>
 +
=== Beispiel - Letztes Element In Schleife===
 +
<pre>
 +
<f:alias map="{n: '{items->f:count()}'}">
 +
<f:for each="{items}" as="item" iteration="i">
 +
{item.property}<br>
 +
<f:if condition="{n} > {i.cycle}">
 +
<f:then>da kommt noch eins <br></f:then>
 +
<f:else>das wars</f:else>
 +
</f:if>
 +
</f:for>
 +
</pre>
 +
=== Beispiel - Objekte vorhanden / Objekte zählen===
 +
Testen ob Objekte zum Ausgeben vorhanden sind (hier projects)
 +
<pre>
 +
<f:if condition="{projects}">
 +
  <f:then>
 +
    <f:for each="{projects}" as="project">
 +
      <tr>
 +
        <td>{project.name}</td>
 +
        <td><f:count subject="{project.assignments}" /> Mitarbeiter</td>
 +
        <td>{project.workedTime}<td>
 +
      </tr>
 +
    </f:for>
 +
  </f:then><f:else>
 +
    <tr><td>Keine Projekte gefunden</td></tr>
 +
  </f:else>
 +
</f:if>
 +
</pre>
 +
 +
===Beispiel 2===
 +
 +
'''TypoScript'''
 +
<pre>
 +
partialAuswahl = TEXT
 +
partialAuswahl.value = 1
 +
 +
# FLUID Template definieren
 +
fluidTemplate = FLUIDTEMPLATE
 +
fluidTemplate {
 +
  ...
 +
  variables {
 +
    partial < partialAuswahl
 +
  }
 +
}
 +
</pre>
 +
'''Template (view-helper)'''
 +
Fluid kann im Moment nur nummerische Werte überprüfen, deswegen partialAuswahl.value = 1 und {partial} == 1
 +
 +
<pre>
 +
<f:if condition="{partial} == 1">
 +
    <f:then>
 +
      Partial {partial} ausgegeben.
 +
    </f:then>
 +
 
 +
    <f:else>
 +
        Keine Partial-Angabe gefunden
 +
    </f:else>
 +
</f:if>
 +
</pre>
  
 
=== Template Variable mit String vergleichen ===
 
=== Template Variable mit String vergleichen ===
Zeile 105: Zeile 229:
 
  {data.bodytext}
 
  {data.bodytext}
 
</f:if>
 
</f:if>
 +
</pre>
 +
 +
=== Switches (ab Typo3 6.2 ===
 +
<pre>
 +
<f:switch expression="{person.gender}">

 +
  <f:case value="male">Mr.</f:case>

 +
  <f:case value="female">Mrs.</f:case>

 +
  <f:case default="TRUE">Mrs. or Mr.</f:case>

 +
</f:switch>
 
</pre>
 
</pre>
  
Zeile 160: Zeile 293:
 
</pre>
 
</pre>
  
== Anderes ==
+
== TypoScript in Fluid ==
== Beispiele ==
+
== Plugin per TypoScript holen und einbinden ==
Quellen:
+
https://blog.teamgeist-medien.de/2014/03/typo3-eine-extbase-extension-per-typoscript-einbinden.html
  
http://itype3.blogspot.de/2013/03/fluid-template.html
+
Beispiel Cookiemanager - typoscript
 
+
<syntaxhighlight lang="typoscript">
 
+
# COOKIE MANAGER
'''Unix Timestamp for Humans'''
+
plugin.tx_waconcookiemanagement.persistence.storagePid = 406
<f:format.date = format="d.m.Y - H:i:s">@1362784580</f:format.date>
+
#plugin.tx_waconcookiemanagement.persistence.storagePid.ifEmpty.data = {page:uid}
 
+
lib.cookieManager = COA
'''Text auf eine gewisse Länge abschneiden'''
+
lib.cookieManager {
append wird dem abgekürztem Text am Ende eingefügt, wie z.B. ein Leerzeichen und drei Punkte um zu symbolisieren, dass der Text abgekürzt wurde.
+
    10 < tt_content.list.20.waconcookiemanagement_cookiefreigabe
<f:format.corp maxCharacters="50" append="&nbsp; ...">Hier folgt der TEXT</f:format.corp>
+
}
 
+
</syntaxhighlight>
'''Texte direkt aus dem TypoScript Objekt holen'''
+
Fluid Template
 +
<syntaxhighlight lang="html5">
 +
<div class="cookie-manager"><f:cObject typoscriptObjectPath="lib.cookieManager"/></div>
 +
</syntaxhighlight>
 +
==== Texte direkt aus dem TypoScript Objekt holen====
 
TypoScript
 
TypoScript
 
  inhaltSpalteNormal < styles.content.get
 
  inhaltSpalteNormal < styles.content.get
Zeile 180: Zeile 317:
 
  <f:cObject typoscriptObjectPath="inhaltSpalteNormal" />
 
  <f:cObject typoscriptObjectPath="inhaltSpalteNormal" />
  
Texte direkt aus dem TypoScript Objekt holen kombiniert
+
====Texte direkt aus dem TypoScript Objekt holen kombiniert====
TypoScript
+
'''TypoScript'''
 
<pre>
 
<pre>
 
meinText = TEXT
 
meinText = TEXT
Zeile 192: Zeile 329:
 
</pre>
 
</pre>
  
Template (View-Helper)
+
==== TypoScript holen ====
 
Hier gibt es zwei Varianten. Die eine per data-Attribut den Text übergeben und die Andere
 
Hier gibt es zwei Varianten. Die eine per data-Attribut den Text übergeben und die Andere
 
zwischen den f:cObject-Tags.
 
zwischen den f:cObject-Tags.
  <f:cObject typoscriptObjectPath="meinText" data="Das ist der Text aus dem Template"/>
+
  <f:cObject typoscriptObjectPath="meinText" data="Das ist der Text aus dem Template, er wird ersetzt"/>
  
 
oder
 
oder
 
<pre>
 
<pre>
 
<f:cObject typoscriptObjectPath="meinText">
 
<f:cObject typoscriptObjectPath="meinText">
   Das ist der Text aus dem Template
+
   Platzhaltertext
 
</f:cObject>
 
</f:cObject>
 
</pre>
 
</pre>
  
Querverweise auf interne Seiten, externe Adressen, E-Mail-Adressen oder Anchor
+
==== Beispiel ====
 
+
<pre>
Springen zu einem Anchor-Punkt
+
plugin.tx_extname {
Section entspricht der ID eines Divs
+
settings {
<f:link.page section="frame">Top</f:link.page>
+
foo = blub
 
+
bla {
Link auf eine interne Seite
+
bar = lorem
<f:link.page pageUid="3">Kontakt</f:link.page>
+
}
 
+
     }
...wir können auch Parameter übergeben:
 
<f:link.page pageUid="3"  additionalParams="{name: 'wert'}">Kontakt</f:link.page>
 
 
 
Link auf eine externe Adresse
 
<f:link.external url="http://www.typo3.org" target="_blank">Link zy TYPO3</f:link.external>
 
 
 
Link auf eine E-Mail-Adresse
 
<f:link.email email="adresse@domain.com" />
 
 
 
 
 
Conditions
 
 
 
TypoScript
 
<pre>  
 
partialAuswahl = TEXT
 
partialAuswahl.value = 1
 
 
 
# FLUID Template definieren
 
fluidTemplate = FLUIDTEMPLATE
 
fluidTemplate {
 
  ...
 
  variables {
 
     partial < partialAuswahl
 
  }
 
 
}
 
}
</pre>
 
Template (view-helper)
 
Fluid kann im Moment nur nummerische Werte überprüfen, deswegen partialAuswahl.value = 1 und {partial} == 1
 
 
<pre>
 
<f:if condition="{partial} == 1">
 
    <f:then>
 
      Partial {partial} ausgegeben.
 
    </f:then>
 
 
 
    <f:else>
 
        Keine Partial-Angabe gefunden
 
    </f:else>
 
</f:if>
 
 
</pre>
 
</pre>
  
Comment-View-Helper
+
print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $this->settings['foo'] );
Man kann im Fluid-Template Kommentare hinterlassen, ohne dass diese im Frontend ausgegeben werden.
+
print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $this->settings['bla']['bar'] );
<pre>
 
<f:comment>
 
    Das ist ein Comment für den Entwickler, der im Quelltext
 
    im Gegensatz zum HTML-Comment nicht zu sehen ist
 
</f:comment>
 
</pre>
 
  
Inline Notation
+
===Inline Notation===
  
TypoScript
+
'''TypoScript'''
 
<pre>
 
<pre>
 
anredeHerr = TEXT
 
anredeHerr = TEXT
Zeile 279: Zeile 372:
 
}
 
}
 
</pre>
 
</pre>
Template (View-Helper)
+
 
 +
'''Template (View-Helper)'''
 
<pre>
 
<pre>
 
<p>
 
<p>
Zeile 285: Zeile 379:
 
   wir m&ouml;chten Ihnen mitteilen, dass...
 
   wir m&ouml;chten Ihnen mitteilen, dass...
 
</p>
 
</p>
</pre>
 
Doctype auf HTML 5 umstellen
 
<pre>
 
page = PAGE
 
page {
 
  config{
 
    # HTML 5
 
    doctype = <!DOCTYPE html>
 
  }
 
}
 
 
</pre>
 
</pre>
  
TEXT Object
+
== Alias - Werte zwischenspeichern ==
 
 
Naviagtion 2. Stufe direkt anzeigen
 
 
<pre>
 
<pre>
# Navigation als Content Object Array (COA)
+
<f:alias map="{amount: '{addresses->f:count()}'}">
nav = COA
+
   <p>There are {amount} records in database</p>
nav {
+
</f:alias>
 
 
  wrap = <ul>|</ul>
 
    
 
  10 = TEXT
 
  10 {
 
    value = Home
 
    stdWrap.typolink.parameter = 1
 
    wrap = <li>|</li>
 
  }
 
 
 
  20 = HMENU
 
  20 {   
 
    1 = TMENU
 
    # Hauptmenü 1. Stufe
 
    1 {
 
      NO = 1
 
      # stdwrap wendet die Eigenschaften auf den Text and
 
      # stdWrap2 wendet die Eigenschaften auf den kompletten a-Tag an
 
      NO.stdWrap2.wrap = <li>|</li>
 
      CUR = 1
 
      CUR < .NO
 
      CUR.ATagParams = class="active"
 
      ACT = 1
 
      ACT < .CUR
 
    }
 
   
 
    # Untermenü 2. Stufe
 
    /*
 
    2 = TMENU
 
    # Alle Eigenschaften der Normal und Current Zustände übernommen
 
    2 < .1
 
    2 {
 
      NO.stdWrap2.wrap = <li>&nbsp;&nbsp;&nbsp;&nbsp;|</li>
 
      ACT < .NO
 
      CUR.ATagParams = class="active"
 
      CUR < .ACT
 
    }
 
    */
 
  }
 
  # Wenn die 2. Stufe direkt angezeigt werden soll
 
  # ohne dass man zuerst auf den parent (1. Stufe) klikt
 
 
 
  30 = HMENU
 
  30 {
 
    special = directory
 
    value = 26
 
    1 = TMENU
 
    1 {
 
      NO = 1
 
      NO.stdWrap2.wrap = <li>&nbsp;&nbsp;&nbsp;&nbsp;|</li>
 
      ACT < .NO
 
      ACT.ATagParams = class="act"
 
      CUR < .ACT
 
    }
 
  }
 
 
 
 
 
}
 
 
</pre>
 
</pre>
  
 +
== Formulare ==
 +
siehe auch [[Formulare mit Extbase und Fluid]]
  
 +
== Anderes ==
 +
=== Fluid überschreiben ===
 +
z.B. bei SystemExtensions:
  
OPTION SPLIT
+
http://blog.teamgeist-medien.de/2014/11/typo3-fluid-viewhelper-templates-ueberschreiben-z-b-vom-paginate-widget.html
  
Im folgenden sehen wir mit dem Option Split jedem Link noch einen Parameter übergeben
+
Ohne Namespaces (TYPO3 < 6.x)
Dem ersten hängen wir den Buchstaben A vorne , dann folgen zwei Pipe zeichen || gefolgt von noch einem <li> Tag welcher mit eine Kopie des ersten ist, jedoch mit einem B anfängt.
 
Das hat eine Auswirkung dass im Ersten Link der zweiten Stufe ein A vor dem Link angehängt wird
 
und jedem weiteren ein B
 
 
<pre>
 
<pre>
    # Untermenü 2. Stufe
+
# Zentral für alle Plugins
    2 = TMENU
+
config.tx_extbase.view.widget.Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/
    # Alle Eigenschaften der Normal und Current Zustände übernommen
+
 
    2 < .1
+
# Nur für ein bestimmtes Plugin
    2 {
+
plugin.tx_extension.view.widget.Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/
      NO.stdWrap2.wrap = <li>A&nbsp;&nbsp;&nbsp;&nbsp;|</li> || <li>B&nbsp;&nbsp;&nbsp;&nbsp;</li>
 
      ACT < .NO
 
      CUR.ATagParams = class="active"
 
      CUR < .ACT
 
    }
 
  }
 
 
</pre>
 
</pre>
Navigation
+
Mit Namespaces (TYPO3 >= 6.x)
So würde dann die Navigation im Frontend aussehen
 
 
<pre>
 
<pre>
Home
+
# Zentral für alle Plugins
Über uns
+
config.tx_extbase.view.widget.TYPO3\CMS\Fluid\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/
Kontakt
 
  A Seite 1
 
  B Seite 2
 
  B Seite 3
 
</pre>
 
  
TypoScript
+
# Nur für ein bestimmtes Plugin
 
+
plugin.tx_extension.view.widget.TYPO3\CMS\Fluid\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/
Hier noch ein Beispiel wie man nur die ersten zwei Links berücksichtigen kann.
 
Nach dem 2. LI-Tag folgen nochmals zwei Pipe Zeichen, welche den 3 und die folgende Links anspricht
 
diese werden nicht formatiert nur der 1. und 2.
 
 
 
<pre>
 
    # Untermenü 2. Stufe
 
    2 = TMENU
 
    # Alle Eigenschaften der Normal und Current Zustände übernommen
 
    2 < .1
 
    2 {
 
      NO.stdWrap2.wrap = <li>A&nbsp;&nbsp;&nbsp;&nbsp;|</li> || <li>B&nbsp;&nbsp;&nbsp;&nbsp;</li> ||
 
      ACT < .NO
 
      CUR.ATagParams = class="active"
 
      CUR < .ACT
 
    }
 
  }
 
 
</pre>
 
</pre>
 +
Wichtig:
 +
Bei den Templates ist es wichtig auf die richtige Ordnerstruktur zu achten! Hierzu kann man sich die Originalstruktur unter
 +
typo3_src-x.x.x/typo3/sysext/fluid/Resources/Private/Templates/ViewHelpers
 +
anschauen.
  
Navigation
+
=== Count - Objekte zählen ===
Das sind nun die Auswirkungen der Navigation im Frontend
+
<f:count subject="{myObjects}" />
 +
oder in Inline Notation:
 +
{myObjects->f:count()}
  
<pre>
+
=== Weitere Beispiele ===
Home
+
Quellen:
Über uns
 
Kontakt
 
  A Seite 1
 
  B Seite 2
 
  Seite 3
 
</pre>
 
Weitere Informationen sind unter der Typo3 Referenz nachlesbar
 
http://wiki.typo3.org/De:TSref/optionSplit
 
  
 +
http://itype3.blogspot.de/2013/03/fluid-template.html
  
  
Konstanten
+
====Unix Timestamps als Datum anzeigen====
 +
<f:format.date = format="d.m.Y - H:i:s">@1362784580</f:format.date>
  
Für wiederkehrende Bezeichner wie Grafiken oder Textpassagen verwendet man im TypoScript am besten Konstanten
+
====Text auf eine gewisse Länge abschneiden====
 +
append wird dem abgekürztem Text am Ende eingefügt, wie z.B. ein Leerzeichen und drei Punkte um zu symbolisieren, dass der Text abgekürzt wurde.
 +
<f:format.corp maxCharacters="50" append="&nbsp; ...">Hier folgt der TEXT</f:format.corp>
  
Oberhalb der des Templates > setup klikt man auf Kostanten, darin definiert man:
+
== Kommentare in Fluid ==
 +
Comment-View-Helper
  
logoDatei = logo.png
+
Man kann im Fluid-Template Kommentare hinterlassen, ohne dass diese im Frontend ausgegeben werden.
 
+
<pre>
 
+
<f:comment>
Im Template (setup) greift man wie folgt auf die Konstanten zu
+
    Das ist ein Comment für den Entwickler, der im Quelltext
 
+
    im Gegensatz zum HTML-Comment nicht zu sehen ist
file = fileadmin/template_fluid/public/img/{$logoDatei}
+
</f:comment>
 
+
</pre>
 
 
TypoScript Refferenz
 
 
 
http://www.tsref.de/
 
http://typo3.org/documentation/document-library/core-documentation/doc_core_tsref/current/view/
 

Aktuelle Version vom 23. Juni 2020, 13:16 Uhr

Links[Bearbeiten]

http://wiki.typo3.org/Category:De:fluid
http://docs.typo3.org/typo3cms/ExtbaseGuide/Fluid/Index.html

ViewHelper[Bearbeiten]

https://www.typo3lexikon.de/typo3-tutorials/core/systemextensions/fluid/fluid-viewhelper.html

Debugging[Bearbeiten]

<f:debug title="band">{band}</f:debug>
<f:debug>{_all}</f:debug>

Lokalisierung - Mehrsprachigkeit[Bearbeiten]

<f:translate key="tx_gbbandpass_domain_model_band.name" />
Tool zum erstellen der Lokalisierungsdateien (Sprachdateien): http://lbrmedia.net/tools/xliff_translation_file_erstellen/xlfC/Pi1/

Template Teile in Partials auslagern und Daten übergeben[Bearbeiten]

Um Fluid Templates übersichtlich zu gestalten kann man Teile in Partials auslagern. Dem Partial muß man aber die Objekte übergeben, die es rendern soll. So funktioniert es:

<f:render partial="Rma/ListDevices" arguments="{rma:rma}" />

Das Objekt rma soll als Objekt rma übergeben werden. Das Partial findet sich in diesem Fall im Extension Ordner unter

Resources/Private/Partials/Rma/Log.html
<f:render partial="Rma/Log" arguments="{_all}" />

Hier werden alle Objekte übergeben

<f:render partial="Rma/ListDevices" arguments="{rma:rma,device:device}" /> Mehrere Objekte mit Komma getrennt übergeben

Links erzeugen[Bearbeiten]

http://wiki.typo3.org/De:ViewHelper/Link

Link auf Action Controller z.B. Einzelansicht (show) - f:link.action[Bearbeiten]

<f:link.action action="show">action link</f:link.action>
<f:link.action action="show" arguments="{band : band}"> {band.name}</f:link.action>

E-Mail Link - f:link.email[Bearbeiten]

<f:link.email email="foo@bar.tld" />

Externer Link - f:link.external[Bearbeiten]

Standard Scheme ist http es gehen aber auch andere z.B. ftp:

<f:link.external uri="typo3.org" defaultScheme="ftp">external ftp link</f:link.external>

Seitenlink - f:link.page[Bearbeiten]

<f:link.page pageUid="1" additionalParams="{foo: 'bar'}">page link</f:link.page>

Link Beispiele[Bearbeiten]

Springen zu einem Anchor-Punkt[Bearbeiten]

Section entspricht der ID eines Divs

<f:link.page section="frame">Top</f:link.page>

Link auf eine interne Seite[Bearbeiten]

<f:link.page pageUid="3">Kontakt</f:link.page>

Link mit Parameter Übergabe[Bearbeiten]

<f:link.page pageUid="3"  additionalParams="{name: 'wert'}">Kontakt</f:link.page>

Link auf eine externe Adresse[Bearbeiten]

<f:link.external url="http://www.typo3.org" target="_blank">Link zy TYPO3</f:link.external>

Link auf eine E-Mail-Adresse[Bearbeiten]

<f:link.email email="adresse@domain.com" />

Link mit mehreren Argumenten[Bearbeiten]

<f:link.action action="addDevice" arguments="{rma:rma,deviceClassUid:deviceClass.uid}">{deviceClass.classTitle} </f:link.action>

Bilder[Bearbeiten]

<f:image src="EXT:myext/Resources/Public/typo3_logo.png" alt="alt text" maxWidth="200"/>

Beispiele[Bearbeiten]

Beispiel in Originalgröße

<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" />

Beispiel: Beibehaltung der Proportionen

<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" width="50" />

Beispiel: Geschnittenes Bild

<f:image src="fileadmin/bilder/landschaft.jpg" alt="landschaft" width="100c" height="100c" />

Die kürzere Seite wird auf 100 Pixel gesetzt und bei der längeren Seite wird nach 100 Pixeln einfach abgeschnitten.

Beispiele für Bilder einer eigenen Extension in Fluid[Bearbeiten]

Beispiel (Quelle: http://keinerweiss.de/755-typo3-fal-in-einer-eigenen-extbasefluid-extension-einsetzen.html 2014/11)

Hier nutzt man den File Abstraction Layer (FAL). Ausgehend von einer mit dem Extension Builder erzeugtem Modell mit Typ Image ein paar Schnipsel für die Ausgabe im template (list.html)

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>

Conditions, If-Else-Bedingungen in Fluid Templates[Bearbeiten]

http://www.extbasefluid.com/fluid/bedingungen-ifelse/

<f:if condition="{meineBedingungsVariable}">
  <f:then> Dieser Text wird ausgegeben, wenn meineBedingungsVariable weder leer noch 0 ist. </f:then>
  <f:else> Dieser Text wird ausgegeben, wenn meineBedingungsVariable leer oder 0 ist. </f:else>
</f:if>
<f:if condition="{meineBedingungsVariable} > 3">
...
// Modulo
<f:for each="{photos}" as="photo" cycle="cycle">
<div class="photo">{photo.name}</div>
<f:if condition="{cycle} % 2"> <br/> </f:if>
</f:for>
<f:if condition="{meineBedingungsVariable} == {meinWertZumPruefen}">
...
<f:if condition="<f:count subject='{post.comments}' /> > 0">
 <f:then> [...] {comments} [...] </f:then>
 <f:else> Keine Kommentare gefunden. </f:else>
 </f:if>
 //Um eigene Viewhelper in der Bedingung zu verwenden müssen einfache Hochkommas in der Bedingung verwendet werden.

Beispiel - Letztes Element In Schleife[Bearbeiten]

<f:alias map="{n: '{items->f:count()}'}">
<f:for each="{items}" as="item" iteration="i">
{item.property}<br>
<f:if condition="{n} > {i.cycle}">
<f:then>da kommt noch eins <br></f:then>
<f:else>das wars</f:else>
</f:if>
</f:for>

Beispiel - Objekte vorhanden / Objekte zählen[Bearbeiten]

Testen ob Objekte zum Ausgeben vorhanden sind (hier projects)

<f:if condition="{projects}">
  <f:then>
     <f:for each="{projects}" as="project">
      <tr>
        <td>{project.name}</td>
        <td><f:count subject="{project.assignments}" /> Mitarbeiter</td>
        <td>{project.workedTime}<td>
      </tr>
    </f:for>
  </f:then><f:else>
    <tr><td>Keine Projekte gefunden</td></tr>
  </f:else>
</f:if>

Beispiel 2[Bearbeiten]

TypoScript

 
partialAuswahl = TEXT
partialAuswahl.value = 1

# FLUID Template definieren
fluidTemplate = FLUIDTEMPLATE
fluidTemplate {
  ...
  variables {
    partial < partialAuswahl
  }
}

Template (view-helper) Fluid kann im Moment nur nummerische Werte überprüfen, deswegen partialAuswahl.value = 1 und {partial} == 1

<f:if condition="{partial} == 1">
    <f:then>
      Partial {partial} ausgegeben.
    </f:then>
  
    <f:else>
        Keine Partial-Angabe gefunden
    </f:else>
</f:if>

Template Variable mit String vergleichen[Bearbeiten]

http://www.typo3lexikon.de/typo3-tutorials/extensions/fluid/fluid-tipps-und-tricks.html

Funktioniert im Moment (2014) noch nicht:

<f:if condition="{data.ctype} == 'table'">
 {data.bodytext}
</f:if>

So geht's:

Über einen Alias

<f:alias map="{myText: 'table'}">
 <f:if condition="{data.ctype} == {myText}">
 {data.bodytext}
 </f:if>
</f:alias>

Über ein Array (die beiden Operatoren werden in ein Array konvertiert, welches Fluid interpretieren kann)

<f:if condition="{0:data.ctype} == {0:'table'}">
 {data.bodytext}
</f:if>

Die Array-Lösung hat auch noch den Vorteil, dass man mehrere Werte gleichzeitig überprüfen kann:

<f:if condition="{0:data.ctype,1:data.hidden,2:data.deleted} == {0:'table',1:'0',2:'0'}">
 {data.bodytext}
</f:if>

Switches (ab Typo3 6.2[Bearbeiten]

<f:switch expression="{person.gender}">
 
   <f:case value="male">Mr.</f:case>
 
   <f:case value="female">Mrs.</f:case>
 
   <f:case default="TRUE">Mrs. or Mr.</f:case>

</f:switch>

RTE Inhalte Rendern[Bearbeiten]

<f:format.html>{content.bodytext}</f:format.html>

Funktioniert aber nicht bei allen CTypes, weil die entsprechenden CSS_Styled_Content Funktionen nicht ausgeführt werden

<f:if condition="{content.ctype}">
 <f:cObject typoscriptObjectPath="tt_content.{content.ctype}.20" data="{content}" />
</f:if>

Beachtet aber, dass Ihr für diese Lösung auch alle benötigten tt_content-Felder in Eurem Model definiert habt.

CSS und JS einbinden[Bearbeiten]

Eventuell wäre hier TypoScript vorzuziehen.

CSS und JS Dateien über Fluid[Bearbeiten]

<link rel="stylesheet" href="{f:uri.resource(path:'Css/bootstrap.css')}">
<script type="text/javascript" src="{f:uri.resource(path:'Js/jquery.shuffle.js')}"></script>

Funktioniert nicht für Dateien in fileadmin. Der Pfad bezieht sich auf

typo3conf/ext/myExtKey/Resources/Public/

Inline JS über Fluid[Bearbeiten]

Wrap über CData:

<![CDATA[
...
]]>

Wrap über Fluid cdata ViewHelper

<f:format.cdata>
  <script type="text/javascript">
    var myLayout;
    $(document).ready(function() {
      myLayout = $('body').layout({
        north__size: 27,
        north__initClosed: false,
        north__initHidden: false,
        center__maskContents: true // IMPORTANT - enable iframe masking
      });
    });
  </script>
</f:format.cdata>

Schleifen[Bearbeiten]

4 Spalten mit Modulo[Bearbeiten]

<f:for each="{images}" as="image" iteration="iteration">
     <f:image src="upload/tx_myextension/{image.source}" width="200" height="150" alt="Mein Bild {image.caption}" />
     <f:if condition="{iteration.cycle}%4==0"><br/></f:if>
</f:for>

TypoScript in Fluid[Bearbeiten]

Plugin per TypoScript holen und einbinden[Bearbeiten]

https://blog.teamgeist-medien.de/2014/03/typo3-eine-extbase-extension-per-typoscript-einbinden.html

Beispiel Cookiemanager - typoscript

# COOKIE MANAGER
plugin.tx_waconcookiemanagement.persistence.storagePid = 406
#plugin.tx_waconcookiemanagement.persistence.storagePid.ifEmpty.data = {page:uid}
lib.cookieManager = COA
lib.cookieManager {
     10 < tt_content.list.20.waconcookiemanagement_cookiefreigabe
}

Fluid Template

<div class="cookie-manager"><f:cObject typoscriptObjectPath="lib.cookieManager"/></div>

Texte direkt aus dem TypoScript Objekt holen[Bearbeiten]

TypoScript

inhaltSpalteNormal < styles.content.get

HTML

<f:cObject typoscriptObjectPath="inhaltSpalteNormal" />

Texte direkt aus dem TypoScript Objekt holen kombiniert[Bearbeiten]

TypoScript

meinText = TEXT
meinText {
  wrap = <p>Hier steht der Text aus dem Template: <b>"|"</b></p>
  # Ohne diese Einstellung würde die | nicht
  # mit dem Text aus dem Template ersezt werden
  current = 1
}

TypoScript holen[Bearbeiten]

Hier gibt es zwei Varianten. Die eine per data-Attribut den Text übergeben und die Andere zwischen den f:cObject-Tags.

<f:cObject typoscriptObjectPath="meinText" data="Das ist der Text aus dem Template, er wird ersetzt"/>

oder

<f:cObject typoscriptObjectPath="meinText">
  Platzhaltertext
</f:cObject>

Beispiel[Bearbeiten]

plugin.tx_extname {
	settings {
		foo = blub
		bla {
			bar = lorem
		}
    }
}
print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $this->settings['foo'] );
print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $this->settings['bla']['bar'] );

Inline Notation[Bearbeiten]

TypoScript

anredeHerr = TEXT
anredeHerr.value = 1

# FLUID Template definieren
fluidTemplate = FLUIDTEMPLATE
fluidTemplate {
  ...
  variables {
    anredeHerr < anredeHerr
  }
}

Template (View-Helper)

<p>
  Sehr geehrte{f:if(condition: '{anredeHerr}', then: 'r Herr', else: ' Frau')} XY, <br />
  wir möchten Ihnen mitteilen, dass...
</p>

Alias - Werte zwischenspeichern[Bearbeiten]

<f:alias map="{amount: '{addresses->f:count()}'}">
  <p>There are {amount} records in database</p>
</f:alias>

Formulare[Bearbeiten]

siehe auch Formulare mit Extbase und Fluid

Anderes[Bearbeiten]

Fluid überschreiben[Bearbeiten]

z.B. bei SystemExtensions:

http://blog.teamgeist-medien.de/2014/11/typo3-fluid-viewhelper-templates-ueberschreiben-z-b-vom-paginate-widget.html

Ohne Namespaces (TYPO3 < 6.x)

# Zentral für alle Plugins
config.tx_extbase.view.widget.Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/

# Nur für ein bestimmtes Plugin
plugin.tx_extension.view.widget.Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/

Mit Namespaces (TYPO3 >= 6.x)

# Zentral für alle Plugins
config.tx_extbase.view.widget.TYPO3\CMS\Fluid\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/

# Nur für ein bestimmtes Plugin
plugin.tx_extension.view.widget.TYPO3\CMS\Fluid\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:pfad/zum/Ordner/der/Templates/

Wichtig: Bei den Templates ist es wichtig auf die richtige Ordnerstruktur zu achten! Hierzu kann man sich die Originalstruktur unter typo3_src-x.x.x/typo3/sysext/fluid/Resources/Private/Templates/ViewHelpers anschauen.

Count - Objekte zählen[Bearbeiten]

<f:count subject="{myObjects}" />

oder in Inline Notation:

{myObjects->f:count()}

Weitere Beispiele[Bearbeiten]

Quellen:

http://itype3.blogspot.de/2013/03/fluid-template.html


Unix Timestamps als Datum anzeigen[Bearbeiten]

<f:format.date = format="d.m.Y - H:i:s">@1362784580</f:format.date>

Text auf eine gewisse Länge abschneiden[Bearbeiten]

append wird dem abgekürztem Text am Ende eingefügt, wie z.B. ein Leerzeichen und drei Punkte um zu symbolisieren, dass der Text abgekürzt wurde.

<f:format.corp maxCharacters="50" append="  ...">Hier folgt der TEXT</f:format.corp>

Kommentare in Fluid[Bearbeiten]

Comment-View-Helper

Man kann im Fluid-Template Kommentare hinterlassen, ohne dass diese im Frontend ausgegeben werden.

<f:comment>
    Das ist ein Comment für den Entwickler, der im Quelltext
    im Gegensatz zum HTML-Comment nicht zu sehen ist
</f:comment>