
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 Funktionsumfänge 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ängigkeiten von einem untergeordneten Set über den Aggregator herzustellen, führt zu einem SetRegistry-Rekursions-Deadlock.
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 „Websiteeinstellungen“). 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 | Standard |
|---|---|---|
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 | — |
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}.
Bei Werten, 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 eigene Schriftarten selbst hosten (in den Dateimanager hochgeladen oder von dort ausgewählt), anstatt auf Systemschriftarten zurückzugreifen. Diese Funktion ersetzt die früheren 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-Unterelement 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 Familiensatz 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
name(z. B.Inter), einenfallbackStapel (z. B.sans-serif) ein und wählen Sie „Gilt für“ aus. - Fügen Sie pro Strichstärke/Stil eine Schriftart hinzu. Laden Sie eine Datei über den Dateimanager hoch oder wählen Sie eine
woff2Datei über den Dateimanager aus und legen Sie die Stärke (100–900) sowie den Stil (normal/kursiv) fest. - Leeren Sie den Frontend-Cache.
WebFontProcessorerzeugt 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 Bezug auf 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 von einem Angreifer bereitgestellter Wert niemals aus dem Inline- <style> .
Einschränkungen
- CSP: Selbst gehostete Schriftarten mit
fileadminsind „Same-Origin“ und bereits durchfont-src 'self'inConfiguration/ContentSecurityPolicies.php. Um Schriftarten von einer anderen Domain bereitzustellen, muss diese Herkunft zufont-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 die
: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 durch Configuration/SiteConfiguration/Overrides/sites.php. Konfigurieren Sie diese unter „Site-Verwaltung“ → „Sites“ → [Site] → „Konfiguration“ (oder unter config/sites/[site]/config.yaml).
| Bereich | Felder (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 |
| Social Media | 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 bindet automatisch den 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 ü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 ausgelieferte Services.yaml importiert eine optionale Schwesterdatei mit ignore_errors: not_found, sodass Projekte lokal begrenzte Dienste (Tooling-Befehle, Ad-hoc-Helfer) 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:
Mpc\MpCore\Command\ImportDocumentationCommand:
tags:
- { name: console.command, command: 'docsite:import' }
Configuration/Services.local.yaml ist in .gitignore für genau dieses Muster aufgeführt.
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-Bericht-Modus
Die mitgelieferte Richtlinie ändert die TYPO3-Frontend-Standardeinstellungen wie folgt:
| Direktive | Änderung | Begründung |
|---|---|---|
default-src | Set 'self' | Strenge Grundregel; alles, wofür keine eigene Direktive vorhanden ist, 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, elementspezifisches Hintergrundbild 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-Postbacks erfolgen ausschließlich an denselben Ursprung. |
frame-ancestors | Set 'self' | Schutz vor Clickjacking: keine Einbettung über Ursprungsgrenzen 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"]
Konfiguration der Farbe der Vertrauensgrenze für die Website
Inline-CSS-Variablen in 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 von Angreifern 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 Slots 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 TodoList 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 | Checkbox-Schalter | Leiste zum Teilen in sozialen Medien |
breadcrumb | Aktivierungsfeld | 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 | Schaltfeld 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 Abschnitte (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 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 Settings“ anstelle von fest codierten 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