package CGI::FormBuilder::Template::Fast;
=head1 NAME
CGI::FormBuilder::Template::Fast - FormBuilder interface to CGI::FastTemplate
=head1 SYNOPSIS
my $form = CGI::FormBuilder->new(
fields => \@whatever,
template => {
type => 'Fast',
root => '/path/to/templates',
# use external files
define => {
form => 'form.txt',
field => 'field.txt',
invalid_field => 'invalid_field.txt',
},
# or define inline
define_nofile => {
form => '
$START_FORM
$SUBMIT $END_FORM',
# etc.
},
},
);
=cut
use Carp;
use strict;
use vars qw($VERSION);
$VERSION = '3.02';
use CGI::FormBuilder::Util;
use CGI::FastTemplate;
use base 'CGI::FastTemplate';
sub new {
my $self = shift;
my $class = ref($self) || $self;
my %opt = @_;
my $t = CGI::FastTemplate->new($opt{root});
# turn off strict so that undef vars show up
# as blank in the template output
$t->no_strict;
# define our templates
$t->define(%{ $opt{define} });
$t->define_raw($opt{define_raw});
$t->define_nofile($opt{define_nofile});
# jam $t info FB 'engine' container
$opt{engine} = $t;
return bless \%opt, $class;
}
sub engine {
return shift()->{engine};
}
sub render {
my $self = shift;
my $form = shift;
# a couple special fields
my %tmplvar = $form->tmpl_param;
# Go over the fields and process each one
for my $field ($form->field) {
# Extract value since used often
my @value = $field->tag_value;
# assign this field's variables
$self->{engine}->assign({
NAME => $field->name,
FIELD => $field->tag,
VALUE => $value[0], # the VALUE tag can only hold first value!
LABEL => $field->label,
COMMENT => $field->comment,
ERROR => $field->error,
REQUIRED => ($field->required ? 'required' : 'optional'),
});
# TODO: look for special templates based on field name or type?
if ($field->invalid) {
$self->{engine}->parse(FIELDS => '.invalid_field');
} else {
$self->{engine}->parse(FIELDS => '.field');
}
$self->{engine}->clear_href;
}
# a couple special fields
$self->{engine}->assign({
TITLE => $form->title,
JS_HEAD => $form->script,
START_FORM => $form->start . $form->statetags . $form->keepextras,
SUBMIT => $form->submit,
RESET => $form->reset,
END_FORM => $form->end,
%tmplvar,
});
$self->{engine}->parse(FORM => 'form');
# prepend header to template rendering
return $form->header . ${ $self->{engine}->fetch('FORM') };
}
# End of Perl code
1;
__END__
=head1 DESCRIPTION
This engine adapts B to use C. Please
read these docs carefully, as the usage differs from other template
adapters in several important ways.
You will need to define three templates: C