1 package Maypole::View::Base;
3 use UNIVERSAL::moniker;
5 use Maypole::Constants;
8 sub new { bless {}, shift } # By default, do nothing.
11 my ( $self, $r ) = @_;
12 my $root = $r->config->template_root || $r->get_template_root;
13 if(ref($root) ne 'ARRAY') {
18 foreach my $path (@$root) {
22 && File::Spec->catdir( $path, $r->model_class->table )
25 push(@output, File::Spec->catdir( $path, "custom" )) unless ($i);
27 push(@output, File::Spec->catdir( $path, "factory" )) unless ($i);
31 return grep( $_, @output);
35 my ( $self, $r ) = @_;
36 my $class = $r->model_class;
37 my $base = $r->config->uri_base;
41 objects => $r->objects,
46 $args{object} = $r->object if ($r->can('object'));
49 my $classmeta = $r->template_args->{classmetadata} ||= {};
50 $classmeta->{name} ||= $class;
51 $classmeta->{table} ||= $class->table;
52 $classmeta->{columns} ||= [ $class->display_columns ] if ($class->can('display_columns'));
53 $classmeta->{list_columns} ||= [ $class->list_columns ] if ($class->can('list_columns'));
54 $classmeta->{colnames} ||= { $class->column_names } if ($class->can('column_names'));
55 $classmeta->{related_accessors} ||= [ $class->related($r) ];
56 $classmeta->{moniker} ||= $class->moniker;
57 $classmeta->{plural} ||= $class->plural_moniker;
58 $classmeta->{cgi} ||= { $class->to_cgi } if ($r->build_form_elements && $class->can('to_cgi'));
59 $classmeta->{stringify_column} ||= $class->stringify_column if ($class->can('stringify_column'));
61 # User-friendliness facility for custom template writers.
62 if ( @{ $r->objects || [] } > 1 ) {
63 $args{ $r->model_class->plural_moniker } = $r->objects;
66 ( $args{ $r->model_class->moniker } ) = @{ $r->objects || [] };
71 %args = ( %args, %{ $r->template_args || {} } );
76 my ( $self, $r ) = @_;
77 my $status = $self->template($r);
78 return $self->error($r) if $status != OK;
83 my ( $self, $r, $desc ) = @_;
84 $desc = $desc ? "$desc: " : "";
85 if ( $r->{error} =~ /not found$/ ) {
86 warn "template not found error : ", $r->{error};
87 # This is a rough test to see whether or not we're a template or
89 return -1 unless @{ $r->{objects} || [] };
91 my $template_error = $r->{error};
93 <h1> Template not found </h1>
95 A template was not found while processing the following request:
97 <strong>@{[$r->{action}]}</strong> on table
98 <strong>@{[ $r->{table} ]}</strong> with objects:
101 @{[join "\n", @{$r->{objects}}]}
105 The main template is <strong>@{[$r->{template}]}</strong>.
106 The template subsystem's error message was
113 @{[ join "\n", $self->paths($r) ]}
116 $r->{content_type} = "text/html";
117 $r->{output} = $r->{error};
123 sub template { die shift() . " didn't define a decent template method!" }
130 Maypole::View::Base - Base class for view classes
134 This is the base class for Maypole view classes. This is an abstract class
135 that defines the interface, and can't be used directly.
139 This is the entry point for the view. It templates the request and returns a
140 C<Maypole::Constant> indicate success or failure for the view phase.
142 Anyone subclassing this for a different rendering mechanism needs to provide
143 the following methods:
147 In this method you do the actual processing of your template. it should use
148 L<paths> to search for components, and provide the templates with easy access
149 to the contents of L<vars>. It should put the result in C<$r-E<gt>output> and
150 return C<OK> if processing was sucessfull, or populate C<$r-E<gt>error> and
151 return C<ERROR> if it fails.
153 =head1 Other overrides
155 Additionally, individual derived model classes may want to override the
159 The default constructor does nothing. You can override this to perform actions
160 during view initialization.
164 Returns search paths for templates. the default method returns folders for the
165 model class's C<moniker>, factory, custom under the configured template root.
169 returns a hash of data the template should have access to. The default one
170 populates classmetadata if there is a table class, as well as setting the data
171 objects by name if there is one or more objects available.