Thread Trennung von Layout und Inhalt? (4 answers)
Opened by umbrella at 2009-09-02 00:09

topeg
 2009-09-02 02:59
#125233 #125233
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich würde "use" bevorzugen.
Bei "do" wird der Perl-Parser jedes mal angeworfen, wenn man "do" ausführt.

Dein Code gut. Geht aber besser ( alles geht besser :-) )
Ganz davon ab das es gute Templatesysteme gibt, würde ich ihn Objektorientiert schreiben.
Wenn du genau hinschaust wirst du sehen wo ich Änderungen an deinem Code gemacht habe. Vor allem das das Lesen der Datei betrifft und auch bei der Regexp.

script.pl
Code (perl): (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use lib '/var/www/cgi-bin/newtest';
use template;

my $vorlage = "test.tmpl";
my $data={};
my $cgi = CGI->new();
# ein Templateobjekt erzeugen.
# der Vorteil ist,
# wenn das Templatesystem komplexer wird,
# kann man Problemlos mehrere Instanzen nebeneinander nutzen.
my $template=template->new();

# abbruch wenn das template nicht geladen werden konnte
die "Error Read Templatefile ($!)" if(!$template->read($vorlage));

$data->{'print'} = 'Das ist ein test!';

# HTTP-Header Ausgeben
print $cgi->header();

# Warnungen im Browser ausgeben.
# sonst nützt das "use warnings" nicht so viel,
# da die Meldungen sonst nur im Errorlog des Webservers landen
warningsToBrowser(1);

# Das print nicht im templatesystem.
# Eventuell sollen die Generierten Daten noch nacharbeitetet werden.
# (z.B dienen als Daten für ein weiteres Template)
print $template->render($data);


template.pm
Code (perl): (dl )
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
package template;
use strict;
use warnings;

sub new
{
  my $class=shift;
  my $self={};

  # hier wird das Template gespeichert
  $self->{template}='';

  # wir machen aus dem Paket (Klasse) ein Objekt
  bless($self,$class);

  return $self;
}

sub read
{
  # objekt übernehmen
  my $self=shift;
  # dateiname übernehmen
  my $file=shift;

  # ganze Datei einlesen
  # da Inputseparator undef
  local $/=undef;

  # Fehler beim öffnen der Datei -> abbruch
  return 0 if(!open(my $fh, '<', $file));
  # man braucht kein sysopen um eine Datei nur lesend zu öffnen

  # alles einlesen
  $self->{template}=<$fh>;
  close($fh);

  return 1;
}

sub render
{
  my $self=shift;
  my $data=shift;

  # kein Hash -> abbruch
  return '' if(!ref($data) eq 'HASH');

  my $output=$self->{template};

  # "\w" findet alle alphanumerischen Zeichen "[A-Za-z0-9]"
  $output=~ s/<-html_(\w+)->/$data->{lc($1)}/gsx;

  # gerenderter Text zurück
  return $output;
}

1;


EDIT: Die "1;" am Ende des Moduls vergessen. Sonst weiß perl nicht, dass das Laden erfolgreich war.
Last edited: 2009-09-02 11:58:30 +0200 (CEST)

View full thread Trennung von Layout und Inhalt?