Die SiteKit Registry ist ein zentraler Mechanismus, der automatisch steuert, welche Content-Elemente (CTypes) in welchen Bereichen des TYPO3-Backends platziert werden dürfen.
Ohne SiteKit Registry müssten erlaubte CTypes an mehreren Stellen manuell gepflegt werden:
allowed-Listen der BackendLayout-page.tsconfig-DateienMit SiteKit Registry reicht es, pro Extension eine YAML-Datei zu pflegen. Alle Platzierungsregeln werden automatisch daraus abgeleitet.
Jede Extension deklariert in einer YAML-Datei, welchen Gruppen ihre CTypes
angehören.
Die Registry (SiteKitRegistry.php) liest beim ersten Zugriff alle aktiven
Packages durch
und aggregiert diese Deklarationen. Das Ergebnis wird für einen PHP-Request
gecacht.
Es gibt zwei Deklarationswege:
| Datei | Für |
|---|---|
Configuration/SiteKit.yaml | Klassische Extensions, dritte Packages, Overrides |
ContentBlocks/{Category}/{Name}/SiteKit.yaml | ContentBlocks (portabel, alles in einem Ordner) |
Extension A: Configuration/SiteKit.yaml ─┐
Extension B: ContentBlocks/*/SiteKit.yaml ─┤─→ SiteKitRegistry ─→ Erlaubte CTypes
Sitepackage: ContentBlocks/*/SiteKit.yaml ─┘ (gecacht) je Bereich
Configuration/SiteKit.yaml (overrides)
Zwei Verwendungsstellen greifen auf die Registry zu:
page.tsconfig): Über den Marker __SITEKIT:gruppe__,
der zur Laufzeit
durch einen EventListener aufgelöst wird.SiteKitRegistry::getCTypesForGroups([...]).| Gruppe | Verwendung |
|---|---|
group_hero | Hero-Bereich (colPos 3) — typischerweise nur großformatige Elemente |
group_content_wide | Hauptspalte voller Breite — Standard-Inhaltselemente |
group_content_small | Schmale Spalten in Mehrspaltern (≤ col-6) |
group_cards | Nur in Card-Group- und Card-Grid-Containern |
group_advanced | Nur im BackendLayout "Advanced" — Wrapper-Container |
Ein CType kann in mehreren Gruppen gleichzeitig registriert sein.
Die Datei liegt unter Configuration/SiteKit.yaml im Root einer Extension.
elements:
- ctype: mein_celement
groups: [ group_content_wide, group_content_small ]
grid: { minCols: 4, requiresFullWidth: false }
- ctype: mein_hero_element
groups: [ group_hero ]
grid: { minCols: 12, requiresFullWidth: true }
| Feld | Pflicht | Beschreibung |
|---|---|---|
ctype | ja | Der CType-Identifier (exakt wie in der Datenbank) |
groups | ja | Liste der Gruppen (YAML-Array) |
grid.minCols | nein | Minimale Bootstrap-Spaltenanzahl (1–12) — nur dokumentarisch |
grid.requiresFullWidth | nein | true bei voller Containerbreite — nur dokumentarisch |
Hinweis:
grid-Felder werden aktuell nicht ausgewertet. Sie dienen als Dokumentation und können in zukünftigen Versionen genutzt werden.
ContentBlocks können ihre eigene SiteKit.yaml **direkt im ContentBlock-Ordner
** ablegen.
Das ist der empfohlene Weg für ContentBlocks, da alles in einem Ordner bleibt
und der
ContentBlock dadurch zwischen Projekten portierbar wird.
ContentBlocks/
ContentElements/
MeinElement/
config.yaml ← ContentBlock-Konfiguration (name: vendor/mein-element)
EditorInterface.yaml
templates/
SiteKit.yaml ← SiteKit-Deklaration (kein ctype nötig!)
Das Format ist vereinfacht — ctype entfällt, da er aus config.yaml
abgeleitet wird:
# ContentBlocks/ContentElements/MeinElement/SiteKit.yaml
groups: [ group_content_wide, group_content_small ]
grid: { minCols: 4, requiresFullWidth: false }
Der CType wird aus dem name-Feld in config.yaml abgeleitet:
config.yaml name | CType |
|---|---|
oliver-thiele/price-card | oliverthiele_pricecard |
oliver-thiele/alert | oliverthiele_alert |
myprojekt/teaser | myprojekt_teaser |
Regel: Bindestriche entfernen, Schrägstrich durch Unterstrich ersetzen, alles Kleinbuchstaben.
Da die SiteKit.yaml im ContentBlock-Ordner liegt, kann der gesamte Ordner in
ein anderes
SiteKit-Projekt kopiert werden und die Platzierungsregeln funktionieren sofort —
ohne
manuelle Konfiguration in einer zentralen Datei.
In der package-level Configuration/SiteKit.yaml (typischerweise im
Sitepackage) können
Gruppen-Zuweisungen aus beliebigen Extensions überschrieben werden.
Anwendungsfälle:
group_hero, aber in diesem Projekt
soll
etwas anderes in den Hero-Bereich.# packages/ot-sitepackage/Configuration/SiteKit.yaml
elements:
# Dritte Extensions ohne eigene SiteKit.yaml hier eintragen:
- ctype: tx_news_pi1
groups: [ group_content_wide ]
grid: { minCols: 6, requiresFullWidth: false }
overrides:
# ot_heroimage aus dem Hero-Bereich entfernen (eigenes Hero-Element wird verwendet):
- ctype: ot_heroimage
removeFromGroups: [ group_hero ]
# ot_ceheader zusätzlich in Cards erlauben, aus Hero entfernen:
- ctype: ot_ceheader
addToGroups: [ group_cards ]
removeFromGroups: [ group_hero ]
| Feld | Beschreibung |
|---|---|
ctype | Der CType, der überschrieben werden soll |
removeFromGroups | Liste der Gruppen, aus denen der CType entfernt wird |
addToGroups | Liste der Gruppen, zu denen der CType hinzugefügt wird |
* bei removeFromGroupsUm einen CType aus allen Gruppen zu entfernen, ohne jede Gruppe einzeln
aufzulisten, kann '*' als Wildcard verwendet werden:
overrides:
- ctype: textmedia
removeFromGroups: ['*']
Hinweis: Die Anführungszeichen sind zwingend erforderlich, da
*in YAML ein reserviertes Zeichen für Anker-Referenzen ist und ohne Quotes einen Parse-Fehler verursacht.
Das ist nützlich, wenn ein CType (z. B. ein Standard-TYPO3-Element) im Projekt komplett deaktiviert werden soll.
Overrides werden nach allen elements- und ContentBlock-Deklarationen
verarbeitet
(Zwei-Pass-Verfahren), sodass sie immer gewinnen — unabhängig davon, welches
Package
zuerst geladen wird.
TYPO3 Bootstrap
│
├─ TCA-Phase (früh)
│ └─ Configuration/TCA/Container/*.php wird eingelesen
│ └─ GeneralUtility::makeInstance(SiteKitRegistry::class)
│ │
│ ├─ Pass 1: Für jedes aktive Package:
│ │ ├─ liest Configuration/SiteKit.yaml (elements + overrides sammeln)
│ │ └─ scannt ContentBlocks/**/SiteKit.yaml (rekursiv)
│ │ └─ liest config.yaml → leitet CType ab
│ │
│ ├─ Pass 2: Alle gesammelten overrides anwenden
│ │
│ └─ setzt static $cache
│
└─ TSconfig-Phase (pro Seiten-Request)
└─ ModifyLoadedPageTsConfigEvent feuert
└─ SiteKitPageTsConfigListener::__invoke()
└─ sucht __SITEKIT:...__-Marker per Regex
└─ ruft SiteKitRegistry::getCTypesForGroups() auf
└─ nutzt static $cache (kein erneutes Einlesen)
└─ ersetzt Marker durch kommagetrennte CType-Liste
In den page.tsconfig-Dateien der BackendLayouts wird die Marker-Syntax
verwendet:
allowed {
CType = __SITEKIT:group_hero__
}
Gruppen und direkte CTypes können kombiniert werden:
allowed {
CType = __SITEKIT:group_content_wide,my_special_ctype__
}
Wichtig: Der Marker __SITEKIT:...__ (doppelter Unterstrich) wurde bewusst
gewählt.
Das #-Zeichen gilt in TypoScript als Kommentarzeichen — ###SITEKIT:### würde
den
Wert als Kommentar interpretieren und alle CTypes blockieren.
| BackendLayout | Hero-Bereich (colPos 3) | Main-Spalte (colPos 0) |
|---|---|---|
| Default | __SITEKIT:group_hero__ | __SITEKIT:group_content_wide__ |
| Homepage | __SITEKIT:group_hero__ | __SITEKIT:group_content_wide__ |
| SmallContent | __SITEKIT:group_hero__ | __SITEKIT:group_content_wide__ |
| Advanced | __SITEKIT:group_hero__ | __SITEKIT:group_advanced__ |
Eigene b13/container-Elemente können die Registry direkt per PHP nutzen:
use OliverThiele\OtSitekitbase\SiteKit\SiteKitRegistry;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$registry = GeneralUtility::makeInstance(SiteKitRegistry::class);
$cTypesSmall = $registry->getCTypesForGroups(['group_content_small']);
$cTypesWide = $registry->getCTypesForGroups(['group_content_wide']);
$cTypesCards = $registry->getCTypesForGroups(['group_cards']);
getCTypesForGroups() gibt eine kommagetrennte, deduplizierte Zeichenkette
zurück —
direkt verwendbar im allowed['CType']-Feld der Container-Konfiguration.
Nach jeder Änderung an einer SiteKit.yaml den TYPO3-Cache leeren:
vendor/bin/typo3 cache:flush
use OliverThiele\OtSitekitbase\SiteKit\SiteKitRegistry;
use TYPO3\CMS\Core\Utility\GeneralUtility;
$registry = GeneralUtility::makeInstance(SiteKitRegistry::class);
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
$registry->getGroupToCTypeMap()
);
| Problem | Ursache | Lösung |
|---|---|---|
| CType erscheint nicht im Backend | SiteKit.yaml nicht gefunden | Symlink prüfen: ls -la vendor/oliverthiele/ |
| CType erscheint nicht nach Änderung | Statischer Cache noch aktiv | TYPO3-Cache leeren |
| Alle CTypes fehlen in einem Bereich | Marker-Syntax falsch | Marker muss __SITEKIT:gruppe__ lauten |
| Lokale Änderungen haben keine Wirkung | vendor/ ist kein Symlink | Canonical Path-Repository in composer.json |
| ContentBlock CType fehlt | Falsche CType-Ableitung | Bindestriche werden entfernt, nicht zu _ |
| Override hat keine Wirkung | ctype im Override falsch geschrieben | Exakten CType per getGroupToCTypeMap() prüfen |
| Extension | CType(s) | Gruppen |
|---|---|---|
ot-sitekit-base | Standard-TYPO3 CTypes, Container | je nach Element |
ot-heroimage | ot_heroimage | group_hero |
ot-sitekit-ce-card | ot_sitekitcecard | group_content_wide,group_content_small, group_cards |
ot-sitekit-ce-textmedia | ot_sitekitcetextmedia | group_content_wide, group_content_small |
ot-sitekit-ce-texticon | ot_sitekitcetexticon | group_content_wide, group_content_small, group_cards |
ot-sitekit-ce-imgtextoverlay | ot_sitekitceimgtextoverlay | group_content_wide |
ot-markdown | ot_markdown | group_content_wide |
ot-cefluidtemplates | ot_cefluidtemplates | group_content_wide |
ot-faq | otfaq_list | group_content_wide |
ot-jobs | otjobs_list, otjobs_show | group_content_wide |
ot-ceheader | ot_ceheader | group_content_wide, group_content_small, group_hero |
| Sitepackage ContentBlocks | via ContentBlock SiteKit.yaml | je nach ContentBlock |
| Datei | Beschreibung |
|---|---|
packages/ot-sitekit-base/Classes/SiteKit/SiteKitRegistry.php | Registry-Klasse |
packages/ot-sitekit-base/Classes/SiteKit/EventListener/SiteKitPageTsConfigListener.php | EventListener für TSconfig-Marker |
packages/ot-sitekit-base/Configuration/SiteKit.yaml | Gruppen-Deklarationen für ot-sitekit-base |
packages/ot-sitekit-base/Configuration/TCA/Container/Columns.php | Mehrspaltige Container |
packages/ot-sitekit-base/Configuration/TCA/Container/CardGroup.php | Card-Container |
packages/ot-sitepackage/Configuration/SiteKit.yaml | Overrides und dritte Extensions |
packages/ot-sitepackage/ContentBlocks/{Category}/{Name}/SiteKit.yaml | ContentBlock-Deklarationen |
packages/*/Configuration/SiteKit.yaml | Gruppen-Deklarationen je Extension |