• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Popup nach Formularbearbeitung (ohne Javascript)

hugofant

Neues Mitglied
Hallo,
ich habe ein wenig Erfahrung mit HTML/CSS und PHP, würde die Kenntnisse aber nicht mehr als "rudimentär" bezeichnen.
Bislang habe ich mich mehr mit Joomla und Wordpress beschäftigt, möchte aber jetzt wieder ein wenig mehr zurück an die Basis. Für ein kleines GeocachingProjekt habe ich mir daher folgendes überlegt:
Zum Abschließen des Geocaches muß ein Code eingegeben werden, der sich täglich ändert und auf der Webseite sollen die Leute verifizieren können, ob der Lösungsansatz stimmt bzw. sie richtig gerechnet haben.
Der Ablauf war so gedacht: ein Formular zur Eingabe der Daten, über "ACTION" wird eine PHP Datei aufgerufen zur Überprüfung der Eingabe und danach soll auf der ursprünglichen Seite angezeigt werden ob korrekt oder nicht (z.B. über ein Popup).
Zum Testen habe einfach mit einem Kontaktformular begonnen (Geocaching - Ryps)- das funkt soweit, allerdings finde ich keine Möglichkeit den Status "..erfolgreich verschickt.." irgendwie zurück zu liefern bzw. anzuzeigen....ein ModalWindow mit CSS habe ich erfolgreich getestet, allerdings funkt das nur mit Klick auf einen Button und nicht über PHP-Aufruf.
JavaScript will ich eigentlich nicht verwenden - hat ja nicht gerade den besten Ruf, ist auf vielen Browsern auch deaktivert.

Wäre für Tipps bzw. einen funktionierenden Ansatz sehr dankbar, und vielleicht sehe ich ja den Wald vor lauter Bäumen nicht....

Danke im Voraus und lG
 
Code:
<form id="contact-form" action="mail.php" method="POST">
    <div class="form-group mb-4">
        <input type="text" name="name" class="form-control" placeholder="Name" required="" />
    </div>
    <div class="form-group mb-4">
        <input type="email" name="email" class="form-control" placeholder="Email" required="" />
    </div>
    <div class="form-group mb-4">
        <input type="text" name="subject" class="form-control" placeholder="Betreff" required="" />
    </div>
    <div class="form-group mb-5">
        <textarea rows="8" name="message" class="form-control" placeholder="Nachricht..." required=""></textarea>
    </div>
    <div class="text-right">
        <button type="submit" class="btn btn-big btn-primary">Senden</button>
    </div>
</form>


<?php $name = $_POST['name'];
$email = $_POST['email'];
$your_form_text = $_POST['message'];
//line 1 fixes the line breaks - line 2 the slashes
$your_form_text = nl2br($your_form_text);
$your_form_text = stripslashes($your_form_text);
$message = "$your_form_text";
$recipient = "[email protected]";
$subject = $_POST['subject'];

$gotfrom = "From: $email";
$replyto = "Reply-To: $email";

// Building headers.
$headers = array();
$headers[] = $gotfrom;
$headers[] = $replyto;
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859';
$headers[] = 'X-Mailer: PHP/'. phpversion();

// Sending mail.

mail($recipient, $subject, $message, implode(PHP_EOL, $headers));

//echo "Thank You!";
//header("Location: {$_SERVER['HTTP_REFERER']}");
header("Location: contact.html");
exit;
?>


reicht das so?
 
Okay. Ich würde mich als erstes von der PHP mail()-Funktion verabschieden. Denn diese wird oftmals beim Empfänger als Spam erkannt. Ich würde entweder mit PHPMailer oder Swiftmailer & Co. arbeiten.

Ansonsten kannst Du mit header() ggf. mit header("Location: kontakt.php?success") weiterleiten und dann prüfen ob success als $_GET vergeben ist und eine Erfolgreich-Meldung anzeigen. Das wäre der einfachste Weg.

PHP:
if(isset($_GET['success']))
{
    // Dein Code - Meldung
}
 
Der Ablauf war so gedacht: ein Formular zur Eingabe der Daten, über "ACTION" wird eine PHP Datei aufgerufen zur Überprüfung der Eingabe und danach soll auf der ursprünglichen Seite angezeigt werden ob korrekt oder nicht (z.B. über ein Popup).
Popups gibt es quasi nicht mehr. Für kleine(!) Formulare kannst du eine Dialogbox verwenden, d.h. ein Element was über den eigentlichen Seiteninhalt gelegt wird (geht aber nur für kleine Formulare da es sonst bei kleinen Displays unbedienbar wird) - allerdings …
JavaScript will ich eigentlich nicht verwenden - hat ja nicht gerade den besten Ruf, ist auf vielen Browsern auch deaktivert.
… hast du mit dieser Vorgabe verloren. Irgendwelche Aktionen innerhalb einer Seite gehen nur mit Javascript.
Javascript ist quasi nicht mehr deaktiviert, du musst aber trotzdem davon ausgehen dass es nicht verfügbar ist (es kann auch sein dass aufgrund schlechter Verbindung die js-Datei einfach nicht geladen werden kann), die Funktion muss also auch ohne JS funktionieren bzw. darf in dem Fall nicht zu sehen sein.
<div class="form-group mb-4"> <input type="text" name="name" class="form-control" placeholder="Name" required="" /> </div>
Das Formular ist kaputt, da fehlt die Beschriftung der Eingabefelder - und nein, das placeholder-Attribut ersetzt das nötige label-Element nicht.
$headers[] = 'Content-type: text/html; charset=iso-8859';
iso-8859 was? da fehlt noch ein -1 o.ä. - veraltet ist es aber trotzdem, grundsätzlich sollte man immer und überall UTF-8 verwenden.
mail($recipient, $subject, $message, implode(PHP_EOL, $headers));
Wie sveka schon schrieb: vergiss mail() und verwende eine Mailerklasse (z.B. PHPMailer), das spart dir potentiellen Ärger mit falsch formatieren Mails die deshalb möglicherweise eher als Spam eingestuft werden. Übrigens: PHP_EOL als Trenner der Headerzeilen ist falsch, das muss immer \r\n sein - aber um sowas kümmert sich eine Mailerklasse auch.
//header("Location: {$_SERVER['HTTP_REFERER']}");
Ja, ich weiß dass die Zeile auskommentiert ist, aber: vergiss den Referrer, er ist unbrauchbar um zu erkennen wo der Benutzer her kam.
Wenn nach dem PHP-Code nicht noch HTML o.ä. kommt sollte das ?> grundsätzlich weggelassen werden.
 
@sveka: Danke für die rasche Antwort - mail lasse ich im Moment so, war ja nur zum Testen...und mein Provider hat offenbar kein Problem damit (Mails kommen direkt in der Inbox an)

Den Rest habe ich auch nicht ganz verstanden, habe nun aber wieder etwas, wo ich mich einlesen kann ;-)

Eine Verständnisfrage: die Kontaktseite ist aktuell eine HTML Seite...gehe davon aus, dass sie bei deinem Ansatz auf PHP "umgebaut" werden muss......in welcher Form bzw. wo wird dann die "Meldung" angezeigt? Ist das dann als Popup bzw. an einer definierten Stelle am Schirm möglich...oder als "Overlay" der "ursprünglichen" Seite?
 
@tk1234: hmm, danke für die vielen Hinweise....aber irgendwie hilft mir das bei meiner Frage nicht wirklich weiter.
… hast du mit dieser Vorgabe verloren. Irgendwelche Aktionen innerhalb einer Seite gehen nur mit Javascript.
Javascript ist quasi nicht mehr deaktiviert, du musst aber trotzdem davon ausgehen dass es nicht verfügbar ist (es kann auch sein dass aufgrund schlechter Verbindung die js-Datei einfach nicht geladen werden kann), die Funktion muss also auch ohne JS funktionieren bzw. darf in dem Fall nicht zu sehen sein.
...und das verstehe ich ja schon mal gar nicht. Einerseits sagst du ich kann auf Javascript gar nicht verzichten, allerdings muss ich davon ausgehen, dass es nicht verfügbar ist??
 
...und das verstehe ich ja schon mal gar nicht. Einerseits sagst du ich kann auf Javascript gar nicht verzichten, allerdings muss ich davon ausgehen, dass es nicht verfügbar ist??
"Davon ausgehen" ist vielleicht etwas falsch formuliert, du musst halt damit rechnen dass JS (aus welchen Gründen auch immer) nicht verfügbar ist. Meist kann man wohl davon ausgehen dass JS verfügbar ist, für den Fall dass das nicht der Fall ist, darfst du die Benutzer aber nicht im Regen stehen lassen: einen Button der nur mit JS eine Funktion hat, sollten die Benutzer ohne JS garnicht erst zu sehen bekommen.
 
@tk1234: du hast gesehen:

ich habe ein wenig Erfahrung mit HTML/CSS und PHP, würde die Kenntnisse aber nicht mehr als "rudimentär" bezeichnen.
Ich investiere in dieses Projekt recht viel Zeit, damit andere Spaß und Freude habe und das vollkommen unentgeltlich.
Anstatt mir ständig zu sagen, was falsch an meinem Code/Wissen/Einschätzungen ist, wäre mir mehr damit geholfen, wenn ich gezeigt bekäme, wie es richtig geht.
Mir sind meine unzureichenden Kenntnisse durchaus bewusst und ich habe gehofft hier entsprechend Unterstützung zu bekommen um das Projekt dennoch erfolgreich abschließen zu können.
Es wäre schön, wenn du Lust und Laune hast hier ein wenig mit zu gestalten.
 
@tk1234: du hast gesehen:


Ich investiere in dieses Projekt recht viel Zeit, damit andere Spaß und Freude habe und das vollkommen unentgeltlich.
Anstatt mir ständig zu sagen, was falsch an meinem Code/Wissen/Einschätzungen ist, wäre mir mehr damit geholfen, wenn ich gezeigt bekäme, wie es richtig geht.
Mir sind meine unzureichenden Kenntnisse durchaus bewusst und ich habe gehofft hier entsprechend Unterstützung zu bekommen um das Projekt dennoch erfolgreich abschließen zu können.
Es wäre schön, wenn du Lust und Laune hast hier ein wenig mit zu gestalten.
Ich habe Dir doch oben schon 2 Ansätze geliefert.

1. am besten eine Mailerklasse nutzen
2. dein Ziel der Funktion header() ändern und dann mit if ... prüfen und deinen gewünschten Effekt / Meldung anzeigen.
 
@sveka:
habe es jetzt mal soweit hinbekommen: contact.html wurde auf contact.php umbenannt und die Abfrage eingebaut. Der Sendebutton wird nach dem Abschicken durch die Bestätigung ersetzt (das Popup ist nur zu Testzwecken drin) - mail wird irgendwann in der Zukuft umgestellt, da liegt aktuell nicht der Fokus drauf.

Code:
<form id="contact-form" action="mail.php" method="POST">
                            <div class="form-group mb-4">
                                <input type="text" name="name" class="form-control" placeholder="Name" required="" />
                            </div>
                            <div class="form-group mb-4">
                                <input type="email" name="email" class="form-control" placeholder="Email" required="" />
                            </div>
                            <div class="form-group mb-4">
                                <input type="text" name="subject" class="form-control" placeholder="Betreff" required="" />
                            </div>
                            <div class="form-group mb-5">
                                <textarea rows="8" name="message" class="form-control" placeholder="Nachricht..." required=""></textarea>
                            </div>

                            <?php
                                if(isset($_GET['success']))
                                {
                                    echo "<div class='text-right'>Nachricht verschickt</div>";


                                    function function_alert($message) {
                                        echo "<script>alert('$message');</script>";
                                    }
                                    function_alert("Nachricht wurde verschickt");
                                }
                                else
                                {
                                    echo "<div class='text-right'>
                                          <button type='submit' class='btn btn-big btn-primary'>Senden</button>
                                          </div>";
                                }
                            ?>
</form>



.
.
// Building headers.
$headers = array();
$headers[] = $gotfrom;
$headers[] = $replyto;
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=UTF-8';
$headers[] = 'X-Mailer: PHP/'. phpversion();

// Sending mail.

//mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
//mail($recipient, $subject, $mailheader) or die("Error!");

mail($recipient, $subject, $message, implode("\r\n", $headers));

//echo "Thank You!";
//header("Location: {$_SERVER['HTTP_REFERER']}");
//header("Location: contact.php?success=done");
header("Location: contact.php?success");

@tk1234: ich gebe zu, da sind auch viele Erklärungen dabei, aber wenn ich lesen "Das Formular ist kaputt", wo es doch sehr wohl funktioniert oder "?>" am Ende einfach weglassen, wo doch üblicherweise geöffnet "tags" immer auch zu schließen sind, dann ist das für mich sehr schwer zu verstehen bzw. würde ich da ein wenig mehr an Hintergrundinfos benötigen.
Bez. labels habe ich mich nun schon etwas eingelesen, finde aber nicht, dass es "required" ist, sondern da wird nur von "some major advantages" gesprochen -schaue aber noch weiter.
...und der ganze HTML Code stammt eigentlich von TemplateMo, ist also nicht auf meinem Mist gewachsen.
Auch der PHP Teil ist zusammenkopiert von mehreren "schlauen" Seiten.
Für mich also schwer nachzuvollziehen, dass offenbar so viel Mist veröffentlicht wird.
 
Zuletzt bearbeitet:
"Das Formular ist kaputt", wo es doch sehr wohl funktioniert
Es funktioniert scheinbar, Stichwort Barrierefreiheit: wenn der Besucher auf irgendwelche Hilfsmittel beim "betrachten" von Internetseiten angewiesen ist, kann die Software den Eingabefeldern keine Beschriftung zuordnen. Auch ein "normaler" Benutzer weiß nicht mehr welches Feld welches war da die "Beschriftung" weg ist (ja, über den Inhalt lässt es sich in dem Fall wohl noch halbwegs herausbekommen, sinnvoll ist trotzdem was anderes). Um solche Fehler zu finden ist auch Lighthouse ganz hilfreich (das ist in Chrome und Vivaldi (evtl. auch Opera+Edge) eingebaut: Entwicklertools (F12) öffnen und im Tab Lighthouse die Kategorie Accessibility überprüfen lassen.
"?>" am Ende einfach weglassen
Ich habe nie gesagt dass alle Hinweise wichtig wäre, aber das steht sogar im Handbuch (der Absatz nach der Hinweis-Box).
Für mich also schwer nachzuvollziehen, dass offenbar so viel Mist veröffentlicht wird.
Das ist aber leider so und gerade für Anfänger ist es leider schwer nachzuvollziehen was Müll ist und was nicht …
 
Ähmmmm, das ist ja Quatsch
Code:
function function_alert($message) {
   echo "<script>alert('$message');</script>";
}

function_alert("Nachricht wurde verschickt");
Eine Funktion in einem if-Block, die genau einmal in diesem Block aufgerufen wird, und die dann nur eine Zeile hat. Da kann ich auch gleich das echo hinschreiben, anstatt eine Funktion daraus zu machen.
 
@m.scatello: Du hast vollkommen recht und ist mir auch klar, aber ich habe ja geschrieben, dass es nur zu Testzwecken drin ist.

@Alle: ich möchte mich ausdrücklich für die rasche und tatkräftige Unterstützung bedanken und auch die Bereitschaft die Informationen auf mein Level herunter zu brechen.

Noch eine Verständnisfrage: ist es möglich die URL von "contact.php?success" bei einem refresh wieder auf "contact.php" umzuschreiben, oder wäre es da nicht schlauer, die mail.php z.B. als include reinzuholen und die Verarbeitung direkt auf der Seite zu machen....wie müsste in diesem Fall das action-Attribut aussehen - action="", action="#", action="?" oder ganz weglassen?
 
Zurück
Oben