]> git.decadent.org.uk Git - maypole.git/blobdiff - lib/Maypole.pm
components now work
[maypole.git] / lib / Maypole.pm
index c43de77e3f4a0d8faa907dfed082775ec6c58334..83607c8db34137662cf0694cf8a494179d319d18 100644 (file)
@@ -3,10 +3,10 @@ use base qw(Class::Accessor::Fast Class::Data::Inheritable);
 use UNIVERSAL::require;
 use strict;
 use warnings;
+use Data::Dumper;
 use Maypole::Config;
 use Maypole::Constants;
 use Maypole::Headers;
-use Maypole::Components;
 use URI();
 use URI::QueryParam;
 use NEXT;
@@ -255,7 +255,7 @@ Some packages respond to higher debug levels, try increasing it to 2 or 3.
 
 =cut
 
-sub debug { 0 }
+sub debug { 1 }
 
 =item config
 
@@ -275,7 +275,7 @@ documentation. However here is the most usage of setup where
 Maypole::Model::CDBI is the base class.
 
  My::App->setup($data_source, $user, $password,
-       {  opitons => {  # These are DB connection options
+       {  options => {  # These are DB connection options
                AutoCommit => 0,
                RaiseError => 1,
                ...
@@ -445,8 +445,9 @@ sub handler : method  {
   # initialise the request
   $self->headers_out(Maypole::Headers->new);
   $self->get_request($req);
+
   $self->parse_location;
-    
+
   # hook useful for declining static requests e.g. images, or perhaps for 
   # sanitizing request parameters
   $self->status(Maypole::Constants::OK()); # set the default
@@ -460,6 +461,7 @@ sub handler : method  {
   $self->get_user;
     
   my $status = $self->handler_guts;
+
   return $status unless $status == OK;
 
   # TODO: require send_output to return a status code
@@ -468,11 +470,9 @@ sub handler : method  {
   return $status;
 }
 
-=back
-
-=head2 component
+=item component
 
-  Run Maypole sub-requests as components using L<Maypole::Components>
+  Run Maypole sub-requests as a component of the request
 
   [% request.component("/beer/view_as_component/20") %]
 
@@ -481,18 +481,24 @@ request. You'll need to set up actions and templates
 which return fragments of HTML rather than entire pages, but once you've
 done that, you can use the C<component> method of the Maypole request object
 to call those actions. You may pass a query string in the usual URL style.
+
 You should not fully qualify the Maypole URLs.
 
+Note: any HTTP POST or URL parameters passed to the parent are not passed to the
+component sub-request, only what is included in the url passed as an argyument
+to the method
+
 =cut
 
 sub component {
     my ( $r, $path ) = @_;
-    my $self = bless { parent => $r }, ref $r;
+    my $self = bless { parent => $r, config => $r->{config}, template_args => {}, }, ref $r;
+    $self->get_user;
     my $url = URI->new($path);
+    warn "path : $path\n";
     $self->{path} = $url->path;
     $self->parse_path;
     $self->params( $url->query_form_hash );
-    $self->query( $r->params );
     $self->handler_guts;
     return $self->output;
 }
@@ -561,17 +567,14 @@ sub handler_guts
     $self->__load_request_model;
 
     my $applicable = $self->is_model_applicable == OK;
-    
-    $self->__setup_plain_template unless $applicable;
 
     my $status;
 
+    # handle authentication
     eval { $status = $self->call_authenticate };
-    
     if ( my $error = $@ ) 
     {
         $status = $self->call_exception($error, "authentication");
-        
         if ( $status != OK ) 
         {
             warn "caught authenticate error: $error";
@@ -579,35 +582,33 @@ sub handler_guts
                     $self->view_object->error($self, $error) : ERROR;
         }
     }
-    
     if ( $self->debug and $status != OK and $status != DECLINED ) 
     {
         $self->view_object->error( $self,
             "Got unexpected status $status from calling authentication" );
     }
-    
+
     return $status unless $status == OK;
 
     # We run additional_data for every request
     $self->additional_data;
-    
-    if ($applicable) 
-    {
-        eval { $self->model_class->process($self) };
-        
-        if ( my $error = $@ ) 
+
+    if ($applicable) {
+      eval { $self->model_class->process($self) };
+      if ( my $error = $@ ) 
         {
-            $status = $self->call_exception($error, "model");
-            
-            if ( $status != OK ) 
+         $status = $self->call_exception($error, "model");
+         if ( $status != OK )
             {
-                warn "caught model error: $error";
-                return $self->debug ? 
-                    $self->view_object->error($self, $error) : ERROR;
+             warn "caught model error: $error";
+             return $self->debug ? 
+               $self->view_object->error($self, $error) : ERROR;
             }
         }
+    } else {
+      $self->__setup_plain_template;
     }
-    
+
     # less frequent path - perhaps output has been set to an error message
     return OK if $self->output;
 
@@ -617,6 +618,7 @@ sub handler_guts
     $self->{content_type}      ||= $self->__get_mime_type();
     $self->{document_encoding} ||= "utf-8";
 
+
     return $processed_view_ok;
 }
 
@@ -629,11 +631,14 @@ my %filetypes = (
 
 sub __get_mime_type {
   my $self = shift;
-  my $type;
+  my $type = 'text/html';
   if ($self->path =~ m/.*\.(\w{3,4})$/) {
     $type = $filetypes{$1};
   } else {
-    $type = $mmagic->checktype_contents($self->output);
+    my $output = $self->output;
+    if (defined $output) {
+      $type = $mmagic->checktype_contents($output);
+    }
   }
   return $type;
 }
@@ -650,7 +655,7 @@ sub __load_request_model
 sub __setup_plain_template
 {
     my ($self) = @_;
-    
+
     # It's just a plain template
     $self->model_class(undef);
     
@@ -663,27 +668,24 @@ sub __setup_plain_template
 
 # The model has been processed or skipped (if is_applicable returned false), 
 # any exceptions have been handled, and there's no content in $self->output
-sub __call_process_view
-{
-    my ($self) = @_;
-    
-    my $status;
-    
-    eval { $status = $self->view_object->process($self) };
-    
-    if ( my $error = $@ ) 
-    {
-        $status = $self->call_exception($error, "view");
-        
-        if ( $status != OK ) 
-        {
-            warn "caught view error: $error" if $self->debug;
-            return $self->debug ? 
-                $self->view_object->error($self, $error) : ERROR;
-        }
+sub __call_process_view {
+  my ($self) = @_;
+
+  my $status = eval { $self->view_object->process($self) };
+
+  my $error = $@ || $self->{error};
+
+  if ( $error ) {
+    $status = $self->call_exception($error, "view");
+
+    if ( $status != OK ) {
+      warn "caught view error: $error" if $self->debug;
+      return $self->debug ? 
+       $self->view_object->error($self, $error) : ERROR;
     }
-    
-    return $status;
+  }
+
+  return $status;
 }
 
 =item get_request
@@ -1440,8 +1442,7 @@ L<Maypole::Application>, L<Apache::MVC>, L<CGI::Maypole>.
 
 =head1 AUTHOR
 
-Maypole is currently maintained by Aaron Trevena, David Baird, Dave Howorth and
-Peter Speltz.
+Maypole is currently maintained by Aaron Trevena.
 
 =head1 AUTHOR EMERITUS