]> git.decadent.org.uk Git - maypole.git/blobdiff - lib/Maypole.pm
reworked components
[maypole.git] / lib / Maypole.pm
index 5db199b484ae12a13c492aa3c16e64e419476e51..c43de77e3f4a0d8faa907dfed082775ec6c58334 100644 (file)
@@ -8,6 +8,8 @@ use Maypole::Constants;
 use Maypole::Headers;
 use Maypole::Components;
 use URI();
+use URI::QueryParam;
+use NEXT;
 use File::MMagic::XS qw(:compat);
 
 our $VERSION = '2.11';
@@ -202,7 +204,7 @@ __PACKAGE__->mk_classdata($_) for qw( config init_done view_object model_classes
 __PACKAGE__->mk_accessors(
     qw( params query objects model_class template_args output path
         args action template error document_encoding content_type table
-        headers_in headers_out stash status)
+        headers_in headers_out stash status parent)
 );
 
 __PACKAGE__->config( Maypole::Config->new() );
@@ -317,12 +319,11 @@ sub setup_model {
 
   # among other things, this populates $config->classes
   $config->model->setup_database($config, $class, @_);
+
   foreach my $subclass ( @{ $config->classes } ) {
     next if $subclass->isa("Maypole::Model::Base");
     no strict 'refs';
-    unshift @{ $subclass . "::ISA" }, $config->model; 
-
+    unshift @{ $subclass . "::ISA" }, $config->model;
   }
 
   # Load custom model code, if it exists - nb this must happen after the
@@ -467,12 +468,48 @@ sub handler : method  {
   return $status;
 }
 
+=back
+
+=head2 component
+
+  Run Maypole sub-requests as components using L<Maypole::Components>
+
+  [% request.component("/beer/view_as_component/20") %]
+
+  Allows you to integrate the results of a Maypole request into an existing
+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.
+
+=cut
+
 sub component {
-  my ($r,$path) = @_;
-  my $component = Maypole::Components->new(@_);
-  return $component->handler($path);
+    my ( $r, $path ) = @_;
+    my $self = bless { parent => $r }, ref $r;
+    my $url = URI->new($path);
+    $self->{path} = $url->path;
+    $self->parse_path;
+    $self->params( $url->query_form_hash );
+    $self->query( $r->params );
+    $self->handler_guts;
+    return $self->output;
 }
 
+sub get_template_root {
+    my $self = shift;
+    my $r    = shift;
+    return $r->parent->get_template_root if $r->{parent};
+    return $self->NEXT::DISTINCT::get_template_root( $r, @_ );
+}
+
+sub view_object {
+    my $self = shift;
+    my $r    = shift;
+    return $r->parent->view_object if $r->{parent};
+    return $self->NEXT::DISTINCT::view_object( $r, @_ );
+}
 
 # Instead of making plugin authors use the NEXT::DISTINCT hoopla to ensure other 
 # plugins also get to call the hook, we can cycle through the application's 
@@ -1080,8 +1117,6 @@ backend. Otherwise, see L<Maypole::Config/"template_root">
 
 =cut
 
-sub get_template_root {'.'}
-
 =back
 
 =head2 Request properties