Aufruf einer HTML Seite in gleicher Seite
Marcus
- perl
Hi @all,
ich hab hier ein Kleines CGI Skript, der zwei Funktion und HTML Seiten auf generiert, die dritte Funktion soll eine HTML Seite aufrufen. Kann mir jemand sagen, wie ich das Bewerkstelligen kann? Ich dachte an einer Weiterleitung, aber dass hat nicht geklappt, weil er eine neue Seite aufgemacht hat.
#!/usr/bin/perl
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Perl Funktionen
use CGI;
use Switch;
# Eigene Funktionen
use checkSAMBA;
use checkDISK;
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variablen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Values der Radiobuttons
$value_dienste="dienste";
$value_disk="disk";
$value_samba="samba";
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HTML ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Neues Objekt $query erzeugen
$query = new CGI;
print $query->header(); # HTML Header ausgeben
print"
<html>
<!-- Kopfzeile -->
<head>
<title>Web-Interface für Servercheck</title>
<link rel=shortcut icon href=favicon.ico />
</head>
<!-- Body -->
<body>
<!-- Überschrift -->
<center><h2>Web-Interface für Servercheck</h2></center>
<!-- Formular -->
<form method=post action=servercheck.cgi>
<p>Bitte Wählen Sie eine Abfrage aus:</p>
<p>
<input type=radio name=abfrage value=dienste> Dienste<br>
<input type=radio name=abfrage value=disk> Disk Usage<br>
<input type=radio name=abfrage value=samba> Samba<br>
<input type=radio name=abfrage value=all> ALLES TESTEN<br>
</p>
<br>
<br>
<!-- Submit Button -->
<input type=submit value=submit>
</form>
</body>
</html>";
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PERL Auswertung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Ausgabe einer Trennlienie
print "<hr>";
# Welchr Button wurder gewählt?
# Mit der Methode param wird der value der einzelenen Buttons ausgelesen.
# Die Variable $value wird mit diesen Wert gesetzt.
$value = $query->param('abfrage');
# TEST WECHER BUTTON WURDE AUSGEWÄHLT
#print "Button: <b>$value</b>";
#print "<br>";
# TEST WECHER BUTTON WURDE AUSGEWÄHLT
# An Hand der values, werden hier die Funktionenen für die einzelnen Aufgaben aufgerufen
switch ($value){
case "$value_dienste" { print "<meta http-equiv=\"refresh\" content=\"0; URL=http:\/\/de.selfhtml.org\/\">" };
case "$value_disk" { &checkDISK::checkDISK };
case "$value_samba" { &checkSAMBA::checkSAMBA };
}
ich hab hier ein Kleines CGI Skript, der zwei Funktion und HTML Seiten auf generiert, die dritte Funktion soll eine HTML Seite aufrufen. Kann mir jemand sagen, wie ich das Bewerkstelligen kann?
Das Grundproblem ist, dass dein Script immer die "Hauptseite" ausgibt (Affenformular). Baue also zuerst eine Fallunterscheidung, wann HTML ausgegeben werden soll und wann du in die drei Funktionen verzweigen willst. Denn eine Weiterleitung mittels meta-Tag funktioniert nur im Kopfbereich, der allerdings lange abgeschlossen ist, weil du ja schon eine komplette HTML-Seite geschrieben hast:
print"
<html>
[...]
</html>";
Du solltest dir auch mal die CGI-Funktionen für die Ausgabe von HTML-Elementen ansehen.
Siechfred
Das Grundproblem ist, dass dein Script immer die "Hauptseite" ausgibt (Affenformular).
Was ist ein Affenformular?
Baue also zuerst eine Fallunterscheidung, wann HTML ausgegeben werden soll und wann du in die drei Funktionen verzweigen willst. Denn eine Weiterleitung mittels meta-Tag funktioniert nur im Kopfbereich, der allerdings lange abgeschlossen ist, weil du ja schon eine komplette HTML-Seite geschrieben hast:
print"
<html>
[...]
</html>";
Ok, jetzt verstehe ich warum dass nicht geklappt hat, aber ich hab nicht verstanden wie du das jetzt mit der Funktion gemeint hast.
Du solltest dir auch mal die CGI-Funktionen für die Ausgabe von HTML-Elementen ansehen.
Mit der CGI-Funktion funktioniert das?
Ich hab das jetzt mal folgendermasen gelöst:
[...]
switch ($value){
case "$value_dienste" {
open HTML, "/srv/www/htdocs/dienste.html";
while ($line=<HTML>){
print $line;
}
}
case "$value_disk" { &checkDISK::checkDISK };
case "$value_samba" { &checkSAMBA::checkSAMBA };
}
[...]
Hi
Ich hab das jetzt mal folgendermasen gelöst:
was'n hack... also soweit ich dass sehe liest du jetzt die HTML-Seite auf die du eigentlich umleiten möchtest zeilenweise ein und gibt sie als Ergebnis des CGIs zurück. Das ist eher suboptimal und hat bestimmt auch seiteneffekte.
Um es klar zu machen: Eine Meta-Umleitung kann nicht funktionieren wenn sie nicht im <head> steht.
Ausserdem gibts in CGI.pm auch ein $query->redirect("URL") den du STATT des $query->header() nutzen könntest. (beides geht aber nicht)
tschö
LanX
#!/usr/bin/perl
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Perl Funktionen
Perl Module.
use CGI;
use Switch;
du solltest auch use strict und use warnings verwenden, einerseits verhilft das zu einem besseren Stil anderseits kann dir das helfen Fehler zu vermeiden die nur schwer zu finden sind.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HTML ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Neues Objekt $query erzeugen
$query = new CGI;
print $query->header(); # HTML Header ausgeben
print"
<html>
<!-- Kopfzeile -->
<head>
<title>Web-Interface für Servercheck</title>
<link rel=shortcut icon href=favicon.ico />
</head>
<!-- Body -->
<body>
<!-- Überschrift -->
<center><h2>Web-Interface für Servercheck</h2></center><!-- Formular -->
<form method=post action=servercheck.cgi>
<p>Bitte Wählen Sie eine Abfrage aus:</p>
<p>
<input type=radio name=abfrage value=dienste> Dienste<br>
<input type=radio name=abfrage value=disk> Disk Usage<br>
<input type=radio name=abfrage value=samba> Samba<br>
<input type=radio name=abfrage value=all> ALLES TESTEN<br>
</p><br>
<br>
<!-- Submit Button -->
<input type=submit value=submit>
</form>
</body>
</html>";
Mal abgesehen, dass sowas schöner mit einem [link:http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators-operator%2c-quote-operator%2c-quote-like-q-qq-qx-qw-m--qr-s-tr-'-''-%22-%22%22-%2f%2f-%60-%60%60-%3c%3c-escape-sequence-escape@title=here-doc] hat dich Siechfred ja schon darauf hingewiesen, dass das CGI Modul auch dafür vielfältige Funktionen zu Verfügung stellt.
case "$value_samba" { &checkSAMBA::checkSAMBA };
Die Anführungszeichen sind hier überflüssig und sollten auch nicht benutzt werden, das &-Zeichen ist Uralt Perl und ebenfalls nicht mehr zeitgemäß, das sollte in etwa so aussehen:
[code lang=perl]case $value_samba { checkSAMBA::checkSAMBA() };
Wobei ich solche switch-case nicht besonders praktisch finde. in deinem Falle würde ich sowas machen:
~~~perl
my $query = new CGI;
my $dienste = {
dienste => sub { print $query->location('http://de.selfhtml.org');},
disk => sub { checkDISK::checkDISK() },
samba => sub { checkSAMBA::checkSAMBA() }
};
....
my $value = $query->param('abfrage');
if( $dienste->{$value} )
{
&{$dienste->{$value}}();
}else
{
# entweder einen Fehler ausgeben oder eine Defaultfunktion aufrufen
}
so musst du an weniger Stellen Änderungen machen, falls du das Skript ergänzen willst
Struppi.