Wichtig
- eingesetzte Version
- V5
- Fehlerbeschreibung
- Keine Fehlermeldung im Frontend
Beschreibung
Wenn ein Kunde im Checkout (checkout_payment.php) eine Zahlungsart wählt, die zusätzliche Validierungen erfordert (z.B. PayPal Kauf auf Rechnung das Geburtsdatum), und diese Validierung serverseitig fehlschlägt, wird dem Kunden im Frontend keine Fehlermeldung angezeigt. Die Seite lädt neu, aber der Kunde erhält kein Feedback, warum der Prozess nicht weitergeht. Dies führt unweigerlich zu Kaufabbrüchen.
Die für den Kunden bestimmte Fehlermeldung (z.B. "Pflichtangabe im Format TT.MM.JJJJ") erscheint stattdessen später zufällig im Admin-Bereich, wenn der Admin eine beliebige Seite neu lädt.
Schritte zur Reproduktion:
1. Einen Artikel in den Warenkorb legen und zum Checkout gehen.
2. Bis zur Seite der Zahlungsartenauswahl (checkout_payment.php) fortfahren.
3. Als Zahlungsart "Rechnung via PayPal" auswählen.
4. Das Feld für das Geburtsdatum leer lassen.
5. Auf den "Weiter"-Button klicken.
6. Erwartetes Verhalten: Auf der checkout_payment.php erscheint eine klare Fehlermeldung, die den Kunden auffordert, das Geburtsdatum einzugeben.
7. Tatsächliches Verhalten: Die Seite lädt neu, es wird keine Fehlermeldung angezeigt. Der Kunde steckt fest.
8. Verifizierung: Loggt man sich nun in den Admin-Bereich ein und aktualisiert eine beliebige Seite, wird die für den Kunden bestimmte Fehlermeldung dem Admin angezeigt.
Unsere Lösung (FAST Update-sicherer Workaround): Um das Problem zu beheben, ohne Core-Dateien zu verändern, haben wir eine eigene Funktions-Bibliothek (b2bweb.functions.php) erstellt, die am Ende der includes/application_top.php aufgerufen wird. In dieser Datei fangen wir die Nachrichten ab und übergeben sie als JSON-kodierte Konstante an Smarty.
1. Eigene Funktion in b2bweb.functions.php: Die Haupt-Initialisierungsfunktion wird erweitert, um die $_SESSION['messageToStack'] auszulesen, bevor der messageStack-Konstruktor sie leeren kann, und sie als JSON zu kodieren.
// In unserer b2b_initialize_context() Funktion:
$messages_array = [];
if (!empty($_SESSION['messageToStack'])) {
$messages_array = $_SESSION['messageToStack'];
// WICHTIG: Leere die Session-Variable, damit die Nachricht nicht erneut angezeigt wird.
unset($_SESSION['messageToStack']);
}
define('B2B_MESSAGES_JSON', json_encode($messages_array));
und im Template:
{* Dekodiere den JSON-String aus unserer Konstante zurück in ein Array *}
{$b2b_messages = $smarty.const.B2B_MESSAGES_JSON|json_decode:true}
{if $b2b_messages}
<div class="row">
<div class="col-12 messageStack">
{foreach from=$b2b_messages item=msg}
<p class="alert alert-danger w-100"><i class="bi bi-stop-circle-fill"> </i>{$msg.text}</p>
{/foreach}
</div>
</div>
{/if}
Alles anzeigen