###########################################################################
# Copyright (c) Nate Wiger http://nateware.com. All Rights Reserved.
# Please visit http://formbuilder.org for tutorials, support, and examples.
###########################################################################
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 warnings;
no warnings 'uninitialized';
use CGI::FormBuilder::Util;
use CGI::FastTemplate;
use base 'CGI::FastTemplate';
our $VERSION = '3.20';
sub new {
my $self = shift;
my $class = ref($self) || $self;
my $opt = arghash(@_);
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 prepare {
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
my $ref = {
NAME => $field->name,
FIELD => $field->tag,
VALUE => $value[0], # the VALUE tag can only hold first value!
LABEL => $field->label,
REQUIRED => ($field->required ? 'required' : 'optional'),
ERROR => $field->error,
COMMENT => $field->comment,
};
$self->{engine}->assign($ref);
# 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');
return $self;
}
sub render {
my $self = shift;
return ${ $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