DCE: Select field (manuelle Liste) mit if in Fluid abfragen

An dieser simplen Aufgabe bin ich einige Zeit gesessen. Wenn man z.B. im DCE für die Backend-Fields die Möglichkeit braucht mehrere Optionen auszuwählen.

Die Aufgabenstellung bei mir war:

Für eine Gruppe von Autohäusern stehen drei Automarken zu Verfügung. Für jeden Standort sollten die angebotenen Marken am Standort gewählt werden können.

Ich habe das Content Element mit der Extension DCE, die ich wirklich gerne verwende, erstellt. Als Feld habe ich ein Select-Feld verwendet, definiert als manuelle Liste mit drei Einträgen:

<config>
    <type>select</type>
    <items type="array">
        <numIndex index="0" type="array">
            <numIndex index="0">Peugeot</numIndex>
            <numIndex index="1">0</numIndex>
        </numIndex>
        <numIndex index="1" type="array">
            <numIndex index="0">Citroen</numIndex>
            <numIndex index="1">1</numIndex>
        </numIndex>
        <numIndex index="2" type="array">
            <numIndex index="0">Mazda</numIndex>
            <numIndex index="1">2</numIndex>
        </numIndex>
    </items>
    <minitems>0</minitems>
    <maxitems>3</maxitems>
    <dce_load_schema>1</dce_load_schema>
</config>

 

Im Fluidtemplate wollte ich die Abfrage mittels einem IF-Konstrukt lösen:

<f:if condition="{field.hersteller} == 0">
  <f:then>
    <img src="fileadmin/templates/pics/peugeot-logo.svg" />
  </f:then>
</f:if>
<f:if condition="{field.hersteller} == 1">
  <f:then>
    <img src="fileadmin/templates/pics/citroen-logo.svg" />
  </f:then>
</f:if>
<f:if condition="{field.hersteller} == 2">
  <f:then>
    <img src="fileadmin/templates/pics/mazda-logo.svg" />
  </f:then>
</f:if>

Das klappte aber nicht – hat die manuelle Liste des Elementes mehr als zwei Optionen lässt sie sich mittels Fluid IF so nicht mehr abfragen. (Bei zwei Optionen kann auf wahr/falsch abgefragt werden.)

Und das klappte deswegen nicht, da ein Fluid-Debug zeigte, dass die Variable kein Array ist, sondern ein String:

hersteller => '0,1,2' (5 chars)

Die Lösung:

Um diesen String nun umzuwandeln hilft dce:explode (danke an die Hilfe von Armin und Erik im #dce-Channel von Slack):

<f:for each="{field.hersteller -> dce:explode(delimiter:',')}" as="autologos">
  <f:if condition="{autologos} == 0">
    <f:then>
      <img src="fileadmin/templates/pics/peugeot-logo.svg" />  
    </f:then>
  </f:if>
  <f:if condition="{autologos} == 1">
    <f:then>
      <img src="fileadmin/templates/pics/citroen-logo.svg" />
    </f:then>
  </f:if>
  <f:if condition="{autologos} == 2">
    <f:then>
      <img src="fileadmin/templates/pics/mazda-logo.svg" />
    </f:then>
  </f:if>
</f:for>

 

Namespace nicht vergessen: 
{namespace dce=ArminVieweg\Dce\ViewHelpers}

Typo3 9.5 LTS – Die Neuerungen

Lange haben wir darauf gewartet – nun ist sie endlich verfügbar: Die neue LTS Version von Typo3 in der Version 9.5.

Sprechende URLs (Speaking Urls)

Typo3 9 LTS kommt mit ein paar wirklich nützlichen Features. Als wichtigste Neuerung ist wohl die Funktion „Speaking Urls“ hervorzuheben. Es ist nun ohne zusätzliche Plugins (wie z.B. RealURL) möglich, schöne Urls zu generieren – diese Funktion wurde nämlich mit Typo3 9.5 endlich in den Typo3 Core integriert.

Suchmaschinenoptimierung (SEO)

Neben der schönen Generierung von Urls, das ja für Suchmaschinenoptimierung auch wichtig ist sind auch weitere Maßnahmen in dieser Richtung umgesetzt worden.

Es wurde den Seiteneigenschaften ein eigener Reiter für dieses Thema spendiert – dieser vereint schon vorhandene Felder mit neuen. Es gibt eine neue Meta-Tag-API sowie eine Seitentitel-API, ebenso können XML-Sitemaps generiert werden.

Site Management

Im neuen Modul „Sites“ können Einstellungen für Sprachen, Einstiegspunkte, Redirects u.v.m. für einzelne Sites innerhalb der Typo3 Installation definiert werden.

Systemwartung

Das „Install Tool“ wurde nun komplett in das Typo3 Backend integriert – und in 4 neue Module aufgeteilt:

  • Maintenance
  • Settings
  • Upgrade
  • Environment

Fazit

Alles in allem finde ich, dass die neue LTS Version Typo3 9.5 ein sehr gelungenes Update ist. Es wartet mit ein paar echten Verbesserungen auf – ich werde wohl mit demnächst mit passenden Projekten die ersten Upgrades von Typo3 8.x auf die Typo3 9.5 LTS angehen.

Cookie Consent in Typo3

Der eine oder andere dürfte es vielleicht noch nicht umgesetzt haben und ist auf der Suche nach einer einfachen Integration des Cookie Consent bzw. einer Cookie Bar in Typo3 um die DSGVO zu erfüllen.

Sehr schön habe ich folgende Lösung von https://cookieconsent.insites.com gefunden. Und diese ist leicht mittels Typoscript zu integrieren:

######################################################
# Cookie Notice 
# https://cookieconsent.insites.com/download/
######################################################

page.headerData.123 = TEXT
page.headerData.123.value (

<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
<style> ... hier kann man noch eigene Styles für DIVs definieren wenn man möchte </style>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
  "palette": {
    "popup": {
      "background": "#444444",
      "text": "#efefef"
    },
    "button": {
      "background": "#89bb16",
      "text": "#fff"
    }
  },
  "theme": "classic",
  "content": {
    "message": "Um unsere Webseite für Sie optimal zu gestalten und verbessern zu können, verwenden wir Cookies. Durch die Nutzung der Webseite stimmen Sie deren Verwendung zu.",
    "dismiss": "OK",
    "link": "Zur Datenschutzerklärung",
    "href": "/datenschutzerklaerung/"
  }
})});
</script>

)

Die externen JS und CSS müssten  um die DSGVO zu erfüllen lokal gespeichert werden.

Das ganze funktioniert auch mit mehreren Sprachen – dann einfach obigen Code nochmal reinkopieren, Texte in andere Sprache ändern und folgende Typoscript-Condition um den Code einfügen:

[globalVar = GP:L = 1]
{-- Code von oben nur Textausgabe in anderer Sprache --}
[global]

 

Noch nicht final geklärt ist ja die Frage, ob ein reines Informieren der User über die Cookies ausreicht, oder ob diese erst gesetzt werden dürfen, wenn der User aktiv anklickt, dass Cookies erlaubt sind.

Auch das wäre mit Cookie Consent möglich – es gibt eine Opt-in und Opt-out Funktion.

Fluid in Typo3: Override Templates hat sich geändert

Der Typoscript Code um Templates zu überschreiben (override templates) hat sich geändert. Ich musste dies bei mir in Typo3 8.x ändern – und hab die Lösung erst nach einigem Suchen gefunden.

Die Typoscript lib hat sich geändert von lib.contentElement zu lib.fluidContent.

Richtig heisst der Typoscript-Code also um Templates in Fluid zu überschreiben:

lib.fluidContent {
   templateRootPaths {
      200 = fileadmin/ABCDE/Resources/Private/Templates/
   }
   partialRootPaths {
      200 = fileadmin/ABCDE/Resources/Private/Partials/
   }
   layoutRootPaths {
      200 = fileadmin/ABCDE/Resources/Private/Layouts/
   }
}

 

Typo3 Fluid: if Viewhelper (if – then – elseif – else)

Mit Typo3 8 wurde Fluid als Standalone Plugin weiterentwickelt und einigen Änderungen und Erweiterungen unterzogen. Da die Frage immer wieder mal auftaucht – hier eine kurze Übersicht die der if Viewhelper in Typo3 Fluid aufgebaut ist. Einmal in Typo3 7 und früher, einmal in Typo3 ab Version 8.

Fluid if Viewhelper in Typo3 7 und früher

Hier gab es das elseif-Konstrukt noch nicht, und man musste die if-Conditions in der Regel verschachteln:

<f:if condition="{variable} == 'bestimmterWert'">
    <f:then>
       // dann führe folgendes aus
    </f:then>
    <f:else>
        <f:if condition="{andereVariable} == 'bestimmterWert'">
            <f:then>
                // dann führe folgendes aus
            </f:then>
           <f:else>
               // dann führe diese Anweisungen aus
           </f:else>
        </f:if>
    </f:else>
</f:if>

Eine Ausnahme gab es, um ohne die if-Verschachtelung auszukommen – man konnte via Arrays die logische UND-Verknüpfung (&&) wie folgt nachbauen, und sich somit das Verschachteln der if-Anweisungen sparen:

<f:if condition="{0: jahre, 1: monate} == {0: vergleichsJahr, 1: vergleichsMonat}">
// dann führe folgendes aus
</f:if>

 

Fluid if-Viewhelper in Typo3 8 und höher

<f:if condition="{variable} == 'bestimmterWert'">
     <f:then>
          // dann führe folgendes aus
     </f:then>
     <f:else if="{andereVariable} == 'bestimmterWert'">
          // dann führe folgendes aus
     </f:else>
     <f:else>
         // für den Rest führe folgendes aus..
     </f:else>
</f:if>

Möglich ist auch, diese Abfragen mit logischen UND bzw. ODER in kürzerer Schreibweise zu schreiben:

<f:if condition="({variableOne} && {variableTwo}) || {variableThree} || {variableFour}">
// Done if both variable one and two evaluate to true,
// or if either variable three or four do.
</f:if>

Weitere Beispiele:

<f:if condition="{variable} || {andereVariable}">
    // dann führe folgendes aus
</f:if>

Ist wahr, wenn eine der beiden Variablen gesetzt ist.

 

Inline Schreibweise von if-Conditions:

If – Abfragen können auch inline geschrieben werden. Das ist z.B. sinnvoll, wenn in Fluid-Templates je nach gesetzten Variablen oder bei bestimmten Varialben-Werten bestimmte CSS-Klassen ausgegeben werden sollen.

 

Beispielsweise wenn im Backend bei Inhaltselementen im Reiter „Erscheinungsbild“ bestimmte Layouts, Frames oder Abstände ausgewählt werden.

Hier die generelle Schreibweise:

{f:if(condition: variable1, then: 'bestimmterWert')}

// Hier wird "bestimmterWert" ausgegeben, wenn die Variable "variable1" gesetzt ist
{f:if(condition: '{variable1} == "Yes"', then: 'bestimmterWert')}

// Hier wird "bestimmterWert" ausgegeben, wenn die Variable "variable1" dem String "Yes" entspricht
{f:if(condition: '{variable1} == 1', then: 'bestimmterWert')}

// Hier wird die Variable "bestimmterWert" ausgegeben, wenn die Variable "variable1" der Zahl 1 entspricht.
{f:if(condition: '{variable1} == 1', then: 'bestimmterWert', else: 'andererWert')}

// Wenn die Variable "variable1" der Zahl 1 entspricht wird "bestimmterWert" ausgegeben, in allen anderen Fällen "andererWert".

 

Bootstrap 3 Spaltenelemente in Typo3

Ich setze bei meinen Projekten ganz gerne auf die Lösung von  Stefan Schäfer / merec.org, um Spaltenelemente basierend auf Bootstrap 3 Klassen zu realisieren.

Aufgrund der Anforderung, dass die Redakteure das Aussehen der Inhalte, im speziellen Fall auch der Bootstrap Spalten, anpassen sollen, habe ich das Typoscript Setup von Stefan noch etwas erweitert bzw. geändert.

Die prinzipielle Struktur die ich gerne wollte war:

<div class="container>
  <div class="row undweitereKlassen">
    <div class="col-md-6 usw">INHALTE</div>
    <div class="col-md-6 usw">INHALTE</div>
  </div>
</div>

Folgende Dinge soll der Redakteur beeinflussen können:

  • Ob die Zeile 100% der Seitenbreite einnimmt oder die vordefinierte Inhaltsbreite (aus dem Reiter „Erscheinungsbild“ -> Frame)
  • Abstand davor und Abstand danach (aus dem Reiter „Erscheinungsbild“ -> Space Before / Space After)
  • Hintergrundfarbe der Zeile (aus dem Reiter „Erscheinungsbild“ -> Layout)
<div class="container>   <-- bei 100% diesen DIV nicht rendern
  <div class="row undweitereKlassen">    <--- SpaceBefore, SpaceAfter Klassen, Hintergrundfarbe
    <div class="col-md-6 usw">INHALTE</div>
    <div class="col-md-6 usw">INHALTE</div>
  </div>
</div>

 

Ich habe also beim Typoscript Code von Stefan folgendes ergänzt (heller hinterlegte Zeilen):

plugin.tx_gridelements_pi1.setup.uebb_bootstrap_2col {

  preCObject = LOAD_REGISTER
  preCObject {
    containerClasses.cObject = COA
    containerClasses.cObject {
      10 = TEXT
      10 {
        value = equal-height
        fieldRequired = flexform_equalHeight
        noTrimWrap = | ||
      }
      11 = TEXT
      11 {
        value = v-align-children
        fieldRequired = flexform_verticalAlign
        noTrimWrap = | ||
      }
    
    
      20 = TEXT
      20 {
        field = flexform_visibility_element
        noTrimWrap = | ||
        split {
          token = ,
          cObjNum = 1
          1.current = 1
          1.noTrimWrap = | ||
          }
        }
      30 = CASE
      30 {        
        key.field = layout
        default = TEXT
        default.value =  
        1 = TEXT
        1.value = 
        2 = TEXT
        2.value = bg-primary
        3 = TEXT
        3.value = bg-secondary
        4 = TEXT
        4.value = bg-dark
        5 = TEXT
        5.value = bg-dark bg-dark2
        noTrimWrap = | | |
        }
        
      40 = CASE
      40 {        
        key.field = space_before_class
        default = TEXT
        default.value =
        extra-small = TEXT
        extra-small.value = frame-space-before-extra-small
        extra-small.noTrimWrap = | ||
        small = TEXT
        small.value = frame-space-before-small
        small.noTrimWrap = | ||
        medium = TEXT
        medium.value = frame-space-before-medium
        medium.noTrimWrap = | ||
        large = TEXT
        large.value = frame-space-before-large
        large.noTrimWrap = | ||
        extra-large = TEXT
        extra-large.value = frame-space-before-extra-large
        extra-large.noTrimWrap = | ||
        }
    
      50 = CASE
      50 {        
        key.field = space_after_class
        default = TEXT
        default.value =
        extra-small = TEXT
        extra-small.value = frame-space-after-extra-small
        extra-small.noTrimWrap = | ||
        small = TEXT
        small.value = frame-space-after-small
        small.noTrimWrap = | ||
        medium = TEXT
        medium.value = frame-space-after-medium
        medium.noTrimWrap = | ||
        large = TEXT
        large.value = frame-space-after-large
        large.noTrimWrap = | ||
        extra-large = TEXT
        extra-large.value = frame-space-after-extra-large
        extra-large.noTrimWrap = | ||
        }
    
      stdWrap.insertData = 1
      stdWrap.trim = 1
    }

    containerAttributes.cObject = COA
    containerAttributes.cObject {
      10 = TEXT
      10 {
        data = register: containerClasses
        #noTrimWrap = | class="|"|
        noTrimWrap = | class="row |"|
      }
    }

    outerWrapContainerClasses.cObject = COA
    outerWrapContainerClasses.cObject {

      40 = CASE
      40 {        
        key.field = frame_class
        default = TEXT
        default.value = <div class="container">|</div>
        no-frame = TEXT
        default.value = <div class="container">|</div>
        wide = TEXT
        wide.value = 
        widebg = TEXT
        widebg.value = 
        }
    }

    innerWrapContainerClasses.cObject = COA
    innerWrapContainerClasses.cObject {

      10 = CASE
      10 {        
        key.field = frame_class
        default = TEXT
        default.value = 
        no-frame = TEXT
        default.value =
        wide = TEXT
        wide.value = 
        widebg = TEXT
        widebg.value = <div class="container">|</div>

        }
    }


  wrap = {register: innerWrapContainerClasses}
  wrap.insertData = 1

  wrap2 = <div{register: containerAttributes} wrap>| </div>
  wrap2.insertData = 1

  outerWrap = {register: outerWrapContainerClasses}
  outerWrap.insertData = 1

  columns.0 {

    preCObject = LOAD_REGISTER
    preCObject {
      contentColumnClass.cObject = COA
      contentColumnClass.cObject {
        10 = TEXT
        10 {
          field = flexform_width_column_xs_1
          noTrimWrap = || |
          required = 1
        }

        11 = TEXT
        11 {
          field = flexform_width_column_sm_1
          noTrimWrap = || |
          required = 1
        }

        12 = TEXT
        12 {
          field = flexform_width_column_md_1
          noTrimWrap = || |
          required = 1
        }

        13 = TEXT
        13 {
          field = flexform_width_column_lg_1
          noTrimWrap = || |
          required = 1
        }

        20 = TEXT
        20 {
          field = flexform_visibility_col1
          noTrimWrap = | ||
          split {
            token = ,
            cObjNum = 1
            1.current = 1
            1.noTrimWrap = | ||
          }
        }

        stdWrap.noTrimWrap = | class="|"|
      }
    }

    outerWrap = <div{register: contentColumnClass}> | </div>
    outerWrap.insertData = 1

    renderObj =< tt_content
  }

  columns.1 < .columns.0
  columns.1 {
    preCObject {
      contentColumnClass.cObject {
        10.field = flexform_width_column_xs_2
        11.field = flexform_width_column_sm_2
        12.field = flexform_width_column_md_2
        13.field = flexform_width_column_lg_2
        20.field = flexform_visibility_col2
      }
    }
  }
}

plugin.tx_gridelements_pi1.setup.uebb_bootstrap_3col < plugin.tx_gridelements_pi1.setup.uebb_bootstrap_2col
plugin.tx_gridelements_pi1.setup.uebb_bootstrap_3col {
  columns.2 < .columns.0
  columns.2 {
    preCObject {
      contentColumnClass.cObject {
        10.field = flexform_width_column_xs_3
        11.field = flexform_width_column_sm_3
        12.field = flexform_width_column_md_3
        13.field = flexform_width_column_lg_3
        20.field = flexform_visibility_col3
      }
    }
  }

}

plugin.tx_gridelements_pi1.setup.uebb_bootstrap_4col < plugin.tx_gridelements_pi1.setup.uebb_bootstrap_3col
plugin.tx_gridelements_pi1.setup.uebb_bootstrap_4col {
  columns.3 < .columns.0
  columns.3 {
    preCObject {
      contentColumnClass.cObject {
        10.field = flexform_width_column_xs_4
        11.field = flexform_width_column_sm_4
        12.field = flexform_width_column_md_4
        13.field = flexform_width_column_lg_4
        20.field = flexform_visibility_col4
      }
    }
  }
}

tt_content.gridelements_pi1.20.10.setup {
  uebb_bootstrap_2col < plugin.tx_gridelements_pi1.setup.uebb_bootstrap_2col
  uebb_bootstrap_3col < plugin.tx_gridelements_pi1.setup.uebb_bootstrap_3col
  uebb_bootstrap_4col < plugin.tx_gridelements_pi1.setup.uebb_bootstrap_4col
}

 

Umstellung einer Domain auf SSL / https in Typo3

Die Umstellung einer Domain auf SSL (also von http:// auf https:// ) ist normalerweise kein großes Problem. Ein paar Dinge gibt es doch zu beachten.

Gerade in einer Multi-Domain Installation von Typo3 müssen ein paar Dinge beachtet werden. Einige der Tipps, die man im Web so findet passen da nicht. Zum Beispiel werden oft .htaccess Snippets genannt die alle Domains innerhalb des Typo3 zum Beispiel von http:// auf https:// weiterleiten.

Zuallerst muss das SSL-Zertifikat bestellt und eingerichtet werden – nicht vergessen, den A-Record der Domain auf die neue IP zu mappen bei den DNS-Einstellungen.

In meinem Fall habe ich aber folgendes gebraucht:

  • Weiterleitung von http://domain.com auf https://www.domain.com
  • Weiterleitung von https://domain.com auf https://www.domain.com
  • Weiterleitung von http://www.domain.com auf https://www.domain.com

Anmerkung:

Gerade die Weiterleitung von non-www auf https://www. sollte aus SEO-Gründen nicht verkettet passieren (also keine Weiterleitung von http://domain.com nach http://www.domain.com und dann nach https://www.domain.com) sondern in einem Rutsch.

Folgender Code bewerkstelligt diese Anforderungen:

# Redirect von www zu https (non www wird via Typo3 weitergeleitet)
RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC]
RewriteRule ^(.*)$ https://www.domain.com/$1 [L,R=301]

 

Aber besser noch dieses Snippet: (danke an Gerald)

# Redirect von www und non-www zu https
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.mynode.at/$1 [R=301,L]

 

Zusätzliche Einstellungen für Typo3:

Damit das Ganze auch richtig funktioniert, müssen in Typo auch noch ein paar Einstellungen gemacht werden:

  1. Bei den Seiteneinstellungen muss unter „Behaviour“ das Protokoll der jeweiligen Seite auf https:// umgestellt werden.

    (Leider muss das für jede einzelne Seite gemacht werden – hier hilft es, in der List Ansicht mittels Plus-Symbol den Wert „Enforce Protocol“ in die Listansicht zu holen. So kann man wenigstens alle Seiten einer Ebene in einem Rutsch abarbeiten.)Typo3 SSL https Umstellung
  2. Bei den Seiteneinstellungen kann man unter „Resources“ auf der Startseite der Domain gleich unter Page TS Config folgendes eintragen:
    TCAdefaults.pages.url_scheme = 2

    Das sorgt dafür, dass neu angelegte Seiten gleich den Wert „https://“ als Protokoll bekommen.

  3. Im Typoscript Template folgendes eintragen:
    config.absRefPrefix = https://www.domain.com/
    config.baseURL >
    

    Sollten noch config.baseURL-Einträge vorhanden sein können diese mit absRefPrefix ersetzt werden (sofern Typo3 >= 6.2). Bei der Domain nun als Protokoll ebenso https:// einsetzen.

Das wars :-).

Neue Features von FLUID in Typo3 8 LTS (Typo3 8.7)

Mit FLUID kann man nun komplexe, verschachtelte und gruppierte  Abfragen durchführen, wie zum Beispiel:

<f:if condition="({variableOne} && {variableTwo}) || {variableThree} || {variableFour}">
// Done if both variable one and two evaluate to true,
// or if either variable three or four do.
</f:if>

Es gibt nun die Möglichkeit, bei IF-Abfragen auch elseif-Schleifen abzufragen:

<f:if condition="{variableOne}">
<f:then>Do this</f:then>
<f:else if="{variableTwo}">
Do this instead if variable two evals true
</f:else>
<f:else if="{variableThree}">
Or do this if variable three evals true
</f:else>
<f:else>
Or do this if nothing above is true
</f:else>
</f:if>

Neuer ViewHelper: f:or

Damit kann man verkettete Abfragen schnell durchführen – die erste Variable die nicht leer ist wird ausgegeben:

{variableOne -> f:or(alternative: variableTwo) -> f:or(alternative: variableThree)}

 

 

 

 

Typo3 8 LTS – Die Neuerungen

Typo3 8 LTS

Endlich – viele von uns haben schon auf die neue LTS Version von Typo3 gewartet – nun ist sie, 18 Monate nach der Typo3 7 LTS Version, erschienen. Und sie wartet mit ein paar wirklich tollen Neuerungen auf, hier die für mich persönlich wichtigsten Neuerungen:

  • Responsive Backend:
    Es wurde weiter an dem Responsive Design im Backend gearbeitet – und man kann sagen, dass dieses nun komplett umgesetzt wurde.
  • Performance:
    Die neue Typo3 8 LTS hat als Mindestanforderung PHP Version ab 7. Das hat zur Folge, dass das Typo3 Backend nun gefühlt sehr viel schneller ist. Fluid wurde komplett ausgelagert, was zudem zu einem schnelleren Backend führt.
  • Bildbearbeitung:
    Auch hier hat man einige neue Features integriert und vorhandenes optimiert. Es ist nun möglich, das Seitenverhältnis zu definieren, ausserdem für Tablet und Smartphone-Varianten des Bildes Fokusbereiche zu definieren. Fazit: Sehr praktisch!
  • Rich Text Editor: CKEditor integriert
    Der in die Jahre gekommene Editor HTMLArea wurde von CKEditor abgelöst – CKEditor ist sehr einfach zu integrieren und konfigurieren und hat ein paar tolle Features – unter anderem einen „Frontend-Editing“ – Modus, welcher in zukünftigen Versionen von Typo3 integriert werden soll.
  • FLUID
    Auch bei der Sprache FLUID hat sich einiges getan – so hat man FLUID nun aus dem Typo3 Core entkoppelt und es gibt einige neue Features.

Eine Liste von allen Neuerungen kann man hier finden oder bei dem PDF „What’s New Slides“ (111 Seiten).

Typo3 Update via SSH und Symlinks

Meistens muss ich, wenn ich ein Typo3 Update durchführe, die SSH Befehle dazu googeln, da ich sie nicht so oft brauche und mir aus diesem Grund auch nicht vollständig merke. Zeit, diese SSH Befehle hier niederzuschreiben :-).

Wie oft hab ich schon TYPO3 Updates gemacht und schaue jedes mal wieder die Befehle auf der Kommandozeile nach? Daher publiziere ich hier nichts Neues, aber Sinnvolles:

Erst einmal Grundlegende Befehle:

Auflistung eines Ordnerinhaltes:
ls
ls -l – Mit Details

Ordner:
cd ordnername – Wechseln in den Ordner „ordnername“
cd ordnername/subordner/noch/einer/ – Wechseln in bestimmten Unterordner
cd .. – Eine Ebene höher
cd / bzw. cd ~ – Wechseln das Home Verzeichnis

Holen der aktuellen Typo3-Version, z.B.:
wget get.typo3.org/8.6.0

Das heruntergeladene File (tar.gz) entpacken:
tar xvfz typo3_src-8.6.0.tar.gz

Wechseln zum richtigen Verzeichnis:
cd html/

Der alte Symlink muss entfernt werden:
rm typo3_src

Neuen Symlink setzen:
ln -s typo3_src-8.6.0/ typo3_src

Möglicherweise müssen folgende Symlinks ebenfalls noch gesetzt werden:
(Symlinks für typo3/ , t3lib/ und index.php)

ln -s typo3_src/index.php index.php
ln -s typo3_src/typo3 typo3
ln -s typo3_src/t3lib t3lib

Ist das erledigt, muss man in das Install-Tool von Typo3 und dort den Upgrade-Wizard ausführen.