Yvonne17: Formular: Pflichtfelderprüfung und Dankeseite - Denkfehler?

Hallo zusammen,

ich habe mich an meinem ersten Perl Formular versucht und so richtig klappt mein Vorhaben nicht :-(

Die Idee: einer Downloadseite soll ein Formular vorgeschaltet werden, dass erst nachdem es ausgefüllt wurde auf die Downloadseite weiterleitet.

Also habe ich den Self HTML Perl Form-Mailer > http://aktuell.de.selfhtml.org/artikel/cgiperl/form-mail/ mit dem JavaScript zum Überprüfen von Formulardaten kombiniert > http://de.selfhtml.org/javascript/beispiele/formulareingaben.htm

Als "Dankeseite" habe ich die Downloadseite angegeben.

Wenn ich aber nun im Formular nichts eingebe und auf "weiter" klicke kommt zwar die gewünschte Meldung "Bitte Ihren Namen eingeben!" wenn ich dann aber OK klicke springt er nicht zurück sondern direkt auf die Downloadseite.

Kann mir vielleicht jemand einen Rat geben was ich falsch gemacht habe?
Hier die Codes:

<script type="text/javascript">

function chkFormular () {
if (document.Formular.name.value == "") {
alert("Bitte Ihren Namen eingeben!");
document.Formular.User.focus();
return false;
}

if (document.Formular.email.value == "") {
alert("Bitte Ihre E-Mail-Adresse eingeben!");
document.Formular.Mail.focus();
return false;
}
if (document.Formular.email.value.indexOf("@") == -1) {
alert("Keine E-Mail-Adresse!");
document.Formular.email.focus();
return false;
}
if (document.Formular.telefon.value == "") {
alert("Bitte geben Sie Ihre Telefonnummer ein.");
document.Formular.telefon.focus();
return false;
}
var chkZ = 1;
for (i = 0; i < document.Formular.telefon.value.length; ++i)
if (document.Formular.telefon.value.charAt(i) < "0" ||
document.Formular.telefon.value.charAt(i) > "9")
chkZ = -1;
if (chkZ == -1) {
alert("Bitte geben Sie eine gültige Telefonnummer ein.");
document.Formular.telefon.focus();
return false;
}
}

</script>

<form name="Formular" action="/cgi-bin/selfmailer.pl" method="post" onsubmit="return chkFormular()">
<input type="hidden" name="return" value="http://www.dankeseite.de">
<input type="hidden" name="delimiter" value=": ">
<input type="hidden" name="subject" value="Download Formular">

Firma*:<br />
<input type="text" name="firma" size="35"><br /><br />

Vor- und Nachname:<br />
<input type="text" name="name" size="35" required><br /><br />

E-Mail:<br />
<input type="text" name="email" size="35" required><br /><br />

Telefon:<br />
<input type="text" name="telefon" size="35" required><br /><br /><br />

<input type="submit" value="weiter">
<input type="reset" value="Eingaben l&ouml;schen">

</form>

#!/usr/bin/perl

-------> Individuelle Parameter des Skriptes - bitte anpassen!

--> SMTP-Programm zum Versenden der Mail:

$Sendmail_Prog = "/usr/lib/sendmail";

--> Ziel-Mailadresse, an die gesendet werden soll:

$mailto = 'meine mailadresse';

-------> Modul für CGI-Scripts einbinden:

use CGI;

-------> Modul für CGI-Scripts zum Einlesen der Formulardaten anwenden:

$query = new CGI;
@names = $query->param;

-------> interne Daten aus den erwarteten hidden-Feldern auslesen:

$delimiter = $query->param('delimiter'); # ---> Begrenzerzeichen zwischen name und value
$returnhtml = $query->param('return'); # ---> URL für Dankeseite
$subject = $query->param('subject'); # ---> E-Mail-Subject

-------> alle Whitespace-Zeichen (Leerzeichen, Tabulator, Newline) in Leerzeichen wandeln

VERHINDERT sonst möglichen MISSBRAUCH des Skripts

$subject =~ s/\s/ /g;

-------> Text der E-Mail aus den Formulardaten ermitteln:

$mailtext = "";
foreach(@names) {
$name = $_;
@values = "";
@values = $query->param($name);
if($name ne "return" && $name ne "subject" && $name ne "delimiter") {
foreach $value (@values) {
$mailtext = $mailtext.$name;
$mailtext = $mailtext.$delimiter;
$mailtext = $mailtext.$value."\n";
}
}
}

-------> E-Mail versenden:

open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailprogramm konnte nicht gestartet werden\n";
print MAIL "To: $mailto\n";
print MAIL "Subject: $subject\n\n";
print MAIL "$mailtext\n";
close(MAIL);

-------> Dankeseite an Browser senden:

print "Location: $returnhtml\n\n";

Ich wäre wirklich sehr dankbar wenn jemand eine Idee hat?! So langsam verzweifle ich :(

Viele Grüße
Yvonne

  1. Moin,

    das sieht alles sehr unstrukturiert aus. Die erste Struktur, die zu bauen ist, ist eine Parameter Kontrollstruktur. Lege dazu einen Schlüsselparameter fest, welcher den Ablauf steuert, z.B. 'senden':

    Sobald dieser Parameter in den POST-Daten enthalten ist, fragst Du alle anderen Parameter ab, welche für die Mail gebraucht werden, z.B. Abs.Email und den Text.

    Unabhängig davon bzw, generell schreibst Du diese Input-Werte wieder als Values in das Formular, damit ebendas bei fehlenden Eingaben wieder gezeigt werden kann (Formular => Template). Das nennt sich dann Affenformular. Beachte den Kontext, wenn Benutzereingaben wieder auf die Seite geschrieben werden (HTML::Entities).

    Ein Template für das Formular ermöglicht Dir auch, an den entsprechenden Labels den Text rot zu färben, wenn eine Eingabe fehlt.

    Wenn alle Eingaben richtig sind, baust du die Maildatei zusammen und übergibst die an sendmail, hier ist ein Beispiel dazu, wie einfach das gemacht werden kann.

    Verwende das Perl-Modul HTTP::Headers zum setzen der benötigten Response-Header, soll die Umleitung erfolgen, setze zusätzlich zum Location-Header den Status, z.B. 302 Found.

    In Deinem Fall möchte die Zielseite (Antwortseite) erst gezeigt werden, wenn die Mail raus ist. Es gibt zwei Möglichkeiten:

    • die Location ist an eine Session gekoppelt und wird nur dann die Inhalte ausliefern, wenn in der Session ein bestimmtes Flag gesetzt wurde (Mail wurde gesendet),
    • es wird nicht umgeleitet, sondern die Zielseite wird zur Laufzeit erstellt.

    Das wärs erst einmal im Wesentlichen und noch ein Tipp: Das JavaScript lass zunächst weg. Du kannst es zusätzlich und nachträglich einbauen, was den Komfort verbessert. Die Funktionalität muss ohne JS gegeben sein.

    Viele Grüße,
    Horst