11 use constant APACHE2 => $mod_perl::VERSION >= 1.99;
15 require Apache::RequestIO;
16 require Apache::RequestRec;
17 require Apache::RequestUtil;
20 else { require Apache }
21 require Apache::Request;
24 my ( $self, $r ) = @_;
25 $self->{ar} = Apache::Request->new($r);
30 $self->{path} = $self->{ar}->uri;
31 my $loc = $self->{ar}->location;
32 no warnings 'uninitialized';
33 $self->{path} .= '/' if $self->{path} eq $loc;
34 $self->{path} =~ s/^($loc)?\///;
41 $self->{params} = { $self->_mod_perl_args( $self->{ar} ) };
42 $self->{query} = { $self->_mod_perl_args( $self->{ar} ) };
47 $r->{ar}->content_type(
48 $r->{content_type} =~ m/^text/
49 ? $r->{content_type} . "; charset=" . $r->{document_encoding}
52 $r->{ar}->headers_out->set(
53 "Content-Length" => do { use bytes; length $r->{output} }
55 foreach my $header (keys %{$r->{extra_headers}}) {
56 $r->{ar}->headers_out->set(
57 "$header" => $r->{extra_headers}{$header}
60 APACHE2 || $r->{ar}->send_http_header;
61 $r->{ar}->print( $r->{output} );
64 sub get_template_root {
66 $r->{ar}->document_root . "/" . $r->{ar}->location;
70 my ( $self, $apr ) = @_;
72 foreach my $key ( $apr->param ) {
73 my @values = $apr->param($key);
74 $args{$key} = @values == 1 ? $values[0] : \@values;
83 Apache::MVC - Apache front-end to Maypole
88 use base 'Apache::MVC';
89 BeerDB->setup("dbi:mysql:beerdb");
90 BeerDB->config->uri_base("http://your.site/");
91 BeerDB->config->display_tables([qw[beer brewery pub style]]);
92 # Now set up your database:
100 Maypole is a Perl web application framework to Java's struts. It is
101 essentially completely abstracted, and so doesn't know anything about
102 how to talk to the outside world. C<Apache::MVC> is a mod_perl based
105 To use it, you need to create a package which represents your entire
106 application. In our example above, this is the C<BeerDB> package.
108 This needs to first inherit from C<Apache::MVC>, and then call setup.
109 This will give your package an Apache-compatible C<handler> subroutine,
110 and then pass any parameters onto the C<setup_database> method of the
111 model class. The default model class for Maypole uses L<Class::DBI> to
112 map a database to classes, but this can be changed by messing with the
113 configuration. (B<Before> calling setup.)
115 Next, you should configure your application through the C<config>
116 method. Configuration parameters at present are:
122 You B<must> specify this; it is the base URI of the application, which
123 will be used to construct links.
127 If you do not want all of the tables in the database to be accessible,
128 then set this to a list of only the ones you want to display
132 List output is paged if you set this to a positive number of rows.
136 You should also set up relationships between your classes, such that,
137 for instance, calling C<brewery> on a C<BeerDB::Beer> object returns an
138 object representing its associated brewery.
140 For a full example, see the included "beer database" application.
144 Create a driver module like the one above.
146 Put the following in your Apache config:
149 SetHandler perl-script
153 Copy the templates found in F<templates/factory> into the
154 F<beer/factory> directory off the web root. When the designers get
155 back to you with custom templates, they are to go in
156 F<beer/custom>. If you need to do override templates on a
157 database-table-by-table basis, put the new template in
160 This will automatically give you C<add>, C<edit>, C<list>, C<view> and
161 C<delete> commands; for instance, a list of breweries, go to
163 http://your.site/beer/brewery/list
165 For more information about how the system works and how to extend it,
168 =head1 Implementation
170 This class overrides a set of methods in the base Maypole class to provide it's
171 functionality. See L<Maypole> for these:
177 =item get_template_root
189 Simon Cozens, C<simon@cpan.org>
190 Marcus Ramberg, C<marcus@thefeed.no>
191 Screwed up by Sebastian Riedel, C<sri@oook.de>
195 You may distribute this code under the same terms as Perl itself.