]> git.decadent.org.uk Git - maypole.git/commitdiff
And now we have paging support. (And some better docs)
authorSimon Cozens <simon@simon-cozens.org>
Thu, 5 Feb 2004 17:19:03 +0000 (17:19 +0000)
committerSimon Cozens <simon@simon-cozens.org>
Thu, 5 Feb 2004 17:19:03 +0000 (17:19 +0000)
git-svn-id: http://svn.maypole.perl.org/Maypole/trunk@46 48953598-375a-da11-a14b-00016c27c3ee

lib/Apache/MVC.pm
lib/Apache/MVC/Model/Base.pm
lib/Apache/MVC/Model/CDBI.pm
lib/Apache/MVC/Workflow.pod
lib/BeerDB.pm
templates/factory/list
templates/factory/pager [new file with mode: 0644]

index 4b1a60005750c186b7659cdefa224e01b72afee0..61e07640cfb8976dfc519e63d60d1f3fb2272250 100644 (file)
@@ -8,7 +8,7 @@ use strict;
 use warnings;
 our $VERSION = "0.1";
 __PACKAGE__->mk_classdata($_) for qw( _config init_done view_object );
-__PACKAGE__->mk_accessors ( qw( config ar params objects model_class
+__PACKAGE__->mk_accessors ( qw( config ar params query objects model_class
 args action template ));
 __PACKAGE__->config({});
 __PACKAGE__->init_done(0);
@@ -109,6 +109,7 @@ sub parse_location {
     $self->{args} = \@pi;
 
     $self->{params} = { $self->{ar}->content };
+    $self->{query}  = { $self->{ar}->args };
 }
 
 sub is_applicable {
index b7337be7e2996808434cb9bacc3c364983275bf2..908a2fca294a926e2f412c5daee3d2345479c9d7 100644 (file)
@@ -6,11 +6,6 @@ sub FETCH_CODE_ATTRIBUTES { $remember{$_[1]} }
 sub view :Exported { }
 sub edit :Exported { }
 
-sub list :Exported {
-    my ($self, $r) = @_;
-    $r->objects([ $self->retrieve_all ]);
-}
-
 sub process {
     my ($class, $r) = @_;
     $r->template( my $method = $r->action );
@@ -64,7 +59,23 @@ This is the name of the table.
 
 =head2 Commands
 
-See the exported commands in C<Apache::MVC::Model::CDBI>.
+=over
+
+=item list
+
+The C<list> method should fill C<< $r-> objects >> with all of the
+objects in the class. You may want to page this using C<Data::Page> or
+similar.
+
+=back
+
+=cut
+
+sub list :Exported { die "This is an abstract method" };
+
+=pod
+
+Also, see the exported commands in C<Apache::MVC::Model::CDBI>.
 
 =head1 Other overrides
 
index d842d5f16730788f52efb256d88bbbf83057fa63..854118e1559f2007fda5983a31a41b2708a604ae 100644 (file)
@@ -4,9 +4,23 @@ use Lingua::EN::Inflect::Number qw(to_PL);
 use Class::DBI::AsForm;
 use Class::DBI::FromCGI;
 use Class::DBI::AbstractSearch;
+use Class::DBI::Pager;
 use CGI::Untaint;
 use strict;
 
+=head1 NAME
+
+Apache::MVC::Model::CDBI - Model class based on Class::DBI
+
+=head1 DESCRIPTION
+
+This is a master model class which uses C<Class::DBI> to do all the hard
+work of fetching rows and representing them as objects. It is a good
+model to copy if you're replacing it with other database abstraction
+modules.
+
+=cut
+
 sub related {
     my ($self, $r) = @_;
     # Has-many methods; XXX this is a hack
@@ -67,15 +81,13 @@ sub search :Exported {
     $r->{template_args}{search} = 1;
 }
 
+sub list :Exported {
+    my ($self, $r) = @_;
+    if ( my $rows = $r->config->{rows_per_page}) {
+        $self = $self->pager($rows, $r->query->{page});
+        $r->{template_args}{pager} = $self;
+    } 
+    $r->objects([ $self->retrieve_all ]);
+}
 1;
 
-=head1 NAME
-
-Apache::MVC::Model::CDBI - Model class based on Class::DBI
-
-=head1 DESCRIPTION
-
-This is a master model class which uses C<Class::DBI> to do all the hard
-work of fetching rows and representing them as objects; instead, it
-concentrates on the actions that can be performed in the URL:
-C<do_edit>, C<delete> and C<search>.
index 7a0e9f3d4284dd296c6da9fe808aa9333340df80..15d87c03120d15bb6c93424870eebd9861240915 100644 (file)
@@ -64,7 +64,7 @@ several slots of the request object. First, C<table> and C<action>
 should be populated with the name of the table and the action parts of
 the URL. Any other arguments should be placed in a listref in the
 C<args> slot, and GET and POST parameters should be arranged into a hash
-and placed in the C<params> slot.
+and placed in the C<query> and C<params> slots, respectively.
 
 Some people may not like the idea of passing everything around in the
 URL; this is the method to override for you. Of course, you'll also need
index ec9677adab670d142a7c7f9bc91fedcfc207f265..1f673f27ddc6363e6530ae9e5ce880a0d78ee887 100644 (file)
@@ -13,6 +13,8 @@ BeerDB->set_database("dbi:mysql:beerdb");
 #BeerDB->config->{uri_base} = "http://localhost/beerdb/";
 BeerDB->config->{uri_base} = "http://neo.trinity-house.org.uk/beerdb/";
 
+BeerDB->config->{rows_per_page} = 10;
+
 # Handpumps should not show up.
 BeerDB->config->{display_tables} = [qw[beer brewery pub style]];
 BeerDB::Brewery->untaint_columns( printable => [qw/name notes url/] );
index d52d3e887075252ce886923e1de6cf05e47f15a3..2a159648187e4d099715f8a39a57855febfd3e9a 100644 (file)
@@ -30,5 +30,7 @@ FOR item = objects;
     "</tr>";
 END %]
 </TABLE>
+
+[% INCLUDE pager; %]
 [% INCLUDE addnew; %]
 </DIV>
diff --git a/templates/factory/pager b/templates/factory/pager
new file mode 100644 (file)
index 0000000..9053098
--- /dev/null
@@ -0,0 +1,18 @@
+[%
+IF pager AND pager.first_page != pager.last_page;
+%]
+
+<P ALIGN="center">Pages: 
+[%
+     FOREACH num = [pager.first_page .. pager.last_page];
+          IF num == pager.current_page;
+            "["; num; "] ";
+          ELSE;
+          '<A HREF="'; base; table; "/list/?page="; num; '">';
+            "["; num; "]";
+          '</A> ';
+          END;
+     END;
+%]
+</P>
+[% END %]