Leser: 21
8 Einträge, 1 Seite |
QuoteHTML::Template->new() : Cannot open included file ../menu.html : file not found. at E:/Programme/perl/site/lib/HTML/Template.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
nick: Admin
date: 22.07.2003 23:26
subject: Willkommen im Gästebuch
text: Hallo Leute,<br><br>endlich ist das Gästebuch fertig, und wir hoffen auf nette Einträge.<br><br>Gruesse,<br><br>Die Admins
homepage: http://www.test.de/
email: [EMAIL=admins@no.org]admins@no.org[/EMAIL]
nick: bjkasdfbjkl
subject: dasfblasdjkfbasf
text: asdbnjfasdbjklfb <br>asdfnjklasdfn
date: 24.07.2003 20:18
nick: bjkasdfbjkl
subject: dasfblasdjkfbasf
text: asdbnjfasdbjklfb <br>asdfnjklasdfn
date: 24.07.2003 20:18
nick: bjkasdfbjkl
subject: dasfblasdjkfbasf
text: asdbnjfasdbjklfb <br>asdfnjklasdfn
date: 24.07.2003 20:19
nick: Martin Fabiani
email: <a href="mailto:martin@fabiani.net">martin@fabiani.net</a>
homepage: <a href="http://www.fabiani.net/" target="_blank">www.fabiani.net</a>
subject: blablabla
text: willkommen
date: 24.07.2003 20:20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
#! /usr/bin/perl use warnings; use strict; use CGI (); use CGI::Carp qw(fatalsToBrowser); use Fcntl ':flock'; use HTML::Template (); use FindBin (); # die folgenden Module werden direkt in den Modulen geladen # require URI::Find::Schemeless; # require HTML::Entities; # require Mail::RFC822::Address; # ------------------------------------------------------------ # Fuer die Konfiguration Konstanten verwenden # ------------------------------------------------------------ # wo liegt das Cascading Style Sheet fuer das Layout use constant CSS_URL => '/styles/Default.css'; # wie viele Eintraege sollen pro Seite angezeigt werden? use constant MAX_SHOW_ENTRIES => 10; # Die Variable $FindBin::Bin enthaelt den absoluten Pfad des ausgefuehrten # Scriptes. Ich verwende sie, um so einem absoluten Pfad zu erhalten, weil # manche Webserver mit relativen Pfadangaben Schwierigkeiten haben, und da # vom htdocs-Verzeichnis ausgehen. Und auf diese Weise vermeide ich diese # potentiellen Probleme am einfachsten. # wo werden die Gaestebucheintraege abgespeichert? use constant GB_DATA_FILE => "$FindBin::Bin/data/guestbook.txt"; # wo liegen die Templates? use constant TEMPLATE_DIR => "$FindBin::Bin/templates"; # wie sind die Dateinamen der Templates? use constant TEMPLATE_FILES => { showguestbook => TEMPLATE_DIR . "/guestbook_show.templ", addguestbook => TEMPLATE_DIR . "/guestbook_add.templ", }; use constant GUESTBOOK_FIELDS => [qw(nick email homepage subject text date)]; # ------------------------------------------------------------ # Hauptprogramm # ------------------------------------------------------------ # neues CGI-Objekt erzeugen my $cgi = CGI::->new(); # aktion abfragen; wenn keine Vorhanden, dann guestbook verwenden my $action = $cgi->param('action') || 'guestbook'; if ( $action eq 'guestbookadd' ) { &AddGuestbookEntry($cgi); } # if elsif ( $action eq 'guestbooksave' ) { &SaveNewGuestbookEntry($cgi); } # elsif else { # Standardvorgehen: zeige das Gaestebuch an &ShowGuestbook($cgi); } # else # ------------------------------------------------------------ sub SaveNewGuestbookEntry { my ($cgi) = @_; my %data = (); foreach ( @{&GUESTBOOK_FIELDS} ) { $data{$_} = $cgi->param($_) || ''; $data{$_} =~ s/^\s*//; $data{$_} =~ s/\s*$//; } # foreach unless ( $data{nick} ) { $data{message} .= "<br> Der Name muß angegeben werden"; } # unless unless ( $data{subject} ) { $data{message} .= "<br> Der Betreff muß angegeben werden"; } # unless unless ( $data{text} ) { $data{message} .= "<br> Der Text muß angegeben werden"; } # unless if ( $data{email} ) { # Ueberpruefe die Email-Adresse require Mail::RFC822::Address; unless ( &Mail::RFC822::Address::valid( $data{email} ) ) { $data{message} .= "<br> Diese Email-Adresse ist fehlerhaft (nicht RFC822-Konform)"; } # else } # if if ( $data{message} ) { &AddGuestbookEntry( $cgi, \%data ); } # if else { require URI::Find::Schemeless; require HTML::Entities; # neues URI::Find::Schemeless-Objekt erstellen und ihm als Callback # die Aktion mitgeben, die fuer jede gefundene URI ausgefuehrt werden # soll (fuer genauere Infos siehe [URL=http://www.fabiani.net/]http://www.fabiani.net/[/URL] -> Tips&Tricks # -> Urls in HTML-Links umwandeln my $finder = URI::Find::Schemeless->new( sub { my ( $uri, $originalUri ) = @_; return ( '<a href="' . &HTML::Entities::encode_entities("$uri") . '" target="_blank">' . &HTML::Entities::encode_entities($originalUri) . '</a>' ); } # sub ); # allgemeine Umwandlungen foreach ( @{&GUESTBOOK_FIELDS} ) { # $data{$_} =~ s/</</g; $data{$_} =~ s/>/>/g; # $data{$_} =~ s/\&/&/g; # $data{$_} =~ s/\"/"/g; $data{$_} =~ s/\'/'/g; # ersetze Sonderzeichen wie < > & ' " durch deren Codes $data{$_} = &CGI::escapeHTML( $data{$_} ); # ersetze Zeilenumbruecke durch <br> $data{$_} =~ s/\r? /<br>/g; # ersetze URIs durch HTML-Links $finder->find( \$data{$_} ); } # foreach # erzeuge email-link if ( $data{email} ) { $data{email} = qq~<a href="mailto:$data{email}">$data{email}</a>~; } # if # ermittle Datum und Uhrzeit my @time = localtime(time); $time[4]++; $time[5] += 1900; $data{date} = sprintf( "%02i.%02i.%04i %02i\:%02i", @time[ 3 .. 5, 2, 1 ] ); &SaveNewEntryToFile( $cgi, \%data ) and &ShowGuestbook($cgi); } } # SaveNewGuestbookEntry # ------------------------------------------------------------ sub SaveNewEntryToFile { my ( $cgi, $data ) = @_; my $string = join ( "", map { "$_: $data->{$_} " } grep { $data->{$_} } @{&GUESTBOOK_FIELDS} ); unless ( open( GB, ">>" . GB_DATA_FILE ) ) { &PrintErrorPage( $cgi, "Konnte Datei nicht oeffnen: $!" ); exit; } # unless else { flock( GB, LOCK_EX ); print( GB "$string " ); close(GB); } # else return 1; } # SaveNewEntryToFile # ------------------------------------------------------------ sub AddGuestbookEntry { my ( $cgi, $data ) = @_; # gib den HTML-Header aus print $cgi->header( -type => 'text/html', -expires => '+5s' ); # lese das Template ein: my $template = HTML::Template->new( filename &nbs p; => TEMPLATE_FILES->{addguestbook}, die_on_bad_params => 0, ); $template->param( # Url des Scriptes und CSS-Stylesheet SELF_URL => $ENV{SCRIPT_NAME} || '', CSS_URL => CSS_URL, # eine eventuelle Fehlermeldung MESSAGE => $data->{message} || '', # Die Daten im Falle eines Fehlers NICK => $data->{nick} || '', EMAIL => $data->{email} || '', HOMEPAGE => $data->{homepage} || '', SUBJECT => $data->{subject} || '', TEXT => $data->{text} || '', ); print $template->output; } # AddGuestbookEntry # ------------------------------------------------------------ sub ShowGuestbook { my ($cgi) = @_; # $startId ist der offset zur letzten Nachricht # also 0 entspricht der letzten Nachricht, 1 der vorletzten usw. my $startId = $cgi->param('id') || 0; $startId > 0 or $startId = 0; # gib den HTML-Header aus print $cgi->header( -type => 'text/html', -expires => '+5s' ); # lese die Gaestebucheintraege von der Datei ein und gebe sie als # Arrayreferenz zurueck my ( $entries, $entriesCount, $x, $y ) = &ReadEntriesFromFile($startId); # lese das Template ein: my $template = HTML::Template->new( filename &nbs p; => TEMPLATE_FILES->{showguestbook}, die_on_bad_params => 0, ); $template->param( # Url des Scriptes und CSS-Stylesheet SELF_URL => $ENV{SCRIPT_NAME} || '', CSS_URL => CSS_URL, # Daten ENTRIES_COUNT => $entriesCount + 1, GBDATA => $entries, # fuer die Navigation SHOW_LINK_NEWER => $y < $entriesCount, SHOW_LINK_OLDER => $x > 0, OLDER_START_ID => $entriesCount - $x + 1, NEWER_START_ID => $entriesCount - $y - MAX_SHOW_ENTRIES, ); print $template->output; # print "$entriesCount: $x/$y:$startId "; } # ShowGuestbook # ------------------------------------------------------------ sub ReadEntriesFromFile { my ($startId) = @_; my @entries = (); my $entryId = 1; unless ( open( GB, GB_DATA_FILE ) ) { &PrintErrorPage( $cgi, "Konnte Datei nicht oeffnen: $!" ); } # unless else { # blockweises Einlesen: eine "Zeile" enthaelt nun einen Block, # der durch eine Leerzeile vom naechsten getrennt ist local $/ = " "; while (<GB>) { # splitte den Block an den Zeilenumbruechen auf my @lines = split ( / /, $_ ); # wenn da keine Daten herauskommen, weiter mit dem naechsten Block next unless scalar @lines; my %entry = (); foreach my $line (@lines) { # trenne Namen: Wert my ( $key, $value ) = split ( /\s*:\s+/, $line, 2 ); # print "$entryId: $key: $value "; # ueberpruefe, ob fuer diesen Namen schon ein Wert vorhanden # ist, wenn ja, gib einen Fehler aus, wenn nein, fuegen den # Namen und den WErt zum Hash %entry hinzu if ( exists $entry{$key} ) { &PrintErrorPage( $cgi, "Format der Datei ungueltig" ); exit 0; } # if else { $entry{$key} = $value; } # else } # foreach # id des Eintrages hinzufuegen $entry{id} = $entryId; # Eintrag an den Anfang von @entries hinzufuegen unshift ( @entries, \%entry ); # erhoehe EntryId $entryId++; } # while close(GB); } # else # finde heraus, welche Eintraege angezeigt werden sollen (von $x bis $y) my $count = $#entries; my $y = $count - $startId; my $x = ( $y > MAX_SHOW_ENTRIES ) ? $y - MAX_SHOW_ENTRIES + 1 : 0; # und werfe die anderen weg @entries = @entries[ $count - $y .. $count - $x ]; # gib eine Arrayreferenz der Eintraege zurueck sowie deren Anzahl und # deren Grenzen return ( \@entries, $count, $x, $y ); } # ReadEntriesFromFile # ------------------------------------------------------------ sub PrintErrorPage { my ( $cgi, $errorMessage ) = @_; print "Fehler: $errorMessage "; } # PrintErrorPage # ------------------------------------------------------------ show: SELF_URL CSS_URL SHOW_LINK_NEWER SHOW_LINK_OLDER OLDER_START_ID NEWER_START_ID ENTRIES_COUNT GBDATA ID (Automatisch) NICK (Pflichtfeld) EMAIL (optional) HOMEPAGE (optional) DATE (Automatisch) SUBJECT (Pflichtfeld) TEXT (Pflichtfeld)
1
2
3
4
5
6
7
8
9
10
11
12
13
body {
background-image : url();
background-color : C0C0C0;
color : Black;
}
h1 {
font-size: 20pt;
color: #6666FF;
font-style: bold;
}
td.text { background-color: #E0E0E0; }
QuoteHTML::Template->new() : Cannot open included file ../menu.html : file not found. at E:/Programme/perl/site/lib/HTML/Template.pm
8 Einträge, 1 Seite |