anaboe.net

Ausgabe von HTML-Seiten mit dem Modul HTML::Template

Zielstellung

Sie möchten eine HTML-Seite ausgeben, die mit Variablen aus einem Perlscript befüllt wird. Dabei soll die HTML-Datei als Template vorliegen, sodass auch User ohne Kenntnisse in Perl, aber mit HTML- bzw. CSS-Kenntnissen diese an ihre Wünsche anpassen können.

Perl - Code

use strict;
use warnings;
use HTML::Template;

my @row;
my $template = HTML::Template->new( filename => 'pfad/zu/vorlage.tmpl');
# einmalige Variablen fuellen
$template->param(HEADLINE => 'Eine Überschrift');
$template->param(HINTS => 'Hier folgen einige Hinweise');
$template->param(DATETIME => 'Montag, 7.11.2005');

# Loop-Variablen fuellen
# die Werte holen wir uns aus einer Datenbank und fuellen damit einen Hash,
# auf die Darstellung der Datenbankabfragen wird verzichtet
# die Variable $ergebnis enthält die Ergebnisse der Abfrage
while ( @row = $ergebnis->fetchrow_array() ) {
  my %rows;
  $rows{HEAD} = $row[1];
  $rows{MESSAGE} = $row[2];
  $rows{DATE} = $row[3];
  push(@loop_data, \%rows);
}
$template->param(MESSAGE => \@loop_data);

# Footer anzeigen, wenn ein Referrer uebermittelt wurde
if($ENV{HTTP_REFERER} ne "") {
  $template->param(BOOL => 1);
}

# Ausgabe des Templates
print "Content-Type: text/html\n\n", $template->output;

HTML-Code

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Mein Template</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="pfad/zu/styles.css" />
</head>
<body>
<div id="banner">
  <h1>Eine Überschrift</h1>
</div>
<div id="allgemein">
  <h2><TMPL_VAR NAME="HEADLINE"></h2>
  <p id="hinweise"><TMPL_VAR NAME="HINTS"></p>
  <p id="zeit"><TMPL_VAR NAME="DATETIME"></p>
</div>
<div id="inhalt">
  <TMPL_LOOP NAME="MESSAGE">
    <h2 class="headline"><TMPL_VAR NAME="HEAD"></h1>
    <p class="message">
      <span class="uhrzeit"><TMPL_VAR NAME="DATE"></span>
      <TMPL_VAR NAME="MSG">
    </p>
  </TMPL_LOOP>
</div>
<TMPL_IF NAME="BOOL">
  <div id="footer">
    <p>Dies ist eine bedingte Fußzeile. Sie erscheint nur, wenn ein HTTP-Referrer übermittelt wurde.</p>
  </div>
</TMPL_IF>
</body>
</html>

Erläuterungen

Im Beispieltemplate sind zwei Arten von Templatevariablen aufgeführt. Innerhalb des Containers mit der ID „allgemein” werden die Variablen namens HEADLINE, HINTS und DATETIME definiert. Dies geschieht mittels TMPL_VAR NAME="name_der_variablen". Diese Variablen werden im Perlscript mit Hilfe der Methode HTML::Template->param mit einem statischen Wert gefüllt.

Etwas komplexer ist das Füllen des Containers mit der ID „inhalt”, da es sich im Ergebnis um eine Vielzahl von gleichartigen Blöcken handeln wird. Deshalb wird zunächst mittels TMPL_LOOP NAME="name_des_blocks" festgelegt, dass der Templateinhalt zu wiederholen ist. Innerhalb dieses Loops werden die einzelnen Templatevariablen genauso notiert wie im Containers mit der ID „allgemein” gezeigt. Ein Loop muss zwingend mit abgeschlossen werden.

Das Perlscript füllt im ersten Schritt die einmaligen Templatevariablen, dies ist relativ simpel. Natürlich können Sie dem Template statt der hardcodierten Strings auch selbst ermittelte Variablen zuweisen, z.B. $template->param(DATETIME => $selbst_ermitteltes_datum);. Im zweiten Schritt wird der Loop gefüllt. Hierzu kommen im Beispiel aus einer Datenbank eine Vielzahl von Einträgen (z.B. Blogeinträge), deren Inhalt in einem Hash namens %rows gespeichert wird, die Schlüsselnamen entsprechen dabei exakt den Namen der Templatevariablen innerhalb des Loops. Dem Array, das letztlich dem Loop übergeben werden soll, wird für jeden Datenbankeintrag eine Referenz auf %rows zugewiesen. Ist das erledigt, wird dem Template eine Referenz auf das Loop-Array übergeben, wichtig dabei ist, dass als Parameter der Name des Loops anzugeben ist.

Am Ende des Templates wird mittels eines TMPL_IF-Blocks entschieden, ob der darin enthaltene Block angezeigt werden soll oder nicht (Hinweis: das Gleiche können Sie mit Hilfe von TMPL_UNLESS erreichen). Lassen Sie die Variable leer oder weisen Sie ihr den Wert 0 zu, so wird der Container mit der ID „footer” nicht ausgegeben. Möchten Sie eine Alternative anzeigen lassen, verwenden Sie zusätzlich einfach TMPL_ELSE.

Zum Schluss wird das ausgefüllte Template an den Browser ausgegeben.

Siehe auch Dokumentation zu HTML::Template.