Schrift
[thread]581[/thread]

HTML::Template, dynamisches Include?



<< >> 9 Einträge, 1 Seite
pKai
 2005-09-25 15:59
#5658 #5658
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Hallo,

Ich generiere mit HTLM::Template aus einem Template und eine Menge von "Content".html alle (statischen) Webseiten einer Site auf einem Rutsch nach folgendem Schema
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;
use HTML::Template;
my $ht = HTML::Template->new(filename => 'page.html');
my @files = liste_der_Content_html-Dateien();
for my $content (@files) {
my %pArgs = param_hash_bilden($content);
$ht->param(%pArgs);
open (F, ">../$file") or die $file;
print F $ht->output();
close F;
}


Problem: Da ich nur einmal new mache, kann ich im Template nicht <TMPL_INCLUDE NAME="festerName.html"> verwenden, da INCLUDE sozusagen statisch beim new passiert, ich den Namen aber erst beim param-Aufruf zur Verfügung habe.
Daher mache ich in param_hash_bilden sowas wie
Code: (dl )
1
2
3
4
5
6
7
sub param_hash_bilden {
my $file = shift;
open (I, $file) or die $file;
my $include;
{ local $/; $include = <I>; }
(INCLUDE => $include);
}

und in page.html benutze ich dann <TMPL_VAR NAME=INCLUDE>.
Gibt es statt dessen andere Möglichkeiten eines "dynamischen Includes"? Evtl. in anderen Template-Systemen (hab mir noch keine anderen angeguckt)?

Wenn ich jetzt dann allerdings in einem der Content-Dateien ebenfalss "templaten" will, bin ich doch noch gezwungen ein neuen HT-Objekt zu erstellen? (Im Moment mache ich es so:)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub param_hash_bilden {
my $file = shift;
open (I, $file) or die $file;
my $include;
if (file_muss_templaten($file)) {
my $hti = HTML::Template->new (filehandle=>*I);
my %iArgs = include_param_hash_bilden($file);
$hti->param(%iArgs);
$include = $hti->output();
} else {
local $/;
$include = <I>;
}
(INCLUDE => $include);
}


Das ganze Vorgehen ist ja letztlich halbwegs akzeptabel für mich. Allerdings hatte ich gedacht ich ich könnte die geschachtelten HT-Objekte vermeiden.\n\n

<!--EDIT|pKai|1127649614-->
I sense a soul in search of answers.
esskar
 2005-09-25 17:47
#5659 #5659
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
was steuert dich an dem new ?
ich würde es so machen

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;
use HTML::Template;
my @files = liste_der_Content_html-Dateien();
for my $content (@files) {
my $ht = HTML::Template->new(filename => 'page.html');
my %pArgs = param_hash_bilden($content);
$ht->param(%pArgs);
open (F, ">../$file") or die $file;
print F $ht->output();
close F;
}


wenn du angst vor geschwindigkeitsverlust dabei hast, dann benutz doch HTML::Template::Compiled ...
pKai
 2005-09-25 23:43
#5660 #5660
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Geschwindigkeit ist kein Problem. Die Mühle auf der ich das Programmiere/Laufen lasse ist so langsam... aber Perl ist ja vergleichsweise schnell und ich bin ja offline und muss keine Web-Performance beachten.

Wenn ich für jede Seite mein gleiches Template neu lade, kann mich das auch nicht überzeugen. Und das Include-Problem ist auch erstmal nicht gelöst
Spontan fallen mir 2 Ansätze ein:
  • vorheriges Kopieren derjeweiligen Content-datei auf einen festen Include-Namen. Naja...
  • einen filter verwenden, der den statischen Include "dynamisiert".(nur bei esskar [new auf Haupttemplate in der Schleife] möglich)

Letztlich würde ich aber gerne die Information über die Include-Datei mit param übergeben, um die Bedienung zu vereinfachen.
Ich denke mal, dass müsste möglich sein, wenn die Prüfung, ob die angegebenen Params und die Template-Vars zueinander passen so spät wie möglich gemacht würde, damit die dynamische Include-Datei so berücksichtigt wird, als ob sie "statisch" eingebunden wurde. Also eine Art Lazy-Evaluation. Sicher nicht ganz trivial in der Implementierung, oder gibt es ein Sytem, das das bereits kann?
I sense a soul in search of answers.
pq
 2005-09-26 01:57
#5661 #5661
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
schau mal unter http://htcompiled.sf.net/ version 0.49, da habe ich das eingebaut...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pKai
 2005-09-26 02:06
#5662 #5662
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
@pq: :cool:
I sense a soul in search of answers.
pq
 2005-09-26 15:13
#5663 #5663
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@pKai: und, kommst du damit zurecht?
fand ich eine gute idee, aber ich weiß nicht, ob es jetzt so funktioniert, wie
du dir das vorgestellt hattest.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pKai
 2005-09-27 00:17
#5664 #5664
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Danke, alles bestens. Es macht genau das, was ich wollte!

Sry, dass das nicht schneller ging mit der Rückmeldung.
Heute früh musste ich dringend ins Bett, wo ich meine verschniefte Nase jetzt auch ganz schnell wieder hintrage.
;)
I sense a soul in search of answers.
pq
 2005-09-27 00:34
#5665 #5665
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
oh, dann gute besserung =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2005-09-27 15:37
#5666 #5666
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@pKai: bessere dich
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2005-09-25 15:59.