Text::Xslate::Manual::Cookbook - How to cook Xslate templates
The Xslate cookbook is a set of recipes showing Xslate features.
Managing HTML forms is an important issue on web applications. You'd better to use modules that manage HTML forms, rather than do something with templates by yourself. This section proposes two basic solutions: using FillInForm and HTML form builders.
In both solutions, one should not use the mark_raw filter in templates, which easily makes security holes. Instead, application code should be responsible to call the mark_raw function that Text::Xslate can export.
mark_raw filter
mark_raw function
Text::Xslate
One solution to manage HTML forms is to use FillInForm modules with the block filter syntax.
Example code using HTML::FillInForm:
HTML::FillInForm
#!perl -w use strict; use Text::Xslate qw(html_builder); use HTML::FillInForm; # HTML::FillInForm::Lite is okay sub fillinform { my($q) = @_; my $fif = HTML::FillInForm->new(); return html_builder { my($html) = @_; return $fif->fill(\$html, $q); }; } my $tx = Text::Xslate->new( function => { fillinform => \&fillinform, }, ); my %vars = ( q => { foo => "<filled value>" }, ); print $tx->render_string(<<'T', \%vars); FillInForm: : block form | fillinform($q) -> { <form> <input type="text" name="foo" /> </form> : } T
Output:
FillInForm: <form> <input type="text" name="foo" value="<filled value>" /> </form>
Because HTML::FillInForm::Lite provides fillinform function, it becomes more simple:
fillinform
use HTML::FillInForm qw(fillinform); my $tx = Text::Xslate->new( function => { fillinform => html_builder(\&fillinform) }, );
See also HTML::FillInForm or HTML::FillInForm::Lite for details.
Another solution to manage HTML forms is to use form builders.
Here is a PSGI application that uses HTML::Shakan:
HTML::Shakan
#!psgi use strict; use warnings; use Text::Xslate qw(mark_raw); use HTML::Shakan; use Plack::Request; my $tx = Text::Xslate->new(); sub app { my($env) = @_; my $req = Plack::Request->new($env); my $shakan = HTML::Shakan->new( request => $req, fields => [ TextField(name => 'name', label => 'Your name: ') ], ); my $res = $req->new_response(200); # do mark_raw here, not in templates my $form = mark_raw($shakan->render()); $res->body( $tx->render_string(<<'T', { form => $form }) ); <!doctype html> <html> <head><title>Building form</title></head> <body> <form> <p> Form:<br /> <: $form :> </p> </body> </html> T return $res->finalize(); } return \&app;
<!doctype html> <html> <head><title>Building form</title></head> <body> <form> <p> Form:<br /> <label for="id_name">Your name</label> <input id="id_name" name="name" type="text" value="<Xslate>" /> </p> </body> </html>
See also HTML::Shakan for details.
Use template cascading, which is a super-set of the WRAPPER directive.
WRAPPER
wrapper.tx:
<div class="wrapper"> block content -> { } </div>
content.tx
: cascade wrapper : override content -> { Hello, world! : }
<div class="wrapper"> Hello, world! </div>
See "Template cascading" in Text::Xslate for details.
Use Data::Section::Simple, and the path option of new(), which accepts HASH references which contain $file_name => $content mapping.
path
new()
$file_name => $content
use Text::Xslate; use Data::Section::Simple; my $vpath = Data::Section::Simple->new()->get_data_section(); my $tx = Text::Xslate->new( path => [$vpath], ); print $tx->render('child.tx'); __DATA__ @@ base.tx <html> <body><: block body -> { :>default body<: } :></body> </html> @@ child.tx : cascade base; : override body -> { child body : } # endblock body
This feature is directly inspired by Text::MicroTemplate::DataSection, and originated from Mojo.
See also Data::Section::Simple, Text::MicroTemplate::DataSection, and Mojo.
Text::Xslate::Manual
To install Text::Xslate, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Text::Xslate
CPAN shell
perl -MCPAN -e shell install Text::Xslate
For more information on module installation, please visit the detailed CPAN module installation guide.