
Site-Sets (TYPO3 13.4+)
| Set | Zweck |
|---|---|
mpc/mp-core (Aggregator) | Bindet alle darunter liegenden Feature-Sets in einem Include ein |
mpc/mp-core-base (erforderlich) | Kernfunktionalität, Vorlagen, Basis-Styling, gemeinsame Einstellungen |
mpc/mp-core-container | Container-Elemente (Akkordeon, Registerkarten, Schieberegler, Raster) |
mpc/mp-core-news | Integration der News-Erweiterung |
mpc/mp-core-form | Konfiguration des Formular-Frameworks |
mpc/mp-core-seo | SEO (Open Graph, Twitter Cards, Schema.org, Sitemap) |
mpc/mp-core ist ein Aggregator, der auf mpc/mp-core-base sowie auf alle Funktionsumfänge. Es reicht aus, nur mpc/mp-core in Ihre Website einzubinden. Wenn Sie eine fein abgestimmte Steuerung benötigen, fügen Sie mpc/mp-core-base und wählen Sie einzelne Funktionssätze aus.
Rollen festlegen
| Rolle festlegen | Rolle |
|---|---|
mpc/mp-core | Aggregator + gemeinsame Website-Einstellungen (settings.yaml, settings.definitions.yaml in diesem Ordner) |
mpc/mp-core-base | Lädt TYPO3-Systemerweiterungen ein; registriert die oben genannten Pfade für gemeinsame Einstellungen; optionale Integrationen, sofern vorhanden |
mpc/mp-core-* (Feature) | Feature-spezifisches TypoScript und Einstellungen; jeweils abhängig von mpc/mp-core-base nur |
Wichtig: Beim Erstellen eines benutzerdefinierten Site-Sets muss
dependencies: [mpc/mp-core-base, …]— niemalsmpc/mp-core. Das Abhängigmachen vom Aggregator eines untergeordneten Sets führt zu einem Rekursions-Deadlock im SetRegistry.
mpc/mp-core-base Abhängigkeiten
Erforderlich: typo3/form, typo3/redirects, typo3/indexed-search
Optional (wird bei Installation verwendet): georgringer/news-recordlinks, georgringer/news-sitemap, mpc/mpc-vidply, mpc/mpc-rss
Aktivieren von Sets
Backend: Site-Verwaltung -> Sites -> Registerkarte „Sets“ -> Sets aktivieren und anordnen.
YAML (config/sites/[site]/config.yaml):
base: 'https://example.com'
rootPageId: 1
dependencies:
- mpc/mp-core
Oder einzelne Sets gezielt auswählen:
dependencies:
- mpc/mp-core-base
- mpc/mp-core-container
- mpc/mp-core-seo
Website-Einstellungen
Bearbeitbar über Website-Verwaltung → Websites → Einstellungen oder config/sites/[site]/settings.yaml.
Nach Änderungen neu generieren settings.definitions.yaml / settings.yaml:
node Documentation/scripts/sync-site-settings.mjs
Kern (gemeinsam genutzt — mpc/mp-core / registriert über mpc/mp-core-base)
Definitionen und Standardwerte der Website-Einstellungen befinden sich in Configuration/Sets/mp-core/settings.definitions.yaml und settings.yaml. Der Basissatz verweist lediglich auf diese Dateien.
Quelle: Configuration/Sets/mp-core/
Schema-Standard —
defaultinsettings.definitions.yaml(Benutzeroberfläche „Site-Einstellungen“). Ausgelieferter Standardwert – Wert aussettings.yamlwenn es das Schema überschreibt (Spalte—= wie im Schema).
PIDs
| Schlüssel | Typ | Standardwert |
|---|---|---|
PIDs.pidSearch | int | 0 |
PIDs.pidHome | int | 1 |
PIDs.pidMetaNavTop | int | 66 |
PIDs.pidMetaNavFooter | int | 25 |
PIDs.pidMainNavMeta | int | 25 |
PIDs.pidCategories | int | 251 |
PIDs.pidLogosBannerTop | int | 391 |
PIDs.pidSupplement | int | 24 |
PIDs.pidWebFonts | int | 0 |
Konfiguration
| Schlüssel | Typ | Standard |
|---|---|---|
config.admPanel | bool | false |
config.debug | bool | false |
config.noCache | bool | false |
config.removeDefaultJS | Zeichenkette | external |
config.spamProtectEmailAddresses | bool | true |
config.spamProtectEmailAddresses_atSubst | Zeichenkette | [at] |
config.absRefPrefix | Zeichenkette | auto |
config.headerComment | Zeichenkette | (leer) |
Leistung
| Schlüssel | Typ | Standardwert |
|---|---|---|
performance.compressJs | bool | false |
performance.compressCss | bool | false |
performance.concatenateJs | bool | false |
performance.concatenateCss | bool | false |
performance.enableLazyLoading | bool | true |
Navigation
| Schlüssel | Typ | Schema-Standard | Auslieferungsstandard |
|---|---|---|---|
navigation.maxDepth | int | 5 | 3 |
navigation.showHiddenPages | bool | false | — |
navigation.enableBreadcrumb | bool | true | — |
Suche
| Schlüssel | Typ | Standardwert |
|---|---|---|
search.headerSearch | bool | true |
search.autosuggest | bool | true |
Meta
| Schlüssel | Typ | Schema-Standardwert | Auslieferungsstandard |
|---|---|---|---|
meta.viewport | Zeichenkette | width=device-width, initial-scale=1 | — |
meta.robots | Zeichenkette | index,follow | — |
meta.appleMobileWebAppCapable | Zeichenkette | no | — |
meta.compatible | Zeichenkette | IE=edge | — |
meta.google | Zeichenkette | notranslate | — |
meta.googleSiteVerification | Zeichenkette | (leer) | zPXbpegj_B5wbUDB7aXteJbnbT0IPiTDgsP53on-gRA |
Vorlagen & Pfade
| Schlüssel | Typ | Standard |
|---|---|---|
basePath | Zeichenkette | EXT:mp_core |
pageTemplates | Zeichenkette | EXT:mp_core/Resources/Private/Templates/Page/ |
pagePartials | Zeichenkette | EXT:mp_core/Resources/Private/Partials/Page/ |
pageLayouts | Zeichenkette | EXT:mp_core/Resources/Private/Layouts/Page/ |
pageFaviconsFile | Zeichenkette | EXT:mp_core/Resources/Private/Partials/Page/Favicons.html |
contentElementTemplates | Zeichenkette | EXT:mp_core/Resources/Extensions/fluid_styled_content/Private/Templates/ |
contentElementPartials | Zeichenkette | EXT:mp_core/Resources/Extensions/fluid_styled_content/Private/Partials/ |
contentElementLayouts | Zeichenkette | EXT:mp_core/Resources/Extensions/fluid_styled_content/Private/Layouts/ |
containerElementTemplates | Zeichenkette | EXT:mp_core/Resources/Private/Templates/Container/ |
containerElementPartials | Zeichenkette | EXT:mp_core/Resources/Private/Partials/Container/ |
containerElementLayouts | Zeichenkette | EXT:mp_core/Resources/Private/Layouts/Container/ |
pluginsNewsTemplates | Zeichenkette | EXT:mp_core/Resources/Extensions/news/Templates/ |
pluginsNewsPartials | Zeichenkette | EXT:mp_core/Resources/Extensions/news/Partials/ |
pluginsNewsLayouts | Zeichenkette | EXT:mp_core/Resources/Extensions/news/Layouts/ |
pluginsIndexedSearchTemplates | Zeichenkette | EXT:mp_core/Resources/Extensions/indexed_search/Templates/ |
pluginsIndexedSearchPartials | Zeichenkette | EXT:mp_core/Resources/Extensions/indexed_search/Partials/ |
pluginsIndexedSearchLayouts | Zeichenkette | EXT:mp_core/Resources/Extensions/indexed_search/Layouts/ |
contentTypesTemplates | Zeichenkette | EXT:mp_core/Resources/Private/Templates/Content/ |
contentTypesGalleryTemplates | Zeichenkette | EXT:mp_core/Resources/Private/Templates/Content/ |
resourcesPrivate | Zeichenkette | EXT:mp_core/Resources/Private |
resourcesExtensions | Zeichenkette | EXT:mp_core/Resources/Extensions |
structuredDataEnabled | bool | true |
structuredData.extraEntity.type | Zeichenkette | none |
structuredData.extraEntity.name | Zeichenkette | (leer) |
structuredData.extraEntity.description | Zeichenkette | (leer) |
structuredData.extraEntity.keywords | Zeichenkette | (leer) |
Container (mpc/mp-core-container)
Quelle: Configuration/Sets/mp-core-container/
| Schlüssel | Typ | Standardwert |
|---|---|---|
container.grid.enabled | bool | true |
container.grid.defaultColumns | int | 2 |
container.grid.maxColumns | int | 4 |
container.grid.gutterSize | Zeichenkette | 20px |
container.accordion.enabled | bool | true |
container.accordion.allowMultiple | bool | false |
container.accordion.firstOpen | bool | true |
container.tabs.enabled | bool | true |
container.tabs.position | Zeichenkette | top |
container.wrapper.maxWidth | Zeichenkette | 1200px |
container.wrapper.padding | Zeichenkette | 15px |
Nachrichten (mpc/mp-core-news)
Quelle: Configuration/Sets/mp-core-news/
| Schlüssel | Typ | Standard |
|---|---|---|
news.list.paginate.itemsPerPage | int | 10 |
news.list.orderBy | Zeichenkette | datetime |
news.list.orderDirection | Zeichenkette | desc |
news.list.dateFormat | Zeichenkette | d.m.Y |
news.list.showCategories | bool | true |
news.list.showTags | bool | true |
news.detail.showBackLink | bool | true |
news.detail.showRelated | bool | true |
news.detail.relatedLimit | int | 3 |
news.detail.enableComments | bool | false |
news.media.maxWidth | int | 1200 |
news.media.maxHeight | int | 800 |
Formular (mpc/mp-core-form)
Quelle: Configuration/Sets/mp-core-form/
| Schlüssel | Typ | Standardwert |
|---|---|---|
form.honeypot.enabled | bool | true |
form.confirmationPage.enabled | bool | true |
form.requiredFieldMarker | Zeichenkette | * |
form.email.senderName | Zeichenkette | Website Contact Form |
form.email.senderEmail | Zeichenkette | noreply@example.com |
form.email.replyToEmail | Zeichenkette | info@example.com |
form.validation.clientSide | bool | true |
form.validation.showInlineErrors | bool | true |
form.storage.saveToDatabase | bool | false |
form.storage.uploadFolder | Zeichenkette | 1:/forms/ |
SEO (mpc/mp-core-seo)
Quelle: Configuration/Sets/mp-core-seo/
| Schlüssel | Typ | Standard |
|---|---|---|
seo.meta.defaultDescription | Zeichenkette | (leer) |
seo.meta.generateDescriptions | bool | true |
seo.meta.maxDescriptionLength | int | 160 |
seo.meta.maxTitleLength | int | 60 |
seo.meta.titleSeparator | Zeichenkette | | |
seo.openGraph.enabled | bool | true |
seo.openGraph.defaultImage | Zeichenkette | (leer) |
seo.openGraph.imageWidth | int | 1200 |
seo.openGraph.imageHeight | int | 630 |
seo.twitter.enabled | bool | true |
seo.twitter.cardType | Zeichenkette | summary_large_image |
seo.twitter.site | Zeichenkette | (leer) |
seo.sitemap.enabled | bool | true |
seo.sitemap.excludeHiddenPages | bool | true |
seo.sitemap.priority | Zeichenkette | 0.5 |
seo.canonical.enabled | bool | true |
seo.schema.enabled | bool | true |
seo.schema.organizationType | Zeichenkette | Organization |
seo.schema.legalName | Zeichenkette | (leer) |
seo.schema.alternateName | Zeichenkette | (leer) |
seo.schema.description | Zeichenkette | (leer) |
seo.schema.foundingDate | Zeichenkette | (leer) |
seo.schema.vatId | Zeichenkette | (leer) |
seo.schema.taxId | Zeichenkette | (leer) |
seo.schema.knowsAbout | Zeichenkette | (leer) |
seo.schema.person.jobTitle | Zeichenkette | (leer) |
seo.schema.email | Zeichenkette | (leer) |
seo.schema.telephone | Zeichenkette | (leer) |
seo.schema.contactPoint.contactType | Zeichenkette | customer service |
seo.schema.contactPoint.telephone | Zeichenkette | (leer) |
seo.schema.contactPoint.email | Zeichenkette | (leer) |
seo.schema.contactPoint.areaServed | Zeichenkette | (leer) |
seo.schema.contactPoint.availableLanguage | Zeichenkette | (leer) |
seo.schema.address.streetAddress | Zeichenkette | (leer) |
seo.schema.address.addressLocality | Zeichenkette | (leer) |
seo.schema.address.postalCode | Zeichenkette | (leer) |
seo.schema.address.addressRegion | Zeichenkette | (leer) |
seo.schema.address.addressCountry | Zeichenkette | (leer) |
seo.robots.enabled | bool | true |
seo.robots.allowAiBots | bool | true |
seo.robots.crawlDelay | int | 0 |
seo.robots.additional | Zeichenkette | (leer) |
seo.llmsTxt.enabled | bool | true |
seo.llmsTxt.intro | text | (leer) |
seo.llmsTxt.news.storagePid | Zeichenkette | (leer) |
seo.llmsTxt.news.detailPageId | int | 0 |
seo.llmsTxt.news.limit | int | 5 |
Verwendung von Einstellungen in TypoScript
Website-Einstellungen werden als einfache TypoScript-Konstanten unter ihrem gepunkteten Schlüssel (ohne settings. Präfix), z. B. {$navigation.maxDepth}, {$config.admPanel}, {$PIDs.pidWebFonts}. Die Pfadeinstellungen (pageTemplates, basePath, …) werden zusätzlich mit einem settings. Präfix bereitgestellt, weshalb die mpcSitepackage.* Pfadkonstanten auf {$settings.pageTemplates}.
Für Werte, die zur Renderzeit aufgelöst werden müssen (z. B. innerhalb config, page.metaoder in DataProcessor-Eigenschaften) lesen Sie diese direkt über den site:settings.* Daten-Getter statt über eine Konstante:
# Flat constant (resolved at TypoScript parse time)
page.10.dataProcessing.110.levels = {$navigation.maxDepth}
# Runtime getter (preferred for config / meta / processor stdWrap)
config.compressJs.data = site:settings.performance.compressJs // {$config.compressJs}
page.meta.robots.data = site:settings.meta.robots
Schriftdesign-Tokens werden nicht über TypoScript verwendet: Sie werden aus den Web-Font-Datensätzen (siehe Web-Fonts) generiert WebFontProcessor und als benutzerdefinierte CSS-Eigenschaften in Resources/Private/Partials/Page/Styles.html.
Web Fonts
Redakteure können benutzerdefinierte Schriftarten selbst hosten (in den Dateimanager hochgeladen oder daraus ausgewählt), anstatt auf Systemschriftarten zurückzugreifen. Diese Funktion ersetzt die bisherigen design.fonts.* Zeichenfolgen-Einstellungen.
Datenmodell
| Datensatz | Tabelle | Zweck |
|---|---|---|
| Web-Schriftfamilie | tx_mpcore_domain_model_webfontfamily | Eine CSS- font-family (Name + Fallback-Stack), zugewiesen zu einer Ziel-CSS-Variablen |
| Schriftart | tx_mpcore_domain_model_webfontface | Eine hochgeladene Schriftdatei pro Strichstärke/Stil (Inline-Element einer Familie) |
Das Feld „Gilt für“ einer Familie ordnet diese einer benutzerdefinierten CSS-Eigenschaft zu:
| Rolle | CSS-Variable |
|---|---|
| Fließtext | --bs-body-font-family |
| Überschriften | --bs-font-sans-serif |
| Benutzerdefinierte CSS-Variable | Der --… Name, der im Familieneintrag eingegeben wurde |
Editor-Workflow
- Erstellen Sie einen Systemordner zur Speicherung der Datensätze und legen Sie dessen Seiten-ID in der
PIDs.pidWebFontsWebsite-Einstellung fest. Belassen Sie die Einstellung auf0, um die Datensätze auf der Stammseite der Website zu speichern. - Erstellen Sie im Listenmodul dieses Ordners eine Web-Schriftfamilie: Geben Sie die Schriftfamilie ein
name(z. B.Inter), einenfallbackStapel (z. B.sans-serif) ein und wählen Sie „Gilt für“ aus. - Fügen Sie pro Schriftstärke/Schriftart eine Schriftart hinzu. Laden Sie eine
woff2Datei über den Dateimanager aus und legen Sie deren Stärke (100–900) und Stil (normal/kursiv) fest. - Leeren Sie den Frontend-Cache.
WebFontProcessorgeneriert die@font-faceRegeln und die:rootVariablenzuordnung in den mit einem Nonce versehenen Inline-Block<style>Block in der Seiten-<head>.
Rendering-Pipeline
Webfont records (FAL files)
-> WebFontProcessor (page.headerData.2040.dataProcessing.20)
-> WebFontCssBuilder (validate + sanitize, build @font-face + :root CSS)
-> {webFontsCss} in Styles.html
-> <f:asset.css useNonce="1"> + mpc:format.cssSanitize
Alle Werte werden anhand fester Zulassungslisten in WebFontCssBuilder (Gewichtung, Stil, font-display, Dateiformat, benutzerdefinierter Variablenname, unicode-range) überprüft, und der Familienname, der Fallback sowie die URL werden von allen Zeichen bereinigt, die aus der CSS-Deklaration herausfallen könnten, sodass ein vom Angreifer bereitgestellter Wert niemals aus dem Inline- <style> Block entkommen.
Einschränkungen
- CSP: Selbst gehostete Schriftarten in
fileadminsind „Same-Origin“ und bereits durchfont-src 'self'inConfiguration/ContentSecurityPolicies.php. Um Schriftarten von einer anderen Domain bereitzustellen, muss diese Herkunftfont-srcüber eine site-spezifischeconfig/sites/<id>/csp.yaml. - Backend-Berechtigungen: Administratoren können die Einträge sofort bearbeiten. Backend-Gruppen ohne Administratorrechte benötigen
tables_modify(undtables_select) fürtx_mpcore_domain_model_webfontfamilyundtx_mpcore_domain_model_webfontface. - Eine Familie wird nur ausgegeben, wenn sie mindestens ein Gesicht mit einer auflösbaren Schriftartdatei enthält; andernfalls wird das
:rootZuordnung wird übersprungen (der Familienname allein würde nichts laden).
Website-Konfiguration (config.yaml)
Über die Website-Einstellungen hinaus erweitert mp-core den Website-Datensatz und die Website-Sprache um Configuration/SiteConfiguration/Overrides/sites.php. Konfigurieren Sie diese unter „Site-Verwaltung“ → „Sites“ → [Site] → „Konfiguration“ (oder unter config/sites/[site]/config.yaml).
| Bereich | (Beispiele) | Hinweise |
|---|---|---|
| Anpassung | navType, subnav, subnavOrder, search, copyrightText | navType: 1 primär, 2 sekundär, 3 tertiär |
| Favicons | favicon-96x96-png, faviconIco, faviconSvg, apple-touch-icon, webmanifest, … | Dateiverknüpfungen → Resources/Private/Partials/Page/Favicons.html (Favicons & Web-App-Manifest) |
| Farben & Stile | color-toggle, color-1…color-8, color-primary, styles | styles fügt benutzerdefiniertes :root CSS ein; lässt sich mit ColorPickerValueItems in TCA |
| Soziale Medien | socialMediaSwitch, Felder für Plattform-URLs | werden in SocialMediaProcessor / strukturierte Daten |
| Logos | logoBig, logoSmall, logoSvg, logoText, logoTextHidden | Sprachbezogene Überschreibungen für die Sprachen der Website; gelöst durch HeaderLogoProcessor |
| Strukturierte-Daten-Entität | extraEntityImage | FAL-Dateiverweis für optionale zusätzliche Schema.org-Entität (StructuredDataProcessor); Typ/Name/Schlüsselwörter in den Website-Einstellungen |
Sprachspezifische Paletten: copyrightText, Logo-Felder und logoText / logoTextHidden können je nach Sprache der Website variieren.
TypoScript-Struktur
Configuration/
├── ContentSecurityPolicies.php # Frontend CSP mutations auto-applied when
│ # the `security.frontend.*ContentSecurityPolicy`
│ # feature toggle is on (see "Content Security
│ # Policy" below)
├── Services.yaml # PSR-4 autowiring for `Mpc\MpCore\*`; explicit
│ # `public: true` for DataProcessors and the
│ # `ColorPickerValueItems` itemsProcFunc; optional
│ # `Services.local.yaml` import (see below)
├── Services.local.yaml # (optional, gitignored) local-only DI overrides
├── Sets/
│ ├── mp-core/
│ │ ├── config.yaml # Aggregator (depends on all feature sets)
│ │ ├── settings.yaml # Shared Site Settings defaults
│ │ ├── settings.definitions.yaml # Shared Site Settings schema
│ │ ├── constants.typoscript, setup.typoscript, page.tsconfig
│ ├── mp-core-base/
│ │ └── config.yaml # System deps + pointers to mp-core settings
│ ├── mp-core-container/
│ │ ├── config.yaml, settings.yaml, settings.definitions.yaml
│ │ ├── constants.typoscript, setup.typoscript
│ ├── mp-core-news/
│ │ ├── config.yaml, settings.yaml, settings.definitions.yaml
│ │ ├── constants.typoscript, setup.typoscript
│ ├── mp-core-form/
│ │ ├── config.yaml, settings.yaml, settings.definitions.yaml
│ │ ├── constants.typoscript, setup.typoscript
│ └── mp-core-seo/
│ ├── config.yaml, settings.yaml, settings.definitions.yaml
│ ├── constants.typoscript, setup.typoscript
├── TypoScript/
│ ├── constants.typoscript, setup.typoscript
│ ├── VueComponents.typoscript
│ ├── Helper/PageClass.typoscript
│ ├── Constants/*.typoscript
│ └── Setup/
│ ├── 10.Config, 20.Page, 30.Page.Styles, 40.Page.Scripts
│ ├── 50.Page.Navigation, 60.Lib, 90.CleanupRTE
│ ├── Page/*.typoscript
│ └── ContentElements/tt_content/*.typoscript
└── Extensions/
├── constants.typoscript, setup.typoscript
| Datei | Zweck |
|---|---|
10.Config | Grundlegende TYPO3-Konfiguration (Zeichensatz, Sprache, Cache) |
20.Page | Seitenobjekt, Vorlagenpfade, Datenprozessoren |
30.Page.Styles | CSS-Einbindungen |
40.Page.Scripts | JavaScript-Einbindungen |
50.Page.Navigation | Bündel für bedingte Navigation |
60.Lib | Gemeinsam genutzte lib.* Objekte |
95.SitePresentationOverrides | SocialMediaProcessor, StructuredDataProcessor |
ContentElements/tt_content/* | Rendering von Inhaltselementen, HeaderLogoProcessor |
Abhängigkeitsinjektion (Services.yaml)
Configuration/Services.yaml führt automatisch das Mpc\MpCore\* Namespace und registriert die Dienste, die TYPO3 außerhalb des Containers auflösen muss, als public: true:
| Service | Warum public: true |
|---|---|
Mpc\MpCore\DataProcessing\HeaderLogoProcessor | Wird von TypoScript instanziiert über GeneralUtility::makeInstance() |
Mpc\MpCore\DataProcessing\SocialMediaProcessor | Gleich |
Mpc\MpCore\DataProcessing\StructuredDataProcessor | Gleich |
Mpc\MpCore\Middleware\RobotsTxtMiddleware | Wird über den DI-Container aus dem PSR-15-Middleware-Stack aufgelöst |
Mpc\MpCore\Middleware\LlmsTxtMiddleware | Gleich |
Mpc\MpCore\UserFunc\ColorPickerValueItems | itemsProcFunc Callback |
Nur lokal gültige DI-Überschreibungen (Services.local.yaml)
Die mitgelieferte Services.yaml importiert eine optionale Schwesterdatei mit ignore_errors: not_found, sodass Projekte lokal begrenzte Dienste (Ad-hoc-Helfer, umgebungsspezifische Verknüpfungen) registrieren können, ohne die veröffentlichte Datei zu ändern oder die Container-Kompilierung zu unterbrechen, wenn die Datei fehlt:
# Configuration/Services.local.yaml (gitignored)
services:
# Example: register a local-only helper or override a service binding.
Configuration/Services.local.yaml ist in .gitignore für genau dieses Muster aufgeführt.
Projekt-Tooling (bin/)
Projektinterne Skripte befinden sich in mpcore/bin/ (außerhalb jeglicher Erweiterungs-Repositorys). Vollständige Befehlsreferenz: mpcore/README.md.
Import auf die Doku-Seite (bin/docsite-import.php)
php bin/docsite-import.php
php bin/docsite-import.php --dry-run
ddev exec php bin/docsite-import.php --dry-run
Von docs-site/: npm run import / npm run import:dry (umschließt dasselbe Skript).
XLF-Sortierung (bin/sort-xlf.php)
php bin/sort-xlf.php
php bin/sort-xlf.php --dry-run --package=mp-core
ddev exec php bin/sort-xlf.php
Content Security Policy (ContentSecurityPolicies.php)
Configuration/ContentSecurityPolicies.php enthält eine strenge Frontend-CSP, die
von TYPO3 13.4+ automatisch angewendet wird, sobald einer dieser Feature-Toggles aktiviert ist
(System -> Einstellungen -> Feature-Toggles):
security.frontend.enforceContentSecurityPolicy-- Durchsetzungsmodussecurity.frontend.reportContentSecurityPolicy-- Nur-Berichts-Modus
Die mitgelieferte Richtlinie ändert die TYPO3-Frontend-Standardeinstellungen wie folgt:
| Direktive | Änderung | Begründung |
|---|---|---|
default-src | Set 'self' | Strenge Grundregel: Alles, was keine eigene Direktive hat, muss aus derselben Quelle stammen. |
script-src | Extend nonceProxy | Inline <script> Blöcke (ThemeInit.html, JSON-LD <script type="application/ld+json">) werden über <f:security.nonce()>. |
style-src | Extend nonceProxy | Inline- <style> Blöcke (Farbüberschreibungen in Styles.html, elementbezogene Hintergrundbilder in fluid_styled_content/Layouts/Container.html) verwenden <f:asset.css useNonce="1">. |
img-src | Extend data: | „Allow SCSS-emitted inline SVG fallbacks“ (svg-load) und Base64-Platzhalter. |
font-src | Set 'self' | Alle Webfonts werden selbst gehostet unter Resources/Public/Fonts/. |
connect-src | Set 'self' | Keine XHR-/fetch-/WebSocket-Anrufe außerhalb der eigenen Herkunft. |
object-src | Set 'none' | Veraltete Plugins blockieren (<object>, <embed>, <applet>). |
base-uri | Set 'self' | Verhindern von <base href> Injektionsangriffe. |
form-action | Set 'self' | Formular-POSTs erfolgen ausschließlich an denselben Ursprung. |
frame-ancestors | Set 'self' | Schutz vor Clickjacking: keine Einbettung über Ursprünge hinweg. |
Überschreibungen pro Website
Betreiber können die Richtlinie pro Website über
config/sites/<id>/csp.yaml:
inheritDefault: true
mutations:
- mode: extend
directive: img-src
sources: ["https://cdn.example.com"]
- mode: extend
directive: form-action
sources: ["https://newsletter.example.com"]
Vertrauensgrenze für die Farbkonfiguration der Website
Inline-CSS-Variablen werden Resources/Private/Partials/Page/Styles.html werden nun
über den mpc:format.cssColor ViewHelper weitergeleitet, der an
Mpc\MpCore\Service\CssColorValidator. Es werden nur syntaktisch gültige CSS-Farben
(benannte, #rgb[a], #rrggbb[aa], rgb()/rgba()/hsl()/hsla()) ausgegeben;
fehlerhafte oder vom Angreifer bereitgestellte Website-Konfigurationseinträge werden stillschweigend
verworfen, sodass sie niemals aus dem Inline- <style> .
Derselbe Validator wird auch in Mpc\MpCore\UserFunc\ColorPickerValueItems
, sodass das Dropdown-Menü des Backend-Farbwählers ebenfalls ungültige Felder herausfiltert und
die Bezeichnungen auf 200 Zeichen begrenzt.
Konfiguration des Vorlagenpfads
page.10 = FLUIDTEMPLATE
page.10 {
templateRootPaths {
0 = EXT:mp_core/Resources/Private/Templates/Page/
10 = {$settings.pageTemplates}
}
partialRootPaths {
0 = EXT:mp_core/Resources/Private/Partials/
10 = {$settings.pagePartials}
}
layoutRootPaths {
0 = EXT:mp_core/Resources/Private/Layouts/
10 = {$settings.pageLayouts}
}
}
Pfadpriorität: 0 = Kern, 10 = Erweiterung, 20+ = Projekt. Höhere Zahlen haben Vorrang vor niedrigeren.
Überschreibungen durch Erweiterungen
plugin.tx_news.view.templateRootPaths.10 = EXT:mp_core/Resources/Extensions/news/Templates/
plugin.tx_form.view.templateRootPaths.10 = EXT:mp_core/Resources/Extensions/form/Templates/
plugin.tx_indexedsearch.view.templateRootPaths.10 = EXT:mp_core/Resources/Extensions/indexed_search/Templates/
Bedingte Konfiguration
Navigationsbündel hängen vom Feld „Site-Konfiguration“ ab navType (siehe Configuration/SiteConfiguration/Overrides/sites.php):
navType | Layout |
|---|---|
1 | Primäre Navigation |
2 | Sekundäre Navigation |
3 | Tertiäre Navigation |
[traverse(site("configuration"), "navType") == "1"]
page.includeJSFooter.navigationPrimary = EXT:mp_core/Resources/Public/JavaScripts/navigationPrimary.js
[END]
TCA-Überschreibungen
Schnellübersicht
| Datei | Zweck |
|---|---|
tt_content_00_base.php | Assistent für globale Verknüpfungen, Paletten, Vue-To-Do-Liste, CType |
tt_content_00_header.php | Erweiterte Kopfzeilenoptionen |
pages.php | Funktionsschalter, Teaser-Beschreibung, Link-Symbol |
sys_category.php | Zuordnung zur Hauptkategorie auf Seiten |
sys_file_metadata.php | RTE-Beschreibung, Barrierefreiheits-Flag |
sys_file_reference.php | Gliederungs- und Download-Optionen |
sys_template.php | Statische TypoScript-Registrierung |
Seitenfelder (pages.php)
| Feld | Typ | Beschreibung |
|---|---|---|
newsletter | Schaltfeld zum Aktivieren/Deaktivieren | Anmeldefeld für den Newsletter |
socialmedia | Aktivierungsfeld | Leiste zum Teilen in sozialen Medien |
breadcrumb | Aktivieren/Deaktivieren des Kontrollkästchens | Breadcrumb-Navigation |
headercontainer | Schaltfläche zum Aktivieren/Deaktivieren | Layout des Kopfzeilen-Containers |
teaser_description | Textfeld | Teaser/Kartenbeschreibung |
link_icon | Datei (SVG) | Symbol für benutzerdefinierten Seitenlink |
link_icon_background | Schaltfläche zum Aktivieren/Deaktivieren | Hintergrund des Symbols |
Globaler Link-Assistent (tt_content_00_base.php)
| Feld | Typ | Optionen |
|---|---|---|
tx_link_switch | Schaltfeld umschalten | Verknüpfung aktivieren/deaktivieren |
tx_link | Link-Assistent | Seite, Datei, URL, Datensatz |
tx_link_layout | Auswählen | Primäre/sekundäre/tertiäre Schaltfläche, Link-Stile |
tx_link_text | Texteingabe | Benutzerdefinierter Linktext |
tx_link_position | Auswählen | Mitte, Links, Rechts |
Palette: link_config
Benutzerdefinierte Inhaltselemente
| Element | Datei | Beschreibung |
|---|---|---|
| Galerie | tt_content_gallery.php | Responsive Bildergalerien + Lightbox |
| Bühne | tt_content_stage.php | Hero-Bereiche (Bild-/Videohintergründe) |
| Banner | tt_content_banner.php | Anpassbare Bannerbereiche |
| Einzelner Teaser | tt_content_singleteaser.php | Inhalts-Teaser mit Bildern/Links |
| Akkordeon | tt_content_accordion.php | Zusammenklappbare Bereiche (b13/container) |
| Registerkarten | tt_content_tabs.php | Registerkarten (b13/container) |
| Slider | tt_content_slider.php | Swiper-Karussells (b13/container) |
| Raster | tt_content_grid.php | Flexible Spaltenlayouts (b13/container) |
| Container | tt_content_container.php | Generischer Wrapper (b13/container) |
| To-Do-Liste | tt_content_00_base.php | Vue.js 3 To-Do-Liste (CType: mpcore_todolist) |
| Menü-Unterseiten | tt_content_menu_subpages.php | Erweitertes Unterseiten-Menü |
Dateimetadaten / Verweise
| Tabelle | Feld | Beschreibung |
|---|---|---|
sys_file_metadata | description | RTE-Textbeschreibung |
sys_file_metadata | is_accessible | Kennzeichen für Barrierefreiheit |
sys_file_reference | outline | Mit Rahmen anzeigen |
sys_file_reference | allow_download | Download-Schaltfläche anzeigen |
Häufige Anpassungsmuster
Hinzufügen eines Feldes zu einem bestehenden Element
$myColumns = [
'tx_my_field' => [
'label' => 'My Field',
'config' => ['type' => 'input', 'size' => 30],
],
];
ExtensionManagementUtility::addTCAcolumns('tt_content', $myColumns);
ExtensionManagementUtility::addToAllTCAtypes('tt_content', 'tx_my_field', 'textmedia', 'after:bodytext');
Datenbankschema
Fügen Sie Spalten hinzu ext_tables.sqlund führen Sie anschließend „Admin-Tools“ -> „Wartung“ -> „Datenbankstruktur analysieren“ aus.
CREATE TABLE tt_content (
tx_my_field varchar(255) DEFAULT '' NOT NULL
);
Tipps
- Verwenden Sie vorhandene Paletten aus
tt_content_00_base.phpundtt_content_00_header.php - Fügen Sie den benutzerdefinierten Feldern das Präfix
tx_, um Konflikte zu vermeiden - Verwenden Sie „
LLL:EXT:...“-Referenzen für alle Beschriftungen - Verwenden Sie „
displayCond“ für die bedingte Sichtbarkeit von Feldern:'displayCond' => 'FIELD:my_toggle:=:1' - Verwenden Sie „Site-Einstellungen“ anstelle von fest programmierten TypoScript-Werten
- Beachten Sie die Pfadnummerierung:
0(Kern),10(Erweiterung),20+(Projekt)
Weiterführende Informationen
- Backend – RTE, Seite „TSconfig“, Inhaltsvorschau
- Inhaltselemente -- TCA-Feldreferenz pro CType
- Frontend – Build-System und Asset-Pipeline
- Favicons – Favicon-Generierung
- TYPO3-TCA-Referenz
- TYPO3-Site-Sets
- TYPO3-TypoScript-Referenz
- b13/container