von Thomas Salvador.
In der vorherigen Ausgabe hatten wir die mit JavaScript realisierte DropDown-Box-Navigation kennengelernt.
Wir schlossen mit der Analyse an, dass ihr Vorteil sei, rasch zu reagieren und weiterzuleiten. Als Nachteil fanden wir, dass diese Art der Realisierung eben nur für einen Teil der Besucher funktioniert (diejenigen, die JavaScript aktiviert haben).
In diesem Artikel stelle ich eine weitere Realisierung vor, die nicht auf JavaScript basiert, sondern auf einem CGI bzw. genauer auf einem Programm welcher über das CGI (Common Gateway Interface) mit dem WebServer kommunizieren wird. Da es dort schön einfach geht, wird das Programm in Perl realisiert werden.
Der Ansatz bleibt natürlich gleich. Wir haben ein Formular mit einer DropDown-Box. Die Optionen dieser DropDown-Box sind mit den Zielen beschriftet, ihre Werte sind die Zieladressen.
<form action="URL des programms" method="post"> <select name="goto"> <option value="https://www.brauchbar.de/index.html">Bitte wählen</option> <option value="https://www.brauchbar.de/index.html">Homepage</option> <option value="https://www.brauchbar.de/wd/index.html">Newsletter</option> <option value="https://www.brauchbar.de/wd/online/index.html">- Archiv</option> </select> <input type="submit" value="go" /> </form>
Das genügt nach wie vor zur Demonstration.
Natürlich muss nun als action das Programm eingetragen werden, welches die Formulardaten verarbeiten wird. Als Method sollte post verwendet werden, damit die Werte nicht in der Adresszeile erscheinen.
Das Programm ist natürlich auch sehr kompakt. Es sind nur zwei Schritte durchzuführen:
#! /usr/bin/perl # 1. Schritt: lese Daten. # 2. Schritt: leite weiter.
Die erste Zeile des Programms enthält immer die Position des Perl-Übersetzers. Wenn dieser Wert bei Ihnen nicht stimmt, können Sie (wenn Sie einen TELNET-Account haben) die Maschine fragen, wo er ist:
whereis perl
Ansonsten oder wenn das nicht funktioniert, konsultieren Sie bitte Ihren Admin.
Aus dem Artikel "Umleitungsscript in Perl" wissen wir, dass Daten, die via get übergeben wurden, in einer Umgebungsvariablen geliefert werden.
Bei post ist das anders. Dort kommen die Daten nicht über Umgebungsvariablen, sondern über die sog. Standardeingabe.
Siehe dazu den Artikel "Übergabe von Parametern über das CGI" in dieser Ausgabe. Wir benutzen hier die dort entwickelte Routine parseinput(), die uns das Leben hier leicht macht.%P = parseinput(); ## hole Parameter in einen Hash P
Das Weiterleiten hatten wir bereits in "Umleitungsscript in Perl" gelernt. Das Programm teilt dem Browser als Antwort die Adresse mit, welches Dokument r laden soll. Wie teilt man dem Browser ein Ergebnis etwas mit - sei es eine eigengenerierte HTML- oder GIF-Datei oder auch -wie hier - der Positionsangaben?
Das ist das Schöne am Common Gate Interface. Unser Programm liest oben von der Standardeingabe, um seine Dateien zu bekommen und es wird jetzt auf die Standardausgabe schreiben, um Dinge an den Browser zu schicken.
Um die restlichen Details, wie es von dort zum Browser des Benutzers kommt, kümmert sich wieder der Webserver.
Wir müssen nur an den URL kommen, der allerdings aus unserem Layout bzw. aus dem Formular folgt.
Hat unsere DropDown-Box den Namen goto, so wird der Ziel-URL in der Form goto=URL geliefert und steht innerhalb des Programms (nach unserer Übergabe/Auseinandernahme der Eingabe=perseinput) in $P{'goto'} zur Verfügung. Hübsch nicht?
#! /usr/bin/perl ## DropDown-Box mit CGI - Weiterleitung ueber Formular ## (c) 2000 Thomas Salvador, brauchbar.de - Freeware ## Das Script ist frei verwendbar, solange diese Meldung ## unveraendert erhalten bleibt. ## Dokumentation unter https://brauchbar.de/artikel/perl/dropdown-box-navigation-mit-cgi %P = parseinput(); print "Location: " . $P{'goto'} . "\n\n"; ##------------------------------------------------------------------ ## Subroutinen sub parseinput() { ## Syntax: %P = &parseinput(); # liefere Parameter nach P. ## #################################################################### ## parseinput is copyright 2000 Thomas Salvador, brauchbar.de ## Das Routine ist frei verwendbar, solange diese Meldung ## unveraendert erhalten bleibt. ## Dokumentation unter https://brauchbar.de/artikel/perl/uebergabe-von-parametern-ueber-das-cgi if ($ENV{'REQUEST_METHOD'} eq 'GET') { my $EINGABE = $ENV{'QUERY_STRING'}; } else { read(STDIN, $EINGABE, $ENV{'CONTENT_LENGTH'}); } my @fields = split(/[&;]/,$EINGABE); my $v; my $k; my %P=(); foreach $i (0 .. $#fields) { $fields[$i] =~ s/\+/ /g; ($k, $v) = split(/=/,$fields[$i],2); $v =~ s/%(..)/pack("c",hex($1))/ge; if (defined($P{$k})) { $P{$k} = $P{$k} . "\000" . $v; } else { $P{$k} = $v; } } return %P; }
Funktioniert immer, da unabhängig vom Client der Besucher.
Reagiert träger.