@imho
Hier ist eine Beispielimplementierung mit CGI::Application. Wie es besser wäre.
Als erstes unser Hauptmodul was alles macht.
/srv/Pizza.pm
package Pizza;
# Core Module
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
# CPAN Module
# Vererbung
use base 'CGI::Application';
# Unsere Setup Routine, wird bei jedem Query ausgeführt
sub setup {
my ($self) = @_;
$self->mode_param('rm' ); # variable das den Runmode angibt
$self->start_mode('show' ); # Der Start mode
$self->tmpl_path ('/srv/templates'); # Pfad wo die Templates liegen
$self->run_modes ( # Unsere Runmodes mit Suborutinen verknüpfen
'show' => 'show',
'bestellung' => 'bestellung',
);
}
# Unser show runmode. Dies ist der StartRunmode
# wird also angezeigt wenn kein Runmode angegeben wurde
sub show {
my ($self) = @_;
# Da dies mehr oder weniger eine Statische Seite ist.
# Wird geladen und sofort das gerenderte Template zurück gegeben
return $self->load_tmpl->output;
}
# Unser "bestellung" Runmode, wertet eine bestellung aus
sub bestellung {
my ($self) = @_;
# CGI Objekt und HTML::Template Objekt laden
my $cgi = $self->query;
my $template = $self->load_tmpl;
# Uebergebene Werte auslesen
my @pizza = $cgi->param('pizza');
my $extra = $cgi->param('extra');
# Pizza Array aufbereiten fuer HTML Template
# muss bei TT nicht gemacht werden
@pizza = map +{ pizza => $_ }, @pizza;
# Die Werte unserem Template Objekt übergeben
$template->param(
pizza => \@pizza,
extra => $extra,
);
# Das gerenderte Template zurück geben
return $template->output;
}
1;
Jetzt unsere Templates:
/srv/templates/header.html
<html>
<head>
<title>Pizza bestellen - Formulardaten mit Perl auswerten.</title>
</head>
<body>
/srv/templates/footer.html
</body>
</html>
/srv/templates/show.html
<TMPL_INCLUDE NAME="header.html">
<h2> Welche Pizza Wuenschen Sie?</h2>
<p>Kreuzen Sie die gewünschten Zutaten an:</p>
<form action="/cgi-bin/pizza" method="POST">
<input type="hidden" name="rm" value="bestellung" />
<p>
<input type="checkbox" name="pizza" value="Margherita Spezial"> Margherita Spezial<br />
<input type="checkbox" name="pizza" value="Tonno mit Zwiebeln"> Tonno mit Zwiebeln<br />
<input type="checkbox" name="pizza" value="Hawaii"> Hawaii
</p>
<p> Extrawunsch: <input name="extra" size="50"></p>
<input type="submit" value="Abschicken">
</form>
<TMPL_INCLUDE NAME="footer.html">
/srv/templates/bestellung.html
<TMPL_INCLUDE NAME="header.html">
<h2>Ihre Bestellung</h2>
<p>Sie haben folgende Pizzen bestellt:</p>
<TMPL_LOOP NAME="pizza">
<p> <TMPL_VAR NAME="pizza" ESCAPE="HTML"> </p>
</TMPL_LOOP>
<p>Extrawunsch: <TMPL_VAR NAME="extra" ESCAPE="HTML"> </p>
<TMPL_INCLUDE NAME="footer.html">
Jetzt unser Controller Skript:
/usr/lib/cgi-bin/pizza
#!/usr/bin/perl -T
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
use lib '/srv/';
use CGI::Carp qw/fatalsToBrowser/;
use Pizza;
my $webapp = Pizza->new();
$webapp->run();
Das Controller Skript muss ausführbar sein. Ansonsten müssen alle Files die Besitzer und/oder gruppe von "www-data" sein. Wenn das ganze auf den lokalen Apache Webserver läuft kannst du die Seite nun aufrufen indem du "http://localhost/cgi-bin/pizza" aufrufst.
Das mag jetzt erstmal nach mehr aussehen, was es auch ist 😉, aber du hast so Code & layout getrennt. Du kannst z.B. das HTML Komplett umbauen. CSS hinzufügen etc. und musst keine einzige Perl Code Zeile anpassen.
Ansonsten kannst du neue Runmodes einfach hinzufügen indem du einfach eine Subroutine in der Pizza.pm erstellst und run_mode() in der setup Routine erweiterst. $self->load_tmpl() ohne argumente lädt dann automatisch das Template mit dem gleichen Subroutinen Namen und einem ".html" angehangen im default Template pfad.
Wenn du noch eine Datenbankverbindung etc. aufbauen möchtest dann gibt es dafür bereits fertige Plugins die das für dich machen, musst dann nur die nötigen DB Informationen übergeben. HTML::Template wird defaultmäßig bei CGI::Application genommen, es gibt aber Plugins für TT und andere Sachen.
Unter Debian wird CGI::Application und eine handvoll von Plugins durch die beiden Packete "libcgi-application-perl" und "libcgi-application-plugins-perl" bereit gestellt.
Ansonsten ist das ganze nur ein sehr sehr sehr leichtgewichtiges Framework was dir nur ein paar Grundaufgaben abnimmt und für eine Ordentliche Struktur sorgt. Mehr auch nicht. Aber mit den ganzen Plugins die es gibt kann man damit schon nette Sachen machen.