Flux Migration auf 9.0
Beim updaten von Flux und der obsoleten fluidcontent Extension sind einige Dinge zu beachten
Datenbank Update (CType)
Da das Update Script der Flux Extension leider nicht die wichtigsten Updates durchführen kann, muss man auf der Datenbank eine Query ausführen.
Zunächst worum geht es? Das Feld CType der Tabelle tt_content hat noch überall den Wert "fluidstyledcontent". Durch das Entfallen der fluidcontent Extension, muss man diese Werte auf den Namespace der Extension ändern, die diese Contentelemente bereitstellt.
Der erste wichtige Schritt: Die alten Datenbankfelder nicht löschen lassen im Install Tool. Im Feld tx_fed_fcefile steht noch der alte Wert, der dem fluidstyledcontent gesagt hat, welches Template dafür zu laden ist.
Dieser Wert hat in etwa das Format
Provider.extension_name_lowercase.TemplateNameCamelCase.html
Für den neuen Wert, der in CType einzutragen ist, benötigen wir aber das Format so
extensionname_templatename
Zum Glück kann man dies mit einer Datenbank Query automatisch updaten
UPDATE tt_content
SET CType = LOWER(REPLACE(REPLACE(tx_fed_fcefile, 'Provider.extension_name:', 'extensionname'), '.html', ''))
WHERE CType = 'fluidcontent_content';
Also den alten Wert, der in tx_fed_fcefile steht mit Provier.extension_name im underscore Format in das neue Format extensionnameundsoweiter bis zum _ umwandeln
Container Elemente (flux:grid.column)
Bei Containerelementen in Flux führt eine falsche Konfiguration bereits zu Fehlern im Typo3 Backend.
<f:section name="Preview">
<flux:widget.grid />
</f:section>
Diese Konfiguration des Preview Teils ist veraltet und muss gelöscht werden. Entweder kann man dazu die gesamte Preview Section oder nur das widget.grid löschen
<flux:grid>
<flux:grid.row>
<flux:grid.column style="width: 25%" name="left" label="Left" colPos="50" />
<flux:grid.column style="width: 25%" name="leftCenter" label="Left center" colPos="51" />
<flux:grid.column style="width: 25%" name="rightCenter" label="Right center" colPos="52"/>
<flux:grid.column style="width: 25%" name="right" label="Right" colPos="53" />
</flux:grid.row>
</flux:grid>
Hier ist eine typische Konfiguration eines Containerelementes. der Wert colPos wird in Flux 9 immer benötigt.
Wichtig ist es, wenn mehrere Containerelement existieren, den Wert name und colPos immer gleich zu vergeben.
<flux:grid.row>
<flux:grid.column style="width: 50%" name="left" colPos="0">
</flux:grid.column>
<flux:grid.column style="width: 50%" name="right" colPos="1">
</flux:grid.column>
</flux:grid.row>
Hier haben wir jetzt insgesamt die column namens "left" 2 mal. Jedoch ist die colPos dadurch nicht mehr eindeutig geworden. Es muss also entweder der Name angepasst werden oder man ändert die colPos ebenfalls auf 50.
UPDATE tt_content SET colPos = ((tx_flux_parent * 100) + 50) WHERE tx_flux_column = "left";
Die Datenbank Query zeigt deutlicher warum: Es wird der Wert aus tx_flux_parent mit 100 multipliziert und dazu der colPos Wert addiert. Da wir aber beim Updaten nur nach dem Namen der Flux Column gehen können, benötigen wir also dieselben colPos Werte.
Flux Header und das versteckte Layout
Wenn man Flux 9 und Fluid Styled Content in der jeweiligen Systemversion benutzt, hat man manchmal den Fall, dass Elemente plötzlich eine Überschrift haben, die vorher nicht da war.
Das Ganze wird nirgendwo wirklich logisch erklärt, aber es gibt eine Lösung diese abzustellen.
In vielen Flux Elementen wird das Layout angegeben. Hier steht meistens
<f:layout name="Content"/>
Wenn man sich das Layout direkt anschaut, im Ornder meistens Layouts/Content.html dann sieht man meistens nur
<f:layout name="Content"/>
<f:render section="Main"/>
und man wundert sich, warum da ein Header erscheint und nicht nur wie angegeben der Main Teil des Flux Elementes.
Man kann sogar etwas ins Layout schreiben und es erscheint dann so im Frontend, aber der Header wird trotzdem vorher gerendert, doch wieso?
Wenn man im Typoscript Object Browser nachschaut, sieht man unter dem Eintrag
lib.fluidContent.templateName = Default
lib.contentElement.templateName = Default
Einen dieser Beiden Einträge. Dies gibt uns einen Hinweis, dass irgendwie insgeheim anstatt unser Layout "Content" zu laden, in wirklichkeit ein Layout namens "Default" geladen wird.
Damit geht die seltsame Welt von Flux und Fluid Styled Conten erst richtig los.
Das Default Layout, welches von contentElement (also Fluid Styled Content) und von Flux (fluidContent in diesem Falle) benutzt wird, ist das Default.html. Dieses findet man gewöhnlich in der Systemextension fluid_styled_content
typo3_src/typo3/sysext/fluid_styled_content/Resources/Private/Layouts/Default.html
Wenn man nun Testweise hier ein paar Dinge ändert, merkt man wie auch die Flux Elemente im Frontend sich ändern.
Da man aber in der Systemextension aber nichts ändern sollte, erstellt man am besten Selbst das Layout Default in der eigenen Extension, wo bereits die Flux Elemente liegen.
Hier kann man jetzt nach Belieben das Layout ändern und plötzlich funktionieren auch die eigenen Layouts wieder. Magic.
Nun kann es aber sein, dass man für manche Elemente ein Standard Header haben möchte. Man sollte eigentlich meinen, da Flux ja schon das Default Layout aus der Fluid Styled Content Systemextension gefunden hat, kann man auch einfach wie im Fluid üblich das Partial für den Header rendern.
Man schreibt also in das Layout, ähnlich wie ins Default Layout
<f:render partial="Header/All" arguments="{_all}" />
Und bekommt dann im Frontende einen Fehler, das Partial existiert nicht und der Pfad, der gesucht wurde, beschränkt sich auf den der eigenen Extension. Der normale Pfad zur Systemextension wird nicht durchsucht.
Es müsste eine Option geben, diesen Pfad per TypoScript anzugeben, aber ich kenne noch keine dazu.
Davon abgesehen, würde es auch nicht funktionieren. Wenn wir mal ein Flux Element debuggen, sehen wir, dass unter dem Eintrag pages die ganzen wichtigen Informationen stehen, aber das Header/All Partial diese Werte aus data nimmt.
data != pages
Es bleibt also nichts anderes Übrig, als auch alle benötigten Partials aus der Systemextension Fluid Styled Content mit in die eigene Extension zu kopieren.
In dem Beispiel reicht es also, den Ordner Partials/Header zu übernehmen.
Es empfiehlt sich ebenfalls diese Datein umzubenennen. Wenn man eine Weile nicht am Projekt gearbeitet hat oder es noch nicht kennt, kann es sehr verwirrend sein, wenn immer
<f:render partial="Header/All" arguments="{_all}">
steht und man nicht wirklich genau weiß, ob das Partial aus Fluid Styled Content gerendert wird, oder ein Eigenes.
Da man sowieso für den Header das Header/All Partial anpassen muss, ist das nur eine kleine Empfehlung.
In der normalen Header/All.html steht z.B.
<f:if condition="{data.header_layout} .....>
Da wie vorhin bereits erwähnt die Daten in Flux Elementen nicht in der Data, sondern in Pages Variable Stehen, kann man hier einfach alle data. mit pages. ersetzen und dann kann man auch direkt im Layout den Header mit {_all} als Argument rendern.