3. Integration

3.1. Konfiguration einer Extension

Extensions können auf diverse Wege konfiguriert werden. Neben Flexforms sollte TypoScript einer der beliebtesten Wege sein. Dabei gibt es zwei Wege Plugins einer Extension zu konfigurieren.

3.1.1. Via plugin.tx_extname

Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
plugin {
    tx_exampleextension {
        persistence {
            storagePid = 2
        }
        settings {
            cdx {
                pageUids {
                    editPage = 1
                }
            }
        }
    }
}

Damit wird die gesamte Extension konfiguriert, inklusive aller Plugins.

Zur Konfiguration stehen durch Extbase bereits einige Standards des Frameworks. Darüber hinaus wird der Bereich settings 1:1 als PHP Array in den Controller und die Templates weitergegeben.

Extbase selbst gibt die Bereiche

persistence
Konfiguriert den Storage Folder und Mapping von Datenbank Tabellen und Feldern auf Klassen und Eigenschaften.
view
Konfiguriert Pfade der Templateengine Fluid, sowie den Namespace des Plugins bei URLs.
features
Aktiviert oder deaktiviert Features des Extbase Frameworks. In aller Regel wird nur die Option skipDefaultArguments verwendet.
mvc
Wird in aller Regel nicht verwendet.
_LOCAL_LANG

Kann genutzt werden um einzelne Labels der Lokalisierung anzupassen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
plugin.tx_exampleextension {
    _LOCAL_LANG {
        default {
            read_more = Read more »
        }
        de {
            read_more = Weiterlesen »
        }
    }
}

vor.

Weitere Informationen sind unter TypoScript Configuration der Anleitung „Developing TYPO3 Extensions with Extbase and Fluid“ dokumentiert.

3.1.2. Via plugin.tx_extname_plugin

Soll nur ein bestimmtes Plugin konfiguriert werden, so kann dieses durch die gesamte Plugin Signatur angesprochen werden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
plugin {
    tx_exampleextension_address {
        persistence {
            storagePid = 2
        }
        settings {
            cdx {
                pageUids {
                    editPage = 1
                }
            }
        }
    }
}

3.2. Konfiguration eines Inhaltselements

Inhaltselemente sind das Kernstück von TYPO3. Diese können beliebig angepasst, und erstellt werden. Dabei greifen diverse Einstellungen.

Die Konfiguration der Darstellung erfolgt in aller Regel via TypoScript. Die Konfiguration für das Backend erfolgt im TCA, innerhalb von Flexforms und via TSconfig.

3.2.1. Via TCA

TCA ist die Abkürzung für Table Configuration Array und beinhaltet die Konfiguration aller Datenbanktabellen die im TYPO3 bearbeitet werden sollen. Damit ist das TCA ein essentieller Bestandteil von TYPO3. Es wird zum einen für die Listenansicht, die Formulare im Backend und teilweise von Extbase verwendet.

Hinzu kommen einige Extensions die eigene Eigenschaften im TCA unterbringen und als Konfiguration auswerten.

Das TCA befindet sich innerhalb von Extensions an folgendem Ort:

example_extension
└── Configuration
    └── TCA
        ├── Overrides
        │   └── tt_content.php
        └── tx_exampleextension_domain_model_address.php

Dokumentiert ist das TCA in der TCA Reference.

3.2.2. Via Flexform

Flexforms erlauben das erweitern von TCA mittels XML. Die Flexforms werden in aller Regel in der Spalte pi_flexform der Tabelle tt_content gespeichert. Es können aber auch weitere Spalten und Tabellen verwendet werden. Grundsätzlich kommen Flexforms zum Einsatz wenn keine Datenbankabfragen auf die Daten erfolgen. Der Aufbau innerhalb des XML entspricht 1:1 dem TCA, lediglich in XML statt PHP Array Syntax.

Somit greift auch hier die Dokumentation der TCA Reference.

Damit eine Flexform angezeigt wird, muss die Spalte vom Typ flex sein. Die konkrete Konfiguration kann auch hier der TCA Dokumentation type = 'flex' nachgeschlagen werden.

3.2.3. Via TSconfig

TSconfig ist eine weitere Möglichkeit Formulare im Backend zu konfigurieren. Dabei stehen nicht alle Funktionen des TCA zur Verfügung. Dafür kann TSconfig aber auf Seiten- und Nutzerebene hinterlegt werden und bietet so eine flexible Anpassung an einzelne Situationen.

Ein weiterer Vorteil von TSconfig ist das bearbeiten von Optionen bei Dropdowns (Selects). Diese können im TCA meist nicht identifiziert werden, da diese oft ein numerisches Array sind. Innerhalb von TSconfig findet die Identifikation über die zu speichernden Werte statt und ist somit um ein vielfaches einfacher.

Zudem gibt es diverse Aspekte die nur per TSconfig anpassbar sind. So z.B. der Wizard zum erstellen eines neuen Inhaltselements.

TSconfig ist von der Syntax her an TypoScript angelegt und dient der Konfiguration des Backend auf Seiten- und Nutzerbasis.

Eine vollständige Referenz ist unter https://docs.typo3.org/typo3cms/TSconfigReference/Index.html zu finden.

Wie bei TypoScript auch, gibt es hier Conditions. Grundsätzlich ist TSconfig in User- und Page-TSconfig unterteilt.

PageTSconfig

Durch die Vererbung können hier einzelne Seitenbereiche im Backend angepasst werden. So z.B. die erlaubten Datensätze, Labels etc. Außerdem ist dies wichtig für ein sauberes Caching. Hier kann eingestellt werden welche Caches mit geleert werden sollen. So kann z.B. die Startseite bei neuen News geleert werden.

Wird in den Seiteneigenschaften hinterlegt. Kann zudem bei Benutzern hinterlegt werden.

Ein Beispiel von PageTSconfig:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
mod {
    wizards {
        newContentElement {
            wizardItems {
                common {
                    show := removeFromList(table)
                }
            }
        }
    }
}

TCEFORM {
    tt_content {
        CType {
            removeItems = table
        }
    }
}

PageTSconfig kann auch via PHP geladen werden:

1
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig('');

Sowohl innerhalb der AdditionalConfiguration.php der Installation, als auch innerhalb von ext_localconf.php einer Extension. Dabei greift dann die Ladereihenfolge der Extensions.

UserTSconfig

Kann nicht vom Nutzer selbst gesetzt werden, aber per Modul Backend users oder List.

Kann alle Werte aus PageTS gezielt überschreiben, siehe https://docs.typo3.org/typo3cms/TSconfigReference/UserTsconfig/Field/Index.html#relationship-to-values-set-in-page-tsconfig.

Kann einem Nutzer oder einer Nutzergruppe hinterlegt werden.

1
2
3
4
5
6
7
8
options {
    pageTree {
        showPageIdWithTitle = 1
        showDomainNameWithTitle = 1
        showPathAboveMounts = 1
        searchInAlias = 1
    }
}

UserTSconfig kann auch via PHP geladen werden:

1
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserTSConfig('');

Sowohl innerhalb der AdditionalConfiguration.php der Installation, als auch innerhalb von ext_localconf.php einer Extension. Dabei greift dann die Ladereihenfolge der Extensions.

3.3. Konfiguration von Extbase (optional)

3.3.1. Via config.tx_extbase (optional)

3.4. Rendering von Inhalten (optional)

3.4.1. Via cObject CONTENT und RECORD (optional)

3.4.2. Via Top Level tt_content (optional)

3.5. Rendering mittels Fluid

Fluid ist eine Template Engine, geschrieben in PHP. Die Engine selbst ist unabhängig von TYPO3 und kann somit auch in anderen PHP Projekten genutzt werden. Neben TYPO3 nutzt auch das Neos CMS und Flow Framework die Engine.

Innerhalb von TYPO3 wird Fluid meist in Kombination mit Extbase Plugins verwendet, oder als cObject FLUIDTEMPLATE innerhalb von TypoScript um Inhaltselemente oder eine Seite zu rendern.

Durch die hohe Flexibilität, und vergleichsweise einfache Anwendung, hat Fluid TypoScript in weiten Teilen überflüssig gemacht und verdrängt. Im Zusammenspiel beider Komponenten liegt ein Bestandteil der Flexibiltät von TYPO3.

3.5.1. Via cObject FLUIDTEMPLATE

FLUIDTEMPLATE ist eines der verfügbaren TypoScript Content Objects. Per PHP können auch weitere Content Objects bereitgestellt werden, dies nutzt z.B. die TYPO3 Extension solr.

Grundsätzlich muss angegeben werden wo das Template für das Rendering liegt. Dies kann entweder inline per Option template übergeben werden, oder als vollständiger Pfad per Option file. Meisten kommt jedoch nur der Name zum Einsatz, dieser als Option templateName wird dann in Kombination mit der Option templateRootPaths verwendet.

So liegen z.B. bei der TYPO3 Systemextension fluid_styled_content alle Templates der Inhaltselemente im Ordner Resources/Private/Templates. Die Konfiguration sieht wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Default configuration for content elements which are using FLUIDTEMPLATE directly
lib.contentElement >
lib.contentElement = FLUIDTEMPLATE
lib.contentElement {
    templateName = Default
    templateRootPaths {
        0 = EXT:fluid_styled_content/Resources/Private/Templates/
        10 = {$styles.templates.templateRootPath}
    }
    partialRootPaths {
        0 = EXT:fluid_styled_content/Resources/Private/Partials/
        10 = {$styles.templates.partialRootPath}
    }
    layoutRootPaths {
        0 = EXT:fluid_styled_content/Resources/Private/Layouts/
        10 = {$styles.templates.layoutRootPath}
    }
}

Die Konfiguration eines einzelnen Inhaltselements sieht danach wie folgt aus:

1
2
3
4
tt_content.html =< lib.contentElement
tt_content.html {
    templateName = Html
}

Ein Template alleine reicht nicht, das Template braucht auch Daten die gerendert werden sollen. Diese werden mittels Option variables übergeben:

1
2
3
4
5
6
7
page.10 {
    variables {
        mainMenu =< lib.mainMenu
        companyName = TEXT
        companyName.value = {$companyName}
    }
}

3.5.2. Verwendung der Konfiguration settings und variables (optional)

3.5.3. Verwendung von dataProcessing

Erst durch dataProcessing wird FLUIDTEMPLATE wirklich flexibel. Diese Option ermöglicht das aufbereiten von Daten, welche an das Template gesendet werden.

Ein Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
tt_content.image = FLUIDTEMPLATE
tt_content.image {
    templateName = Image

    dataProcessing {
        10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
        10 {
           references.fieldName = image
           references.table = tt_content
           sorting = description
           sorting.direction = descending
           as = myfiles
       }
    }
}

Dataprocessoren werden in der konfigurierten Reihenfolge ausgeführt. Dabei werden jeweils alle Variablen an die Prozessoren übergeben und im Anschluss alle zurück gegeben. Das Interface sieht wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
namespace TYPO3\CMS\Frontend\ContentObject;

interface DataProcessorInterface
{
    /**
     * @return array
     */
    public function process(
        ContentObjectRenderer $cObj,
        array $contentObjectConfiguration,
        array $processorConfiguration,
        array $processedData
    );
}

Dadurch können viele kleine Klassen implementiert werden, welche jeweils eine kleine Aufgabe übernehmen. Diese können im Anschluss durch den Integrator kombiniert werden. Ein Beispiel dafür:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
tt_content.menu_pages =< lib.contentElement
tt_content.menu_pages {
    templateName = MenuPages
    dataProcessing {
        10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
        10 {
            special = list
            special.value.field = pages
            dataProcessing {
                10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
                10 {
                    references.fieldName = media
                }
            }
        }
    }
}

3.6. Ausführen von PHP Code (optional)

3.6.1. Via userFunc (optional)

3.7. Caching (optional)

3.7.1. Konfiguration des Invalidierens mittels TSconfig (optional)

3.7.2. Konfiguration von Tags via TypoScript (optional)