breedmaster:anleitung_formularmailer_weiterleitung

Anleitung Weiterverarbeitung von Formulardaten auf der Bestätigungsseite

Nach der Übermittlung eines Formulars werden die eingegebenen Daten automatisch in einer Session-Variable gespeichert. Dies ermöglicht es, auf der Bestätigungsseite auf die übermittelten Daten zuzugreifen und diese dem Nutzer anzuzeigen oder weiterzuverarbeiten.

Der Formularmailer speichert alle übermittelten Formulardaten in der Session-Variable $_SESSION['Formularmailer-Data']. Diese Daten können über die API-Datei api-session-formularmailer.php abgerufen werden.

Ablauf:

  1. Nutzer füllt das Formular aus und sendet es ab
  2. Formularmailer speichert die Daten in der Session
  3. Weiterleitung zur Bestätigungsseite (definiert über frm_forward)
  4. Bestätigungsseite ruft die Daten über die API ab und zeigt diese an
<form action="cmd.php?id=-45" method="post">
    <input name="formular" type="hidden" value="Kontaktformular" />
    <input name="frm_forward" type="hidden" value="showpage.php?seite=bestaetigung_kontakt" />
    <input name="frm_notify_email" type="hidden" value="info@example.de" />
 
    <div class="mb-3">
        <label for="name" class="form-label">Name <span class="text-danger">*</span></label>
        <input type="text" class="form-control" id="name" name="name" required>
    </div>
 
    <div class="mb-3">
        <label for="email" class="form-label">E-Mail <span class="text-danger">*</span></label>
        <input type="email" class="form-control" id="email" name="email" required>
    </div>
 
    <div class="mb-3">
        <label for="anfrage" class="form-label">Ihre Anfrage <span class="text-danger">*</span></label>
        <textarea class="form-control" id="anfrage" name="anfrage" rows="5" required></textarea>
    </div>
 
    <button type="submit" class="btn btn-primary">Absenden</button>
</form>

Hinweis: Beachten Sie, dass im CMS keine Head-/Body-Tags zulässig sind!

Erstellen Sie im CMS einen neuen Artikel mit dem Namen bestaetigung_kontakt und fügen folgenden Code ein:

    <style>
        .confirmation-box {
            background-color: #d4edda;
            border: 1px solid #c3e6cb;
            border-radius: 5px;
            padding: 20px;
            margin: 20px 0;
        }
        .data-table {
            width: 100%;
            margin-top: 20px;
        }
        .data-table th {
            text-align: left;
            padding: 8px;
            background-color: #f8f9fa;
            width: 30%;
        }
        .data-table td {
            padding: 8px;
        }
        .loading {
            color: #6c757d;
        }
        .error {
            color: #dc3545;
        }
    </style>
    <div class="confirmation-box">
        <h2>✓ Vielen Dank für Ihre Anfrage!</h2>
        <p>Wir haben folgende Daten von Ihnen erhalten:</p>
        <div id="output" class="loading">Lade Daten...</div>
    </div>
 
    <script>
        (function() {
            var output = document.getElementById('output');
 
            fetch('api-session-formularmailer.php', { credentials: 'same-origin' })
                .then(function(response) {
                    if (!response.ok) {
                        throw new Error('Fehler beim Laden der Daten: ' + response.status);
                    }
                    return response.json();
                })
                .then(function(json) {
                    if (!json.success) {
                        output.innerHTML = '<p class="error">' + (json.message || 'Keine Daten verfügbar.') + '</p>';
                        return;
                    }
 
                    var data = json.data || {};
                    var name = data.name || '(nicht angegeben)';
                    var email = data.email || '(nicht angegeben)';
                    var anfrage = data.anfrage || '(nicht angegeben)';
 
                    var html = '<table class="data-table">';
                    html += '<tr><th>Name:</th><td>' + escapeHtml(name) + '</td></tr>';
                    html += '<tr><th>E-Mail:</th><td>' + escapeHtml(email) + '</td></tr>';
                    html += '<tr><th>Anfrage:</th><td>' + escapeHtml(anfrage).replace(/\n/g, '<br>') + '</td></tr>';
                    html += '</table>';
                    html += '<p style="margin-top: 20px;">Wir werden uns schnellstmöglich bei Ihnen melden.</p>';
 
                    output.innerHTML = html;
                })
                .catch(function(error) {
                    output.innerHTML = '<p class="error">' + error.message + '</p>';
                });
 
            function escapeHtml(text) {
                var div = document.createElement('div');
                div.textContent = text;
                return div.innerHTML;
            }
        }());
    </script>

Dieses Beispiel zeigt ein Anmeldeformular für eine Veranstaltung, bei dem mehrere Workshops ausgewählt werden können.

<form action="cmd.php?id=-45" method="post">
    <input name="formular" type="hidden" value="Veranstaltungsanmeldung" />
    <input name="frm_forward" type="hidden" value="showpage.php?seite=bestaetigung_anmeldung" />
    <input name="frm_notify_email" type="hidden" value="veranstaltung@example.de" />
 
    <div class="mb-3">
        <label for="vorname" class="form-label">Vorname <span class="text-danger">*</span></label>
        <input type="text" class="form-control" id="vorname" name="vorname" required>
    </div>
 
    <div class="mb-3">
        <label for="nachname" class="form-label">Nachname <span class="text-danger">*</span></label>
        <input type="text" class="form-control" id="nachname" name="nachname" required>
    </div>
 
    <div class="mb-3">
        <label for="email" class="form-label">E-Mail <span class="text-danger">*</span></label>
        <input type="email" class="form-control" id="email" name="email" required>
    </div>
 
    <div class="mb-3">
        <label class="form-label">Workshop-Auswahl <span class="text-danger">*</span></label>
        <div class="form-check">
            <input class="form-check-input" type="checkbox" name="workshops[]" value="Grundlagen der Hundeerziehung" id="ws1">
            <label class="form-check-label" for="ws1">Grundlagen der Hundeerziehung</label>
        </div>
        <div class="form-check">
            <input class="form-check-input" type="checkbox" name="workshops[]" value="Agility für Anfänger" id="ws2">
            <label class="form-check-label" for="ws2">Agility für Anfänger</label>
        </div>
        <div class="form-check">
            <input class="form-check-input" type="checkbox" name="workshops[]" value="Erste Hilfe am Hund" id="ws3">
            <label class="form-check-label" for="ws3">Erste Hilfe am Hund</label>
        </div>
        <div class="form-check">
            <input class="form-check-input" type="checkbox" name="workshops[]" value="Hundeernährung" id="ws4">
            <label class="form-check-label" for="ws4">Hundeernährung</label>
        </div>
    </div>
 
    <div class="mb-3">
        <label for="bemerkung" class="form-label">Bemerkungen</label>
        <textarea class="form-control" id="bemerkung" name="bemerkung" rows="3"></textarea>
    </div>
 
    <button type="submit" class="btn btn-primary">Jetzt anmelden</button>
</form>

Erstellen Sie im CMS einen neuen Artikel mit dem Namen bestaetigung_anmeldung und fügen folgenden Code ein:

    <style>
        .confirmation-box {
            background-color: #d4edda;
            border: 1px solid #c3e6cb;
            border-radius: 5px;
            padding: 20px;
            margin: 20px 0;
        }
        .data-table {
            width: 100%;
            margin-top: 20px;
        }
        .data-table th {
            text-align: left;
            padding: 8px;
            background-color: #f8f9fa;
            width: 30%;
            vertical-align: top;
        }
        .data-table td {
            padding: 8px;
        }
        .workshop-list {
            list-style-type: none;
            padding-left: 0;
            margin: 0;
        }
        .workshop-list li {
            padding: 5px 0;
        }
        .workshop-list li:before {
            content: "✓ ";
            color: #28a745;
            font-weight: bold;
        }
        .loading {
            color: #6c757d;
        }
        .error {
            color: #dc3545;
        }
    </style>
    <div class="confirmation-box">
        <h2>✓ Ihre Anmeldung war erfolgreich!</h2>
        <p>Folgende Daten haben wir von Ihnen erhalten:</p>
        <div id="output" class="loading">Lade Daten...</div>
    </div>
 
    <script>
        (function() {
            var output = document.getElementById('output');
 
            fetch('api-session-formularmailer.php', { credentials: 'same-origin' })
                .then(function(response) {
                    if (!response.ok) {
                        throw new Error('Fehler beim Laden der Daten: ' + response.status);
                    }
                    return response.json();
                })
                .then(function(json) {
                    if (!json.success) {
                        output.innerHTML = '<p class="error">' + (json.message || 'Keine Daten verfügbar.') + '</p>';
                        return;
                    }
 
                    var data = json.data || {};
                    var vorname = data.vorname || '(nicht angegeben)';
                    var nachname = data.nachname || '(nicht angegeben)';
                    var email = data.email || '(nicht angegeben)';
                    var bemerkung = data.bemerkung || '(keine Bemerkungen)';
                    var workshops = data.workshops || [];
 
                    // Array-Prüfung: Wenn workshops ein String ist, in Array umwandeln
                    if (typeof workshops === 'string') {
                        workshops = [workshops];
                    }
 
                    var html = '<table class="data-table">';
                    html += '<tr><th>Vorname:</th><td>' + escapeHtml(vorname) + '</td></tr>';
                    html += '<tr><th>Nachname:</th><td>' + escapeHtml(nachname) + '</td></tr>';
                    html += '<tr><th>E-Mail:</th><td>' + escapeHtml(email) + '</td></tr>';
                    html += '<tr><th>Gewählte Workshops:</th><td>';
 
                    if (workshops.length > 0) {
                        html += '<ul class="workshop-list">';
                        for (var i = 0; i < workshops.length; i++) {
                            html += '<li>' + escapeHtml(workshops[i]) + '</li>';
                        }
                        html += '</ul>';
                    } else {
                        html += '<em>Keine Workshops ausgewählt</em>';
                    }
 
                    html += '</td></tr>';
                    html += '<tr><th>Bemerkungen:</th><td>' + escapeHtml(bemerkung).replace(/\n/g, '<br>') + '</td></tr>';
                    html += '</table>';
                    html += '<p style="margin-top: 20px;"><strong>Sie erhalten in Kürze eine Bestätigungs-E-Mail.</strong></p>';
 
                    output.innerHTML = html;
                })
                .catch(function(error) {
                    output.innerHTML = '<p class="error">' + error.message + '</p>';
                });
 
            function escapeHtml(text) {
                var div = document.createElement('div');
                div.textContent = text;
                return div.innerHTML;
            }
        }());
    </script>

Hinweis: Beachten Sie, dass im CMS keine Head-/Body-Tags zulässig sind!

Alle Formulardaten werden in $_SESSION['Formularmailer-Data'] als assoziatives Array gespeichert. Die Schlüssel entsprechen den name-Attributen der Formularfelder.

Beispiel:

// Inhalt von $_SESSION['Formularmailer-Data'] nach dem ersten Formular:
Array (
    [name] => Max Mustermann
    [email] => max@example.de
    [anfrage] => Ich interessiere mich für...
)
 
// Inhalt nach dem zweiten Formular mit Checkboxen:
Array (
    [vorname] => Maria
    [nachname] => Musterfrau
    [email] => maria@example.de
    [workshops] => Array (
        [0] => Grundlagen der Hundeerziehung
        [1] => Erste Hilfe am Hund
    )
    [bemerkung] => Ich freue mich auf die Veranstaltung
)

Die Datei api-session-formularmailer.php gibt die Session-Daten als JSON zurück:

<?php
declare(strict_types=1);
 
if (session_status() === PHP_SESSION_NONE)
{
    @session_start();
}
 
header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
 
if ($_SERVER['REQUEST_METHOD'] !== 'GET')
{
    http_response_code(405);
    header('Allow: GET');
    echo json_encode([
        'success' => false,
        'message' => 'Nur GET-Anfragen sind erlaubt.'
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}
 
$data = $_SESSION['Formularmailer-Data'] ?? null;
 
if ($data === null)
{
    http_response_code(404);
    echo json_encode([
        'success' => false,
        'data' => null,
        'message' => 'Keine Formulardaten in dieser Sitzung vorhanden.'
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}
 
$payload = json_encode([
    'success' => true,
    'data' => $data
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
 
if ($payload === false)
{
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Fehler bei der JSON-Kodierung.'
    ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit;
}
 
echo $payload;
exit;

JSON-Antwort bei Erfolg:

{
    "success": true,
    "data": {
        "vorname": "Maria",
        "nachname": "Musterfrau",
        "email": "maria@example.de",
        "workshops": ["Grundlagen der Hundeerziehung", "Erste Hilfe am Hund"],
        "bemerkung": "Ich freue mich auf die Veranstaltung"
    }
}

JSON-Antwort bei fehlenden Daten:

{
    "success": false,
    "data": null,
    "message": "Keine Formulardaten in dieser Sitzung vorhanden."
}

Die Formulardaten können in E-Mail-Templates verwendet werden. Auf der Bestätigungsseite haben Sie Zugriff auf die gleichen Daten und können diese entsprechend anpassen.

  • Session-Lebensdauer: Die Formulardaten bleiben nur für die aktuelle Session verfügbar. Sobald der Nutzer den Browser schließt oder die Session abläuft, sind die Daten nicht mehr abrufbar.
  • Sicherheit: Alle ausgegeben Daten sollten mit escapeHtml() (JavaScript) bzw. htmlspecialchars() (PHP) gegen XSS-Angriffe geschützt werden.
  • Arrays: Checkbox-Gruppen und Multi-Select-Felder werden als Arrays übermittelt. Prüfen Sie immer, ob ein Wert ein Array ist, bevor Sie darauf zugreifen.
  • Leere Werte: Nicht ausgefüllte Formularfelder werden möglicherweise nicht in die Session übernommen. Verwenden Sie daher immer Fallback-Werte.
  • API-Verfügbarkeit: Die API-Datei api-session-formularmailer.php muss im Root-Verzeichnis Ihrer Installation verfügbar sein.
ProblemLösung
„Keine Formulardaten in dieser Sitzung vorhanden“Stellen Sie sicher, dass das Formular korrekt übermittelt wurde und die Weiterleitung funktioniert hat. Überprüfen Sie, ob Cookies aktiviert sind.
Daten werden nicht angezeigtÖffnen Sie die Browser-Konsole (F12) und prüfen Sie auf JavaScript-Fehler. Stellen Sie sicher, dass die API-Datei erreichbar ist.
Array-Werte werden nicht korrekt angezeigtPrüfen Sie, ob der Feldname mit [] endet (z. B. workshops[]) und ob die JavaScript-Auswertung Arrays korrekt verarbeitet.
Umlaute werden falsch dargestelltStellen Sie sicher, dass alle Dateien in UTF-8 codiert sind und die entsprechenden Meta-Tags gesetzt sind.
  • breedmaster/anleitung_formularmailer_weiterleitung.txt
  • Zuletzt geändert: 03.10.2025 18:43
  • von Manfred Link