CMS Content Management System für Mobirise
Admin Im Oktober 2025
Download MiniCMS von meinem Server:
MiniCMS.zip vom 25. Oktober 2025
Alternativer Download von Volkers Server:
www.niederastroth.de/minicms.7z
Entpackt das ZIP-Archiv minicms.zip oder das ZIP-Archiv von Volker minicms.7z mittels Doppelklick.
Folgende Verzeichnisse sind vorhanden:
admin
uploads
Folgende Dateien sind vorhanden:
cms_content.php
config.php
Die vier übrigen Dateien im Download von Volker enthalten lediglich Hinweise dazu, an welchen Stellen die referenzierten Lightbox‑Skripte, die CSS‑Anweisungen und die Anbindung an das Mobirise‑CMS eingefügt werden müssen. Diese Hinweise sind in meinem nachfolgenden Tutorial beschrieben. Sie sind nicht für den Server bestimmt; daher habe ich die Hinweisdateien aus dem Download von meinem Server entfernt.
Die SQLite Datenbank wird erst nach dem ersten Eintrag automatisch im Stammverzeichnis (Root) des Projekts erstellt.
Kopiert nun die beiden Verzeichnisse sowie die beiden oben genannten Dateien in das Stammverzeichnis eures Mobirise‑Projekts auf dem Server.
Ruft das Verzeichnis "admin" über die URL auf. Dies ist auch der zukünftige Link zum Administratorbereich:
DeineDomain.de/admin/
Das Login-Fenster des TinyMCE CMS-Editors öffnet sich. Gebt sowohl als Benutzername als auch als Passwort jeweils "admin" ein. Danach öffnet sich das Dashboard. Tragt sofort eure gewünschten Zugangsdaten ein: Klickt dazu oben rechts auf "Admin ändern" und gebt den neuen Benutzernamen sowie das Passwort ein. Anschließend werdet ihr ausgeloggt und müsst euch neu anmelden.
Macht euch zunächst mit diesem Editor vertraut, damit ihr alle Funktionen des TinyMCE kennenlernt und sicher bedienen könnt. Über das Code-Symbol (< >) lässt sich außerdem der Quelltext direkt bearbeiten — das ist besonders praktisch, um beispielsweise Bootstrap- oder Mobirise‑Klassen einzufügen. Siehe meinen Screenshot von dem Dashboard unten.
Wichtig: Tragt oben links im Feld „Inhalt‑ID“ die ID ein, unter der dieser Inhalt in einem beliebigen Mobirise‑Block angezeigt werden soll. Gebt der ID am Ende eine fortlaufende Ziffer (für den ersten Block …1, für einen weiteren Block derselben Seite …2 usw.). Nach einem Klick auf „Speichern“ werden die so sortierten Inhalte in der Übersicht unten angezeigt und lassen sich später über den Bleistift‑Button ✏️ wieder in den Editor laden und weiterbearbeiten. Für eine andere Seite vergebt ihr einen neuen Namen nach demselben Prinzip – wieder mit einer fortlaufenden Ziffer am Ende. Dadurch wird ein neuer Tab in der Übersicht unten erstellt.
Im Screenshot des Mobirise-Code-Editors habe ich die Einbindung rot markiert. Im HTML-Editor ist das <div> mit der oben beschriebenen data-id zu sehen – in diesem Beispiel sieht es folgendermaßen aus:
<!-- Start CMS Teil-1 -->
<div class="cms-content" data-id="Tutorials4-Bereich1"></div>
<!-- End CMS Teil-1 -->
Bitte berücksichtigt bei der Erstellung der CMS-Bereiche, dass die Inhalte weder in der Arbeitsansicht von Mobirise noch nach dem lokalen Publizieren sichtbar sind. Da hierfür die Skriptsprache PHP verwendet wird, sind die Inhalte erst online einsehbar.
Die CSS habe ich bereits oben im CMS‑Bereich beschrieben. Damit begrenze ich die Bildgrößen, stelle die Schriftfarbe entsprechend meiner Mobirise‑Seite ein, verkleinere die Schrift und zentriere das Logo auf mobilen Geräten. Das CSS ist natürlich flexibel einsetzbar und kann auch direkt im TinyMCE‑Editor des CMS eingefügt werden.
Im Einbau‑Block des CMS habe ich dem großen Bild vom Sonnenuntergang noch dieses zusätzliche CSS hinzugefügt, das das Bild auf 90 % der Displaybreite begrenzt wird, einen Schatten hinzufügt und beim Überfahren mit der Maus eine Animation abspielt. Diese Class habe ich direkt im TinyMCE-Editor an das <img> Tag geschrieben:
.myshadow {
box-shadow: 5px 5px 5px 0px rgba(0, 0, 0, 0.4);
transition: all 0.5s linear;
width: 800px;
height: auto;
max-width: 90%;
}
.myshadow:hover {
box-shadow: 25px 25px 25px 0px rgba(0, 0, 0, 0.4);
transform: scale(1.05);
cursor: pointer;
}
Für den Einbau der automatischen Lightbox findet ihr meine Anleitungen mit den Skripten unten.
Dashboard vom CMS mit dem TinyMCE Editor
CMS Einbau im Code Editor
Anwendung: GLightbox
→ Wenn ihr die automatische Lightbox verwenden möchtet, mit der alle Bilder automatisch als Galerie angezeigt werden, fügt die entsprechenden Skriptverweise in den Bereich "Inside <head> code:" eurer Seite ein.
→ Außerdem habe ich eine optionale CSS-Datei erstellt, mit der ihr die Lightbox flexibler gestalten könnt – zum Beispiel mit runden Ecken für die Bilder, wie in meinem Beispiel. Der CSS-Code ist komplett optional. Zum Einbau fügt ihr den gesamten CSS-Code ebenfalls in den Bereich "Inside <head> code:" eurer Seite ein, dann aber unter den Skriptverweisen der Lightbox.
→ Das JavaScript, das die Lightbox steuert, platziert ihr im Bereich "End of <body> code" am Ende der Seite. Ich habe hier ein neues Skript entwickelt, das in der Lightbox nur die Bilder aus demselben Block anzeigt und zusätzlich deren ALT-Text als Beschriftung verwendet. Im Skript habe ich eine Bildzählung eingebaut. Wer sie deaktivieren möchte, setzt in Zeile 7 die Variable `ENABLE_LIGHTBOX_COUNT` von "true" auf "false".
→ Das Originalskript stelle ich weiter unten optional zur Verfügung. Es zeigt alle Bilder aller Blöcke der Seite gleichzeitig in der Lightbox an, funktioniert jedoch nur korrekt im letzten CMS‑Block.
Kopiert die drei ersten Skripte unten in die angegeben Bereiche:
<!-- Lightbox für das CMS --><link href="https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/glightbox/dist/js/glightbox.min.js"></script>
<!-- CSS optional zur kleineren Darstellung des Lightbox-Containers --><style>/* --------------------------------------------GLightbox – kompakte, transparente Caption-------------------------------------------- *//* Hintergrund der Caption vollständig transparent halten */.glightbox-container .gdesc,.glightbox-clean .gdesc,.glightbox-container .gslide-desc,.glightbox-clean .gslide-desc {background: transparent !important;backdrop-filter: none !important;border: 0 !important;box-shadow: none !important;/* keine margin-Änderung – Position bleibt wie vom Layout vorgesehen */}/* Innenabstand klein halten und Höhe begrenzen (ca. 24px) */.glightbox-container .gdesc-inner,.glightbox-clean .gdesc-inner {padding: 2px 12px !important; /* schmaler Balken */max-height: 24px !important; /* Zielhöhe */overflow: hidden !important; /* Überlauf verbergen */}/* Caption-Text: weiß, eine Zeile, EllipsisWICHTIG: 50px Abstand unten aus dem JS hier neutralisieren */.glightbox-container .gslide-title,.glightbox-container .gslide-description {color: #fff !important;/* margin: 0; (nicht gesetzt, wird durch folgende Regeln ersetzt) */white-space: nowrap;overflow: hidden;text-overflow: ellipsis;line-height: 24px !important; /* vertikal kompakt */background-color: transparent;margin-bottom: 0 !important; /* <-- überschreibt die 50px aus dem JS */}/* Titel optional leicht hervorheben */.glightbox-container .gslide-title {font-weight: 600;margin-right: .5em;}/* --------------------------------------------Gesamten (Bild + Caption) Block kleiner machenZiel: 90% der Bildschirmhöhe, nicht bis ganz oben kleben-------------------------------------------- *//* Die innere Box (Bild + Caption) auf 90vh begrenzen und mittig halten */.glightbox-container .ginner-container {height: auto !important; /* 100vh aus der Lib aufheben */max-height: 90vh !important; /* Zielgröße: 90% der Viewport-Höhe */display: flex !important;flex-direction: column !important;justify-content: center !important; /* vertikale Zentrierung der Einheit */align-items: center !important;margin: auto !important; /* zentriert innerhalb des Overlays */box-sizing: border-box !important;padding: 12px 0 !important; /* etwas Luft oben/unten */}/* Medien innerhalb der 90vh halten (Platz für ~eine Caption-Zeile einkalkulieren) */.glightbox-container .gslide-media img,.glightbox-container .gslide-media video,.glightbox-container .gslide-media iframe {max-height: calc(90vh - 24px) !important; /* 24px für Caption-Zeile */width: auto !important;height: auto !important;object-fit: contain !important;display: block !important;}/* --------------------------------------------NEU: Optionale, sanft abgerundete Ecken für Bilder(fixer Pixelwert vermeidet „ovale“ Ecken bei Hoch-/Querformat)-------------------------------------------- */.glightbox-container .gslide-media img {border-radius: 20px !important; /* sanfte Rundung, gleichmäßig in allen Formaten */overflow: hidden !important; /* verhindert sichtbare Überstände */}/* --------------------------------------------Mobile-Optimierung (≤ 500px):Caption direkt unter das Bild (nicht am unteren Rand fixiert)-------------------------------------------- */@media (max-width: 500px) {.glightbox-mobile .glightbox-container .gslide-description,.glightbox-mobile .glightbox-container .gdesc {position: static !important; /* aus der Bottom-Positionierung lösen */bottom: auto !important;left: auto !important;right: auto !important;transform: none !important;width: 100% !important;margin: 0 !important;padding: 0 12px !important;}/* Kleiner, definierter Abstand zwischen Bild und Caption */.glightbox-container .gslide-media {margin-bottom: 8px !important;}}</style>
<!-- Lightbox-Styles und Script pro Mobirise-Block --><script>// AJAX-CMS + Lightbox-Integrationdocument.addEventListener('DOMContentLoaded', () => {// OPTIONAL: Bildzählung "Index (Total) - " vor die Caption setzen (pro Galerie/Block)const ENABLE_LIGHTBOX_COUNT = true; // <- auf false setzen, um die Zählung zu deaktivieren// NEU: Hilfsfunktion für optionale Nummerierungfunction applyNumberingForBlock(blockRoot, galleryId) {if (!ENABLE_LIGHTBOX_COUNT) return;const PREFIX_RE = /^\s*\d+\s*\(\d+\)\s*-\s*/;// Alle Lightbox-Links dieses Blocks / dieser Galerie einsammeln (DOM-Reihenfolge = Reihenfolge)const sel = '.lightbox[data-gallery="' + galleryId.replace(/"/g, '\\"') + '"]';const anchors = Array.from(blockRoot.querySelectorAll(sel));const total = anchors.length;if (!total) return;anchors.forEach((a, idx) => {// Basis-Titel ermitteln (entweder aus data-title oder alt), evtl. vorhandenes Präfix entfernenlet base = a.getAttribute('data-title-base');if (!base) {const img = a.querySelector('img');const raw = a.getAttribute('data-title') || (img ? img.getAttribute('alt') : '') || '';base = raw.replace(PREFIX_RE, '');a.setAttribute('data-title-base', base);}const composed = (idx + 1) + ' (' + total + ')' + (base ? ' - ' + base : '');a.setAttribute('data-title', composed);});}// NEU: Lightbox-Caption-Styling per CSS (dynamisch einfügen) – transparent, ~24px hoch, weißer Text(function injectLightboxCaptionStyles() {const css = `/* NEU: Hintergrund der Caption vollständig transparent halten (alle relevanten Container) */.glightbox-container .gdesc,.glightbox-clean .gdesc,.glightbox-container .gslide-desc,.glightbox-clean .gslide-desc {background: transparent !important;backdrop-filter: none !important;border: 0 !important;box-shadow: none !important;/* Wichtig: keine margin-Änderung, damit die Caption zentriert unter dem Bild bleibt */}/* NEU: Innenabstand klein halten und Höhe begrenzen, ohne Layout zu verändern */.glightbox-container .gdesc-inner,.glightbox-clean .gdesc-inner {padding: 2px 12px !important; /* schmaler Balken */max-height: 24px !important; /* Zielhöhe */overflow: hidden !important; /* Überlauf verbergen */}/* NEU: Text weiß, einzeilig, Ellipsis; Höhe durch line-height ~24px */.glightbox-container .gslide-title,.glightbox-container .gslide-description {color: #fff !important;/* margin: 0; */white-space: nowrap;overflow: hidden;text-overflow: ellipsis;line-height: 24px !important; /* vertikal kompakt */background-color: transparent;margin-bottom: 50px;}/* NEU: Titel leicht hervorheben (optional) */.glightbox-container .gslide-title {font-weight: 600;margin-right: .5em;}/* NEU (Mobile – echte Vertikalzentrierung):Setzt Bild + Caption als Einheit wirklich mittig,indem die gesamte innere Box vertikal übersetzt wird. */@media (max-width: 500px) {/* Caption bleibt direkt unterm Bild (wie von dir gewünscht) */.glightbox-mobile .glightbox-container .gslide-description,.glightbox-mobile .glightbox-container .gdesc {position: static !important;bottom: auto !important;transform: none !important;width: 100% !important;margin: 0 !important;padding: 0 12px !important;}/* 50px unten am Handy deaktivieren, damit die Caption dicht am Bild steht */.glightbox-mobile .glightbox-container .gslide-title,.glightbox-mobile .glightbox-container .gslide-description {margin-bottom: 0 !important;}/* Kern: die gesamte innere Box vertikal mittig setzen */.glightbox-mobile .glightbox-container .ginner-container {height: auto !important; /* 100vh aufheben */min-height: 0 !important;position: relative !important;top: 50% !important;transform: translateY(-50%) !important;display: flex !important;flex-direction: column !important;align-items: center !important;justify-content: center !important;max-height: calc(100vh - 24px) !important; /* etwas Reserve */margin: 0 auto !important;box-sizing: border-box !important;padding: 0 !important;}/* Kleiner Abstand zwischen Bild und Caption */.glightbox-mobile .glightbox-container .gslide-media {margin: 0 0 8px 0 !important;max-width: 100% !important;}/* Bildhöhe so begrenzen, dass Bild + Caption bequem mittig passen */.glightbox-mobile .glightbox-container .gslide-media img,.glightbox-mobile .glightbox-container .gslide-media video,.glightbox-mobile .glightbox-container .gslide-media iframe {max-height: calc(100vh - 24px - 24px - 24px) !important;/* ~24px Top-/Bottom-Puffer + ~24px Caption */width: auto !important;height: auto !important;object-fit: contain !important;display: block !important;}/* Sicherheitsnetz: zentriere auch die Slide-Ebene */.glightbox-mobile .glightbox-container .gslide {display: flex !important;flex-direction: column !important;align-items: center !important;justify-content: center !important;width: 100% !important;}}`;// Vorhandenes Style-Tag aktualisieren oder neu anlegenlet styleTag = document.querySelector('style[data-generated="cms-glightbox-caption"]');if (!styleTag) {styleTag = document.createElement('style');styleTag.setAttribute('data-generated', 'cms-glightbox-caption');document.head.appendChild(styleTag);}styleTag.textContent = css;})();document.querySelectorAll('.cms-content[data-id]').forEach(el => {const id = el.getAttribute('data-id');fetch('cms_content.php?id=' + encodeURIComponent(id)).then(r => r.text()).then(t => {el.innerHTML = t;// Lightbox automatisch für neue CMS-Inhalte aktivierenel.querySelectorAll('img').forEach(img => {// Nur wenn Bild noch keinen <a> Link hatif (!img.closest('a')) {const a = document.createElement('a');a.href = img.src;a.className = 'lightbox';img.parentNode.insertBefore(a, img);a.appendChild(img);}// NEU: Vorhandenen <a>-Elternlink ermitteln (nach dem ggf. Einwickeln)const aLink = img.closest('a');// NEU: Lightbox-Klasse sicherstellenif (aLink && !aLink.classList.contains('lightbox')) {aLink.classList.add('lightbox');}// NEU: Galerie-Name pro Block setzen -> gruppiert nur Bilder desselben data-idif (aLink) {aLink.setAttribute('data-gallery', id);// Optional: Titel aus alt übernehmenif (img.getAttribute('alt')) {aLink.setAttribute('data-title', img.getAttribute('alt'));}}});// OPTIONAL: Vor Initialisierung die Nummerierung für diesen Block/Galerie schreibenapplyNumberingForBlock(el, id);// Lightbox initialisieren (erneut nach dem Laden)// NEU: Instanz nur für diesen Block initialisieren (Selector filtert auf die Galerie des Blocks)GLightbox({selector: '.lightbox[data-gallery="' + id + '"]'});}).catch(err => {console.error('Fehler beim Laden von', id, err);});});});</script>
<!-- Lightbox-Styles und Script --><script>// AJAX-CMS + Lightbox-Integrationdocument.addEventListener('DOMContentLoaded', () => {document.querySelectorAll('.cms-content[data-id]').forEach(el => {const id = el.getAttribute('data-id');fetch('cms_content.php?id=' + encodeURIComponent(id)).then(r => r.text()).then(t => {el.innerHTML = t;// Lightbox automatisch für neue CMS-Inhalte aktivierenel.querySelectorAll('img').forEach(img => {// Nur wenn Bild noch keinen <a> Link hatif (!img.closest('a')) {const a = document.createElement('a');a.href = img.src;a.className = 'lightbox';img.parentNode.insertBefore(a, img);a.appendChild(img);}});// Lightbox initialisieren (erneut nach dem Laden)GLightbox({ selector: '.lightbox' });}).catch(err => {console.error('Fehler beim Laden von', id, err);});});});</script>
Video im CMS erstellt
Auch dieses Video habe ich über das CMS eingefügt: Ich habe einen Text-/Bild-Block aus der Rubrik 'Image & Video' verwendet und das Bild durch das entsprechende <div> mit seiner data-id aus dem CMS ersetzt.
<!-- Start CMS Teil-2 (Video) -->
<div class="cms-content" data-id="Tutorials4-Bereich2"></div>
<!-- End CMS Teil-2 (Video) -->
Malediven Galerie ↗️
Hier ein Beispiel, wie sich eine Gruppe zusätzlicher Bilder in der Lightbox anzeigen lässt. Ich habe die Bilder mit einer CSS‑Klasse ausgeblendet, sodass nur die Lightbox sie erkennt.
Klicke auf das Bild.
Alle Bilder dieses Blocks werden in einer Lightbox angezeigt. Theoretisch lassen sich beliebig viele Bilder hinzufügen, ohne die Mobirise‑Software zu belasten. Unten findet ihr meine Beschreibung, wie ich das umgesetzt habe.
Hier zeige ich, wie ich eine versteckte Galerie in der Lightbox anhand des oben gezeigten Malediven-Beispiels umgesetzt habe.
Ich habe die Bilder ganz normal über den TinyMCE-Editor vom CMS hochgeladen und dann über die Schaltfläche (< >) für den Quellcode (Source Code) ein <div class="hide"> um die zusätzlichen, versteckten Bilder gesetzt.
Ich habe diese CSS‑Klasse im Mobirise "CSS Editor" des Einbaublocks hinzugefügt:
.hide {
display: none !important;
}
Es wird deshalb nur das erste Bild angezeigt, weil die übrigen Bilder die Klasse zum verstecken besitzen. Die Lightbox erkennt die Bilder dennoch automatisch anhand des <img> Tags, und der im ALT‑Text eingetragene Text wird als Bildunterschrift (Caption) unter dem jeweiligen Bild angezeigt. Falls ihr keine Bildunterschriften möchtet, lasst den ALT‑Text einfach leer.
Video von Volker zum CMS