⚙️ Erste Schritte nach der Installation
🏷️ Name der Website festlegen
Im Manager → Systemeinstellungen (Zahnrad unten links).
Nach site_name suchen und den gewünschten Namen eintragen.
Dieser erscheint anschließend automatisch überall, wo [[++site_name]] verwendet wird.
🌐 Wichtige Einstellungen im Kontext pflegen
Übersichtlich – bei mehreren ein Muss
Wenn mehrere Kontexte genutzt werden (z.B. web, intranet, en), müssen die wichtigsten Einstellungen direkt in den Kontext-Einstellungen gepflegt werden.
Nur so kann jeder Kontext eigene Werte nutzen und globale Systemeinstellungen sauber überschreiben.
- Im Manager → Kontexte öffnen
- gewünschten Kontext auswählen (z.B. web)
- Reiter Kontext-Einstellungen öffnen
- Über Erstellen neue Einträge anlegen oder bestehende bearbeiten
- Als Schlüssel die bekannten System-Schlüssel verwenden und passende Werte setzen
Pflicht-Einstellungen pro Kontext:
site_name– Name der Website für diesen Kontextsite_url– vollständige URL des Kontextes (z.B.https://malbergweich.de/)base_url– Basis-Pfad des Kontextes (z.B./)default_template– Template-ID für neue Ressourcenerror_page– Ressourcen-ID für die 404-Seitesite_start– Ressourcen-ID der Startseitesite_unavailable_page– Ressourcen-ID für Wartungsmodussite_unavailable_message– Text für „nicht erreichbar“-Statussite_status– online/offline
Alle diese Werte können wie gewohnt über [[++site_name]], [[++site_url]] usw. im Template verwendet werden – je Kontext automatisch mit den dort gesetzten Werten.
🧭 Orientierung im Manager (MODX 3)
Nach dem Login öffnet sich der MODX 3 Manager mit einer übersichtlichen, linksbündigen Seitenleiste.
Diese enthält die Hauptbereiche:
- Ressourcen – Seitenbaum deiner Website
- Elemente – Templates, Chunks, Snippets, TVs
- Dateien – Zugriff auf Media Sources (Dateibrowser)
- Extras – Paketverwaltung, Tools und Add-ons
- Benutzer – Benutzer, Rollen, Zugriffsrechte
- System – Systemeinstellungen, Logs, Pakete
Der Arbeitsbereich rechts zeigt jeweils den gewählten Inhalt oder Editor.
📁 Ordnerstruktur für Assets
Unter Dateien befindet sich standardmäßig der Ordner /assets/.
Für eine klarere Struktur kannst du (optional) folgende Unterordner anlegen:
assets/modx/templatesassets/modx/contentassets/modx/content/images
Hinweis: Achte darauf, die Pfade konsequent zu verwenden und in deinen Templates korrekt zu referenzieren.
Ein eigenermodx-Ordner ist sinnvoll, wenn du später mehrere Domains per Kontext betreiben willst (z.B.modx2,modx3usw.).
🖼️ Media Sources (Dateiquellen)
Unter System → Media Sources lassen sich verschiedene Speicherquellen verwalten:
- Standard: File System (
/assets/) - Erweiterbar: z.B. Amazon S3 oder externe Pfade
Media Sources werden in TVs, im Dateibrowser und bei Datei-Uploads verwendet.
➕ Extras → Package Management
- Extras → Package-Verwaltung öffnen
- Download Extras wählen
- Nach gewünschtem Paket suchen
- Download & Install ausführen
Empfohlene Starter-Extras:
- UpgradeMODX – Core-Updates direkt aus dem Backend
- pdoTools – leistungsstarke Snippets (Navigation, Listen, Queries)
- FormIt – Formularverwaltung
- CKEditor oder TinyMCE – Lade einen aktuellen Rich Text Editor (RTE)
- TwoFactorX – TOTP-basierte Zwei-Faktor-Authentifizierung
TinyMCE: Block-Fehler im RTE vermeiden (optional)
Damit der RTE <script>-Blöcke nicht mehr automatisch in ungültige <p>-Tags einbettet, wird TinyMCE auf <div> als Standard-Block umgestellt; gleichzeitig bleiben reguläre Blockelemente erhalten, Tabellen werden als gültige Kindelemente akzeptiert, überflüssige <br>-Tags am Ende entfernt und alle Tabellenzellen im Editor stets oben ausgerichtet angezeigt.
- System → Systemeinstellungen öffnen
- Nach tinymcerte.settings suchen (Bereich: TinyMCE)
- Das Feld Zusätzliche Einstellungen öffnen
- Folgenden JSON-Wert eintragen:
{"forced_root_block":"div","valid_children":"*+body[table],+div[table]","remove_trailing_brs":true,"content_style":"table td, table th { vertical-align: top; }"}
- Speichern
- MODX-Cache leeren
- RTE neu öffnen, Inhalt prüfen
🧱 Dein erstes selbstgebautes Template (HTML5)
- Menü Elemente → Templates → Neu
- Titel vergeben (z.B. „Main“)
- HTML einfügen:
(Einfaches Template zum testen, üben und spielen. Mit einfachem CSS ohne externe Datei, extra Chunks oder TVs)
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>[[*pagetitle]] | [[++site_name]]</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="[[++site_url]]">
<link rel="icon" type="image/png" href="assets/modx/content/images/icon_48x48.png">
<style>
* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background: #f5f5f5;
color: #333;
}
header,
footer {
background: #123; /* Hauptfarbe Blau */
color: #fff;
padding: 15px 20px;
}
h1 {
margin: 0 0 10px 0;
font-size: 24px;
}
/* Navigation allgemein */
nav {
margin-top: 5px;
}
nav ul {
list-style: none;
margin: 0;
padding: 0;
}
/* Hauptmenü horizontal */
nav > ul {
display: flex;
gap: 30px; /* Abstand zwischen Hauptpunkten */
}
/* jedes Haupt-Element als Spalte: Link oben, Untermenü darunter */
nav > ul > li {
display: flex;
flex-direction: column;
align-items: flex-start;
}
nav a {
color: #fff;
text-decoration: none;
padding: 4px 0;
display: inline-block;
font-size: 15px;
}
nav a:hover {
text-decoration: underline;
}
/* Hervorhebung aktiver Menüpunkt */
nav .active {
font-weight: bold;
text-decoration: underline;
}
/* Untermenüs: vertikal unter dem jeweiligen Hauptpunkt */
nav ul ul {
margin-top: 4px;
padding-left: 10px; /* leichte Einrückung */
}
nav ul ul li {
margin: 2px 0;
}
nav ul ul a {
font-size: 14px; /* etwas kleiner als Hauptmenü */
}
main {
padding: 20px;
background: #fff;
margin: 20px;
border-radius: 4px;
}
main h2 {
margin-top: 0;
}
footer p {
margin: 0;
font-size: 14px;
}
.breadcrumb {
font-size: 14px;
padding: 10px 20px;
background: #f2f4f8;
border-bottom: 1px solid #ccc;
color: #123;
}
.breadcrumb a {
color: #123;
text-decoration: none;
}
.breadcrumb a:hover {
text-decoration: underline;
}
.breadcrumb span {
color: #555;
}
</style>
</head>
<body>
<header>
<h1>[[++site_name]]</h1>
<nav>
[[!pdoMenu?
&parents=`0`
&level=`2`
&showStart=`1`
&tplOuter=`@INLINE <ul>[[+wrapper]]</ul>`
&tpl=`@INLINE <li><a href="[[+link]]">[[+menutitle]]</a></li>`
&tplHere=`@INLINE <li class="active"><a class="active" href="[[+link]]">[[+menutitle]]</a></li>`
&tplParentRow=`@INLINE <li class="has-children"><a href="[[+link]]">[[+menutitle]]</a></li>`
&tplParentRowHere=`@INLINE <li class="active has-children"><a class="active" href="[[+link]]">[[+menutitle]]</a>[[+wrapper]]</li>`
&tplInner=`@INLINE <ul class="submenu">[[+wrapper]]</ul>`
]]
</nav>
</header>
<div class="breadcrumb">
[[!pdoCrumbs?
&from=`0`
&showHome=`1`
&showAtHome=`0`
&showCurrent=`1`
&outputSeparator=` | `
&tpl=`@INLINE <a href="[[+link]]">[[+menutitle]]</a>`
&tplCurrent=`@INLINE <span>[[+menutitle]]</span>`
&tplWrapper=`@INLINE [[+output]]`
]]
</div>
<main>
<h2>[[*longtitle:default=`[[*pagetitle]]`]]</h2>
[[*content]]
</main>
<footer>
<p>© [[++site_name]]</p>
</footer>
</body>
</html>
- Ressource „Home“ → Template „Main“ zuweisen
- Systemeinstellung
default_templateauf dieses Template setzen
In einem zweiten Browserfenster die Frontpage prüfen. Eventuell ist ein Refresh (F5) notwendig.
Info zum Template:
Das aktuellepdoMenuSnippet ist technisch einwandfrei, funktioniert zuverlässig und ist HTML5-konform.Eine Optimierung mit
[[+classes]]und vollständigem&tplParentRow-Wrapper würde zwar das Markup verbessern, verändert jedoch das Verhalten:
Untermenüs erscheinen dann immer, statt wie im Template-Beispiel nur beim aktiven Parent.Eine spätere Umstellung auf eine flexiblere Menüstruktur (z.B. Bootstrap 5) kann zu einem späteren Zeitpunkt erfolgen.
Hinweise
- Backticks (`) erzeugst du mit Shift + der Taste links neben Backspace (zweimal drücken)
[[!pdoMenu? …]]= uncached Snippet-Aufruf[[+wrapper]]= Platzhalter für die Unterpunkte des Menüs[[++…]]= Systemeinstellungen[[*…]]= Resource-Felder
Parser (mit ! = ohne Cache)
- TV →
[[*tvName]] - Chunk →
[[$chunk]] - Snippet →
[[snippet]] - Placeholder →
[[+platzhalter]] - Link →
[[~id]] - System-Einstellung →
[[++einstellung]]
MODX Tag-Syntax
👉 https://docs.modx.com/current/en/building-sites/tag-syntax
🧩 Template-Variablen (TVs)
TVs erweitern Ressourcen um zusätzliche Felder, z.B. Teaserbild oder BannerText.
- Elemente → Template-Variablen → Neu
- Typ, Name und Standardwert festlegen
- Template-Zuweisung setzen
- In der Ressource im Reiter „Template-Variablen“ befüllen
- Im Template ausgeben mit
[[*bannerText]]oder[[*bannerText:default=``]]