Zum Inhalt

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:

if (isset($einwilligung) && $einwilligung == 1) {
    // ... Dialog rendern ...
}

→ 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