package Maypole::View::TT;
-use Apache::Constants;
-use Lingua::EN::Inflect;
+use base 'Maypole::View::Base';
+use Maypole::Constants;
use Template;
-use File::Spec;
-use UNIVERSAL::moniker;
+use File::Spec::Functions qw(catdir tmpdir);
+
use strict;
+our $VERSION = "1." . sprintf "%04d", q$Rev$ =~ /: (\d+)/;
+sub template {
+ my ( $self, $r ) = @_;
-sub new { bless {}, shift } # Not worth having
+ unless ($self->{tt}) {
+ my $view_options = $r->config->view_options || {};
+ $self->{provider} = Template::Provider->new($view_options);
+ $self->{tt} = Template->new({
+ %$view_options,
+ LOAD_TEMPLATES => [ $self->{provider} ],
+ });
+ }
-sub _tt {
- my ($self, $r) = @_;
- # This bit sucks.
- my $root = $r->{config}{template_root} || $r->get_template_root;
- Template->new({ INCLUDE_PATH => [
- $root,
- ($r->model_class && File::Spec->catdir($root, $r->model_class->moniker)),
- File::Spec->catdir($root, "custom"),
- File::Spec->catdir($root, "factory")
- ]});
-}
+ $self->{provider}->include_path([ $self->paths($r) ]);
-sub _args {
- my ($self, $r) = @_;
- my $class = $r->model_class;
- my %args = (
- request => $r,
- objects => $r->objects,
- base => $r->config->{uri_base},
- config => $r->config
- # ...
- ) ;
- if ($class) {
- $args{classmetadata} = {
- name => $class,
- columns => [ $class->display_columns ],
- colnames => { $class->column_names },
- related_accessors => [ $class->related($r) ],
- moniker => $class->moniker,
- plural => $class->plural_moniker,
- cgi => { $class->to_cgi },
- description => $class->description
- };
-
- # User-friendliness facility for custom template writers.
- if (@{$r->objects || []} > 1) {
- $args{$r->model_class->plural_moniker} = $r->objects;
- } else {
- ($args{$r->model_class->moniker}) = @{$r->objects ||[]};
- }
- }
+ my $template_file = $r->template;
+ my $ext = $r->config->template_extension;
+ $template_file .= $ext if defined $ext;
- # Overrides
- %args = (%args, %{$r->{template_args}||{}});
- %args;
+ my $output;
+ if ($self->{tt}->process($template_file, { $self->vars($r) }, \$output )) {
+ $r->{output} = $output;
+ return OK;
+ }
+ else {
+ $r->{error} = "TT error for template '$template_file'\n" . $self->{tt}->error;
+ return ERROR;
+ }
}
-sub process {
- my ($self, $r) = @_;
- my $template = $self->_tt($r);
- my $output;
- $template->process($r->template, { $self->_args($r) }, \$output)
- || return $self->error($r, $template->error);
+1;
- $r->{content_type} ||= "text/html";
- $r->{output} = $output;
- return 200;
-}
+=head1 NAME
-sub error {
- my ($self, $r, $error) = @_;
- warn $error;
- if ($error =~ /not found$/) { return DECLINED }
- $r->{content_type} = "text/plain";
- $r->{output} = $error;
- $r->send_output;
- exit;
-}
+Maypole::View::TT - A Template Toolkit view class for Maypole
+
+=head1 SYNOPSIS
+
+ BeerDB->config->view("Maypole::View::TT"); # The default anyway
+
+ # Set some Template Toolkit options
+ BeerDB->config->view_options( {
+ TRIM => 1,
+ COMPILE_DIR => '/var/tmp/mysite/templates',
+ } );
+
+=head1 DESCRIPTION
+
+This is the default view class for Maypole; it uses the Template Toolkit to
+fill in templates with the objects produced by Maypole's model classes. Please
+see the L<Maypole manual|Maypole::Manual>, and in particular, the
+L<view|Maypole::Manual::View> chapter for the template variables available and
+for a refresher on how template components are resolved.
+
+The underlying Template toolkit object is configured through
+C<$r-E<gt>config-E<gt>view_options>. See L<Template|Template> for available
+options.
+
+=over 4
+
+=item template
+
+Processes the template and sets the output. See L<Maypole::View::Base>
+
+=back
+
+
+=head1 AUTHOR
+
+Simon Cozens
+
+=cut
-1;