use File::Spec;
use UNIVERSAL::moniker;
use strict;
+use Maypole::Constants;
sub new { bless {}, shift } # By default, do nothing.
sub vars {
my ($self, $r) = @_;
my $class = $r->model_class;
+ my $base = $r->{config}->{uri_base};
+ $base =~ s/\/+$//;
my %args = (
request => $r,
objects => $r->objects,
- base => $r->config->{uri_base},
+ base => $base,
config => $r->config
# ...
) ;
moniker => $class->moniker,
plural => $class->plural_moniker,
cgi => { $class->to_cgi },
- description => $class->description
};
# User-friendliness facility for custom template writers.
%args;
}
-sub do_it {
- my ($self, $r) = @_;
- my $template = Template->new({ INCLUDE_PATH => [ $self->paths($r) ]});
- my $output;
- if ($template->process($r->template, { $self->args($r) }, \$output)) {
- $r->{output} = $output;
- return 1;
- } else {
- $r->{error} = $template->error;
- }
-
-}
-
sub process {
my ($self, $r) = @_;
- $self->template($r) || return $self->error($r);
+ my $status = $self->template($r);
+ return $self->error($r) if $status != OK;
$r->{content_type} ||= "text/html";
- return 200;
+ return OK;
}
sub error {
my ($self, $r) = @_;
warn $r->{error};
- if ($r->{error} =~ /not found$/) { return -1 }
+ if ($r->{error} =~ /not found$/) {
+ # This is a rough test to see whether or not we're a template or
+ # a static page
+ return -1 unless @{$r->{objects}||[]};
+
+ $r->{error} = <<EOF;
+
+<H1> Template not found </H1>
+
+This template was not found while processing the following request:
+
+<B>@{[$r->{action}]}</B> on table <B>@{[ $r->{table} ]}</B> with objects:
+
+<PRE>
+@{[join "\n", @{$r->{objects}}]}
+</PRE>
+
+Looking for template <B>@{[$r->{template}]}</B> in paths:
+
+<PRE>
+@{[ join "\n", $self->paths($r) ]}
+</PRE>
+EOF
+ $r->{content_type} = "text/html";
+ $r->{output} = $r->{error};
+ return OK;
+ }
$r->{content_type} = "text/plain";
$r->{output} = $r->{error};
$r->send_output;
+ return ERROR;
}
sub template { die shift()." didn't define a decent template method!" }