X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=lib%2FMaypole%2FView%2FBase.pm;h=3164c0110ef8a25369a9dd19d1cd55c304439e18;hb=2c41363d0f5abf35c8d642db4b837f52f5954b2c;hp=edba625a0d58808b5eb638313bb1a203b1efe74b;hpb=f9a6b47b3b916585d710eac141003fb8261d9c3c;p=maypole.git diff --git a/lib/Maypole/View/Base.pm b/lib/Maypole/View/Base.pm index edba625..3164c01 100644 --- a/lib/Maypole/View/Base.pm +++ b/lib/Maypole/View/Base.pm @@ -3,23 +3,35 @@ use File::Spec; use UNIVERSAL::moniker; use strict; use Maypole::Constants; +use Carp; sub new { bless {}, shift } # By default, do nothing. sub paths { my ( $self, $r ) = @_; my $root = $r->config->template_root || $r->get_template_root; - return ( - $root, - ( - $r->model_class - && File::Spec->catdir( $root, $r->model_class->moniker ) - ), - File::Spec->catdir( $root, "custom" ), - File::Spec->catdir( $root, "factory" ) - ); + if(ref($root) ne 'ARRAY') { + $root = [ $root ]; + } + my @output = (); + foreach my $path (@$root) { + push(@output, $path); + push(@output, + ( + $r->model_class + && File::Spec->catdir( $path, $r->model_class->table ) + ) + ); + push(@output, File::Spec->catdir( $path, "custom" )); + push(@output, File::Spec->catdir( $path, "factory" )); + } + + return @output; } + + + sub vars { my ( $self, $r ) = @_; my $class = $r->model_class; @@ -34,9 +46,8 @@ sub vars { # ... ); if ($class) { - my $classmeta = $args{classmetadata} ||= {}; + my $classmeta = $r->template_args->{classmetadata} ||= {}; $classmeta->{name} ||= $class; - $classmeta->{description} ||= $class->description; $classmeta->{table} ||= $class->table; $classmeta->{columns} ||= [ $class->display_columns ]; $classmeta->{list_columns} ||= [ $class->list_columns ]; @@ -45,6 +56,7 @@ sub vars { $classmeta->{moniker} ||= $class->moniker; $classmeta->{plural} ||= $class->plural_moniker; $classmeta->{cgi} ||= { $class->to_cgi }; + $classmeta->{stringify_column} ||= $class->stringify_column; # User-friendliness facility for custom template writers. if ( @{ $r->objects || [] } > 1 ) { @@ -56,15 +68,12 @@ sub vars { } # Overrides - local $r->{template_args}{classmetadata}; # already overrides - %args = ( %args, %{ $r->{template_args} || {} } ); + %args = ( %args, %{ $r->template_args || {} } ); %args; } sub process { my ( $self, $r ) = @_; - $r->{content_type} ||= "text/html"; - $r->{document_encoding} ||= "utf-8"; my $status = $self->template($r); return $self->error($r) if $status != OK; return OK; @@ -73,38 +82,41 @@ sub process { sub error { my ( $self, $r, $desc ) = @_; $desc = $desc ? "$desc: " : ""; - warn $desc . $r->{error} ."\n"; if ( $r->{error} =~ /not found$/ ) { - + warn "template not found error : ", $r->{error}; # This is a rough test to see whether or not we're a template or # a static page return -1 unless @{ $r->{objects} || [] }; + my $template_error = $r->{error}; $r->{error} = < Template not found -

Template not found

+A template was not found while processing the following request: -This template was not found while processing the following request: +@{[$r->{action}]} on table +@{[ $r->{table} ]} with objects: -@{[$r->{action}]} on table @{[ $r->{table} ]} with objects: - -
+
 @{[join "\n", @{$r->{objects}}]}
-
+
+ -Looking for template @{[$r->{template}]} in paths: +The main template is @{[$r->{template}]}. +The template subsystem's error message was +
+$template_error
+
+We looked in paths: -
+
 @{[ join "\n", $self->paths($r) ]}
-
+
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; } @@ -115,27 +127,28 @@ sub template { die shift() . " didn't define a decent template method!" } =head1 NAME -Maypole::View::Base - Base cl +Maypole::View::Base - Base class for view classes =head1 DESCRIPTION This is the base class for Maypole view classes. This is an abstract class -meant to define the interface, and can't be used directly. +that defines the interface, and can't be used directly. =head2 process -This is the engine of this module. It populates all the relevant variables -and calls the requested action. +This is the entry point for the view. It templates the request and returns a +C indicate success or failure for the view phase. -Anyone subclassing this for a different database abstraction mechanism -needs to provide the following methods: +Anyone subclassing this for a different rendering mechanism needs to provide +the following methods: -=head2 template +=head2 template -In this method you do the actual processing of your template. it should use L -to search for components, and provide the templates with easy access to the contents -of L. It should put the result in $r->{output} and return OK if processing was -sucessfull, or populate $r->{error} and return ERROR if it fails. +In this method you do the actual processing of your template. it should use +L to search for components, and provide the templates with easy access +to the contents of L. It should put the result in C<$r-Eoutput> and +return C if processing was sucessfull, or populate C<$r-Eerror> and +return C if it fails. =head1 Other overrides @@ -148,14 +161,14 @@ during view initialization. =head2 paths -Returns search paths for templates. the default method returns factory, custom and - under the configured template root. +Returns search paths for templates. the default method returns folders for the +model class's C, factory, custom under the configured template root. =head2 vars -returns a hash of data the template should have access to. The default one populates -classmetadata if there is a class, as well as setting the data objects by name if -there is one or more objects available. +returns a hash of data the template should have access to. The default one +populates classmetadata if there is a table class, as well as setting the data +objects by name if there is one or more objects available. =head2 error