Apache2-Controller
view release on metacpan or search on metacpan
lib/Apache2/Controller/Render/Template.pm view on Meta::CPAN
# if exists but undefined, it means it failed totally.
# forget about using an error template and just rethrow the error
if (!defined $template) {
if (ref($X) && $X->isa('Apache2::Controller::X')) {
$X->rethrow();
}
else {
a2cx "Cannot process any template for unknown-type error: $X";
}
}
$self->{template} = $template;
$self->render();
}
else {
# does the error directory even exist?
# first try the appropriately named file:
my %try_errors = ( );
$self->{template} = "errors/$status_file.html";
eval { $self->render() };
# if got an error using that file name, try the default error file:
if ($EVAL_ERROR) {
$try_errors{$self->{template}} = "$EVAL_ERROR";
$self->{template} = "errors/default.html";
eval { $self->render() };
# and if error template doesn't work, throw back original error
if ($EVAL_ERROR) {
DEBUG "Error rendering error file: $EVAL_ERROR";
$try_errors{$self->{template}} = "$EVAL_ERROR";
$error_templates{$template_dir}{$status_file} = undef;
if (ref $X && $X->isa('Apache2::Controller::X')) {
$X->rethrow();
}
else {
my $dump = { tries => \%try_errors, reftype => ref $X };
a2cx message => "$X",
status => $status,
status_line => $status_line,
'dump' => $dump;
}
}
}
# after finding the right template for code, remember it for next time
$error_templates{$template_dir}{$status_file} = $self->{template};
}
return;
}
=head2 detect_template
This is called internally by the render methods, but you can use
it to figure out the default template from where you are.
To override the auto-select template, just set $self->{template}
before you call C<<render()>>.
It looks for templates in a computed directory. The directory where it
looks will always be the directory set with the A2C_Render_Template_Path
directive in the config file, appended with the current request location,
i.e. the directory of the Location directive in the config file,
appended with relative_uri, appended with method name and '.html'.
A2C_Render_Template_Path + location + relative_uri + method.html
For example, the sequence in SYNOPSIS above renders the file
C</var/myapp/templates/foo/default.html> .
Suppose the dispatch class above dispatches sub-path uris starting
with 'bar/biz' to another controller. That controller would look for
templates in the directory /var/myapp/templates/foo/bar/biz/methodname.html.
Example:
Request: http://myserver.xyz/foo/bar/biz/baz/boz/noz
location = /foo
relative_uri = bar/biz
controller MyApp::C::Foo::Bar::Biz # mapped in your A2C Dispatch
found method = baz
path_args = [ boz, noz ]
template = /var/myapp/templates + /foo + /bar/biz + /baz.html
/var/myapp/templates/foo/bar/biz/baz.html
$self->{relative_uri} is the uri relative to the location,
so in other words:
location + relative_uri == full uri - path args
See Apache2::Controller::Dispatch::Simple.
=cut
sub detect_template {
my ($self) = @_;
if (exists $self->{template}) {
DEBUG("have a template already, returning $self->{template}");
return $self->{template};
}
(my $rel_uri = ($self->pnotes->{a2c}{relative_uri} || '') ) =~ s{ \A / }{}mxs;
my $loc = $self->location();
my $file = "$self->{method}.html";
DEBUG(sub{ "before detect_template() changes:\n".Dump({
loc => $loc,
rel_uri => $rel_uri,
file => $file,
})});
# trim leading and trailing /'s
$loc = '' if $loc eq '/';
( run in 2.198 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )