X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=lib%2FMaypole%2FView%2FBase.pm;h=c56ee51b1bb320ed2dd16c857506a3b1ff367256;hb=579b095b4e7b43a74f90334df6e79fe2366ef48c;hp=fdc66298adf38c5db34cb02258197ff5a2e441dd;hpb=5f530b5f17106319faa2f437a567332c86bf6a2c;p=maypole.git diff --git a/lib/Maypole/View/Base.pm b/lib/Maypole/View/Base.pm index fdc6629..c56ee51 100644 --- a/lib/Maypole/View/Base.pm +++ b/lib/Maypole/View/Base.pm @@ -34,16 +34,17 @@ sub vars { # ... ); if ($class) { - $args{classmetadata} = { - name => $class, - table => $class->table, - columns => [ $class->display_columns ], - colnames => { $class->column_names }, - related_accessors => [ $class->related($r) ], - moniker => $class->moniker, - plural => $class->plural_moniker, - cgi => { $class->to_cgi }, - }; + my $classmeta = $args{classmetadata} ||= {}; + $classmeta->{name} ||= $class; + $classmeta->{description} ||= $class->description; + $classmeta->{table} ||= $class->table; + $classmeta->{columns} ||= [ $class->display_columns ]; + $classmeta->{list_columns} ||= [ $class->list_columns ]; + $classmeta->{colnames} ||= { $class->column_names }; + $classmeta->{related_accessors} ||= [ $class->related($r) ]; + $classmeta->{moniker} ||= $class->moniker; + $classmeta->{plural} ||= $class->plural_moniker; + $classmeta->{cgi} ||= { $class->to_cgi }; # User-friendliness facility for custom template writers. if ( @{ $r->objects || [] } > 1 ) { @@ -55,22 +56,25 @@ sub vars { } # Overrides + local $r->{template_args} = $r->{template_args}; + delete $r->{template_args}{classmetadata}; # already overrides %args = ( %args, %{ $r->{template_args} || {} } ); %args; } sub process { my ( $self, $r ) = @_; - my $status = $self->template($r); - return $self->error($r) if $status != OK; $r->{content_type} ||= "text/html"; $r->{document_encoding} ||= "utf-8"; + my $status = $self->template($r); + return $self->error($r) if $status != OK; return OK; } sub error { - my ( $self, $r ) = @_; - warn $r->{error}; + my ( $self, $r, $desc ) = @_; + $desc = $desc ? "$desc: " : ""; + warn $desc . $r->{error} ."\n"; if ( $r->{error} =~ /not found$/ ) { # This is a rough test to see whether or not we're a template or @@ -108,3 +112,53 @@ EOF sub template { die shift() . " didn't define a decent template method!" } 1; + + +=head1 NAME + +Maypole::View::Base - Base cl + +=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. + +=head2 process + +This is the engine of this module. It populates all the relevant variables +and calls the requested action. + +Anyone subclassing this for a different database abstraction mechanism +needs to provide the following methods: + +=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. + +=head1 Other overrides + +Additionally, individual derived model classes may want to override the + +=head2 new + +The default constructor does nothing. You can override this to perform actions +during view initialization. + +=head2 paths + +Returns search paths for templates. the default method returns factory, custom and + 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. + +=head2 error + + +=cut