Modul: Nachrichtendialog¶
Stand
Code-Analyse vom 2026-04-22 gegen sachpool.de, WebEdition 9.2.3, PHP 8.3.
Template-ModDate: 2026-01-15.
Zweck¶
Modal-Dialog zur zielgerichteten Kommunikation an alle Besucher des Portals — z. B. Hinweise auf neue Features, Wartungsfenster, Werbeaktionen. Wird nach einer Bestätigung pro Nutzer für eine konfigurierbare Dauer per LocalStorage unterdrückt.
Templates¶
Zwei Varianten je Bereich:
| Tpl-ID | Pfad | Einsatz |
|---|---|---|
| 289 | sachpool-portal/nachrichtendialog/nachrichtendialog-interner-bereich.tmpl |
Login-Bereich (Vermittler) |
| 310 | sachpool-portal/nachrichtendialog/nachrichtendialog-offener-bereich.tmpl |
Öffentlicher Bereich |
Globale Variablen (Redakteurs-Kontrolle)¶
Der Redakteur setzt die folgenden Variablen auf dem Dokument, das den Nachrichtendialog tragen soll. Leer = kein Dialog.
| Interner Bereich (289) | Öffentlicher Bereich (310) | Bedeutung |
|---|---|---|
nachrichtendialog |
nachrichtendialogPublic |
Schalter „Dialog aktiv" |
nachrichtendialogTitel |
nachrichtendialogTitelPublic |
Titel-Text |
nachrichtendialogInhalt |
nachrichtendialogInhaltPublic |
Inhalt (HTML erlaubt) |
nachrichtendialogExpiry |
nachrichtendialogExpiryPublic |
Millisekunden bis Dialog erneut gezeigt wird |
Beide Templates ersetzen %SACH*%-Platzhalter im Titel und Inhalt via
Include von Template 174 (data-filter.tmpl — Link-Modul):
$textintern = $GLOBALS["nachrichtendialogTitel"];
<we:include type="template" id="174" />
echo $textintern;
LocalStorage-Cooldown¶
Nach Klick auf „Gelesen":
localStorage.setItem('nachrichtendialogClosedData', JSON.stringify({
closed: true,
timestamp: new Date().getTime()
}));
Beim nächsten Aufruf:
var currentTime = new Date().getTime();
var expirationTime = modalClosedData.timestamp + ({nachrichtendialogExpiry});
if (currentTime < expirationTime) {
$('#nachrichtendialog').modal('hide'); // unterdrücken
} else {
localStorage.removeItem('nachrichtendialogClosedData');
$('#nachrichtendialog').modal('show'); // wieder anzeigen
}
→ Nach der Expiry-Dauer erscheint der Dialog erneut, auch wenn der Nutzer
ihn schon einmal geschlossen hat.
Integration: Nur nach Datenschutz-Zustimmung (intern)¶
Der interne Dialog hat einen zusätzlichen Guard:
→ Wird erst nach erfolgter Datenschutz-Einwilligung gezeigt (siehe Datenschutzeinwilligung).
Einbindung¶
Die Templates werden vom Master-Template (master.tmpl) automatisch auf allen
Seiten im jeweiligen Bereich eingebunden:
<we:ifRegisteredUser>
<we:include type="template" id="289" once="true" /> <!-- intern -->
<we:else />
<we:include type="template" id="310" once="true" /> <!-- offen -->
</we:ifRegisteredUser>
Zusätzlicher technischer Kniff: MutationObserver hält das Header-Padding konsistent, wenn Bootstrap das Modal öffnet:
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(m) {
$('#header-wrapper').css('padding-right', $('body').css('padding-right'))
});
});
observer.observe(document.getElementById('page-top'), {
attributes: true,
attributeFilter: ['style']
});
Siehe auch¶
- Datenschutz / Nutzungsvereinbarung
- Link-Modul — Template 174 (
data-filter.tmpl) - Master-Template — Einbindung