
Site-Sets (TYPO3 13.4+)
| Set | Zweck |
|---|---|
mpc/mp-core (Aggregator) | Bindet alle darunter liegenden Funktionssätze in einem Include ein |
mpc/mp-core-base (erforderlich) | Abhängigkeiten von Systemerweiterungen und gemeinsame Website-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-page | TypoScript der Seite, Konstanten und TSconfig der Seite – alles außer SEO |
mpc/mp-core-seo | SEO (Titel-Trennzeichen, Robots-/Verifizierungs-Meta-Tags, Open Graph, Twitter Cards, Schema.org, Sitemap) |
mpc/mp-core ist ein Aggregator, der auf alle oben genannten Elemente angewiesen ist. 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-page (das „base“, „news“, „form“ und „container“ einbindet) ein und fügen Sie mpc/mp-core-seo oder eine andere SEO-Erweiterung hinzu.
Rollen festlegen
| Rolle festlegen | Rolle |
|---|---|
mpc/mp-core | Nur Aggregator (kein eigenes TypoScript und keine eigenen Einstellungen) |
mpc/mp-core-base | Bindet TYPO3-Systemerweiterungen ein; enthält die gemeinsamen Site-Einstellungen (settings.yaml, settings.definitions.yaml, labels.xlf); optionale Integrationen, sofern vorhanden |
mpc/mp-core-* (Feature) | Feature-spezifisches TypoScript und Einstellungen; abhängig von der mpc/mp-core-base |
mpc/mp-core-page | Seitenrendering; wird nach News, Formularen und Containern geladen, sodass seine Überschreibungen |
mpc/mp-core-seo | SEO-Ausgabe; wird nach mpc/mp-core-page |
Wichtig: Beim Erstellen eines benutzerdefinierten Site-Sets
dependencies: [mpc/mp-core-base, …](odermpc/mp-core-page) – niemalsmpc/mp-core. Das Herleiten aus einem untergeordneten Set führt je nach Aggregator zu einem SetRegistry-Rekursions-Deadlock.
Verwendung von mp-core mit einer anderen SEO-Erweiterung
Um die Seitenrendering-Funktion von mp-core zusammen mit mpc/mpc-seo (oder einer beliebigen anderen SEO-Erweiterung) zu nutzen, sollten Sie mpc/mp-core-page anstelle von mpc/mp-core. mp-core gibt dann keine SEO-Meta-Tags, Titel-Trennzeichen oder JSON-LD aus: Die Seite sowie das FAQ-/News-JSON-LD von mp-core erfordern die seo.schema.enabled Einstellung, die nur mpc/mp-core-seo definiert.
dependencies:
- mpc/mp-core-page
- mpc/mpc-seo
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
Sets aktivieren
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-page
- 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-base/settings.definitions.yaml und settings.yaml.
Quelle: Configuration/Sets/mp-core-base/
Schema-Standard —
defaultinsettings.definitions.yaml(Benutzeroberfläche „Website-Einstellungen“). Ausgelieferter Standardwert – Wert aussettings.yamlwenn es das Schema überschreibt (Spalte—= identisch mit dem 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 | Standardwert |
|---|---|---|
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 eigene Schriftarten selbst hosten (in den Dateimanager hochgeladen oder von dort 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-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 Schriftvariante 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) und den 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> .
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 ü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) |
| 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 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 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 ausgelieferte Services.yaml importiert eine optionale Begleitdatei 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.
Import auf die Dokumentations-Website (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
Aus 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-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 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 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 Beschriftungen 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 | Checkbox umschalten | Anmeldefeld für den Newsletter |
socialmedia | Aktivierungsfeld | 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) | Benutzerdefiniertes Seiten-Link-Symbol |
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 (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 für alle Beschriftungen
LLL:EXT:...-Referenzen - 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