Perl Template Toolkit
-
Upload
stefano-rodighiero -
Category
Technology
-
view
3.195 -
download
3
description
Transcript of Perl Template Toolkit
Perl Template Toolkit
Stefano [email protected]
nothing_particular.pl
#!/usr/bin/perl
print "Content-type:text/html\n\n";print "<html><head>";print "<title>Print Environment</title></head>";print "<body>”;
foreach $key (sort(keys %ENV)) { print "$key = $ENV{$key}<br>\n";}
print "</body></html>";
Template
• Separano il codice applicativo dalla presentazione
• Facilitano il riuso del codice
• Ci sono n moduli su CPAN
• Evidentemente è una buona idea :-)
Template Toolkit
• Dal sito statico...
• ...al CGI...
• ...all’applicazione Web
ABC
Un semplice esempio
[% convenevoli %],per [% festa %] vorrei ricevere [% dove %] un po' di LEGO.Riporto i codici delle confezioni che preferisco:
[% FOREACH item IN boxes %] * [% item %] [% END %]
[% captatio %]
Cordiali saluti,S.
my $tt = Template->new();
my $vars = { convenevoli => "Caro Babbo Natale" , festa => "Natale" , dove => "sotto l'albero" , boxes => [ 7190, 897, 6880, 6990 ] , captatio => "Salutami le renne, eh? Ci tengo."};
$tt->process( 'letterina.tt2', $vars ) or die $tt->error();
Un semplice esempio/2
my $tt = Template->new();
my $vars = { convenevoli => "Cara Befana" , festa => "l’Epifania" , dove => "nella calza" , boxes => [ 7190, 897, 6880, 6990 ] , captatio => "Spero che la schiena vada meglio."};
$tt->process( 'letterina.tt2', $vars ) or die $tt->error();
Un semplice esempio/3
Passare oggetti 1 package Product::DBI; 2 use base 'Class::DBI'; 3 Url::DBI->set_db( Main => 'dbi:mysql:products', 4 '*** LOGIN ***', '*** PASSWORD ***' ); 5 6 package Product; 7 use base 'Product::DBI'; 8 Url->table( 'product' ); 9 Url->columns( All => qw/id description type price/ ); 10 11 package main; 12 13 # ... 14 my $template = Template->new(); 15 my $iterator = Product->retrieve_all(); 16 17 $template->process('list.tt2', { iterator => $iterator }) 18 or die $template->error;
Passare oggetti/2
[% IF iterator.count == 0 %]Nessun prodotto<br />[% ELSE %] <table> [% WHILE (item = iterator.next) %] <tr> <td>[% item.id %]</td> <td>[% item.description %]</td> <td align="right">[% item.price %]</td> </tr> [% END %] </table>[% END %]
www.perl.it
Requisiti
• Facile rilocabilità
• Riuso di elementi già sviluppati
• Build locale
• Pubblicazione in un solo passo
• Riusabilità futura del codice sviluppato
Soluzione
• Template Toolkit
• ttree
• Una manciata di moduli di CPAN
• Repository di template su CVS
www.perl.it
www.perl.it
Widget
Widget
[% WRAPPER wMessage.ttml wTopic = 'Documenti' wImg = 'img/gui/wd.gif' wAlt = 'D:' title = 'Perlfunc' subtitle = 'Funzioni Perl in italiano' icon = 'img/icons/faq.png' url = 'documenti/perlfunc/index.html'%]La documentazione completa delle funzioni Perl in italiano.[% END %]
src = /home/larsen/src/perlit/srcdest = /home/httpd/perl.itlib = /home/larsen/src/perlit/librecurse
perl5lib = /home/larsen/src/perlit/libplugin_base = MyPlugin
accept = \.(html|css|txt|js)$copy = \.(gif|jpg|png|pl)$ignore = \.(swp)$pre_process = ./lib/config
Configurazione di ttree
ttree
Plugin
package MyPlugin::Blog;
use strict;use warnings;
use Template::Plugin;use base qw/ Template::Plugin /;
use MT;use MT::Entry;
sub new { ... }
sub get_entry{ my $self = shift; my $entry_id = shift;
my $entry = MT::Entry->load( $entry_id );
return $entry;}
MyPlugin::Blog
[% USE Blog %][% entry = Blog.get_entry( entry_id ) %]
<tbody><tr> <td class="text"> <p>[% entry.excerpt %] <a href="[% entry.permalink %]" title="Leggi tutto" target="_self" >Continua</a> </p> </td></tr></tbody>
MyPlugin::Blog in azione
Mastering TT2
Architettura
Template
Template::Service
Template::Context
Template::Document
Template::Provider
Template::Parser Template::Exception
Template::Stash
use Template;use Template::Constants qw/ :debug /;
my $tt = Template->new( DEBUG => DEBUG_SERVICE | DEBUG_CONTEXT | DEBUG_PROVIDER );
$tt->process( 'template.tt2', { world => "Repubblica del Perl" } ) || die $tt->error();
Hello, [% world %]!
Architettura
larsen@alice:~$ perl test.pl [Template::Provider] creating cache of unlimited slots for [ . ][Template::Service] process(template.tt2, HASH(0x832f75c))[Template::Context] template(template.tt2)[Template::Context] looking for block [template.tt2][Template::Context] asking providers for [template.tt2] [][Template::Provider] _fetch_path(template.tt2)[Template::Provider] searching path: ./template.tt2[Template::Provider] _load(./template.tt2, template.tt2)[Template::Provider] _compile(HASH(0x832f888), <no compfile>)[Template::Provider] _store(./template.tt2, Template::Document=HASH(0x8412128))[Template::Provider] adding new cache entry[Template::Service] PROCESS: Template::Document=HASH(0x8412128)[Template::Context] process([ Template::Document=HASH(0x8412128) ], <no params>, <unlocalized>)[Template::Context] template(Template::Document=HASH(0x8412128))Hello, Repubblica del Perl!larsen@alice:~$
Architettura
Gli stessi princìpi del Perl
• Potenza
• Semplicità
• Disciplina
• Scalabilità
• Stile
Approfondimenti
• http://www.tt2.org
• Mailing list
• Perl Template Toolkit, O’Reilly
• perldoc Template
[email protected]://larsen.perlmonk.org
Grazie :)