12 use constant APACHE2 => $mod_perl::VERSION >= 1.99;
16 require Apache::RequestIO;
17 require Apache::RequestRec;
18 require Apache::RequestUtil;
21 else { require Apache }
22 require Apache::Request;
25 my ( $self, $r ) = @_;
26 $self->{ar} = Apache::Request->new($r);
32 # Reconstruct the request headers
33 $self->headers_in(Maypole::Headers->new);
35 if (APACHE2) { %headers = %{$self->{ar}->headers_in};
36 } else { %headers = $self->{ar}->headers_in; }
38 $self->headers_in->set($_, $headers{$_});
41 $self->{path} = $self->{ar}->uri;
42 my $loc = $self->{ar}->location;
43 no warnings 'uninitialized';
44 $self->{path} .= '/' if $self->{path} eq $loc;
45 $self->{path} =~ s/^($loc)?\///;
52 $self->{params} = { $self->_mod_perl_args( $self->{ar} ) };
53 $self->{query} = { $self->_mod_perl_args( $self->{ar} ) };
58 $r->{ar}->content_type(
59 $r->{content_type} =~ m/^text/
60 ? $r->{content_type} . "; charset=" . $r->{document_encoding}
63 $r->{ar}->headers_out->set(
64 "Content-Length" => do { use bytes; length $r->{output} }
67 foreach ($r->headers_out->field_names) {
68 next if /^Content-(Type|Length)/;
69 $r->{ar}->headers_out->set($_ => $r->headers_out->get($_));
72 APACHE2 || $r->{ar}->send_http_header;
73 $r->{ar}->print( $r->{output} );
76 sub get_template_root {
78 $r->{ar}->document_root . "/" . $r->{ar}->location;
82 my ( $self, $apr ) = @_;
84 foreach my $key ( $apr->param ) {
85 my @values = $apr->param($key);
86 $args{$key} = @values == 1 ? $values[0] : \@values;
95 Apache::MVC - Apache front-end to Maypole
100 use base 'Apache::MVC';
101 BeerDB->setup("dbi:mysql:beerdb");
102 BeerDB->config->uri_base("http://your.site/");
103 BeerDB->config->display_tables([qw[beer brewery pub style]]);
104 # Now set up your database:
105 # has-a relationships
112 Maypole is a Perl web application framework to Java's struts. It is
113 essentially completely abstracted, and so doesn't know anything about
114 how to talk to the outside world. C<Apache::MVC> is a mod_perl based
117 To use it, you need to create a package which represents your entire
118 application. In our example above, this is the C<BeerDB> package.
120 This needs to first inherit from C<Apache::MVC>, and then call setup.
121 This will give your package an Apache-compatible C<handler> subroutine,
122 and then pass any parameters onto the C<setup_database> method of the
123 model class. The default model class for Maypole uses L<Class::DBI> to
124 map a database to classes, but this can be changed by messing with the
125 configuration. (B<Before> calling setup.)
127 Next, you should configure your application through the C<config>
128 method. Configuration parameters at present are:
134 You B<must> specify this; it is the base URI of the application, which
135 will be used to construct links.
139 If you do not want all of the tables in the database to be accessible,
140 then set this to a list of only the ones you want to display
144 List output is paged if you set this to a positive number of rows.
148 You should also set up relationships between your classes, such that,
149 for instance, calling C<brewery> on a C<BeerDB::Beer> object returns an
150 object representing its associated brewery.
152 For a full example, see the included "beer database" application.
156 Create a driver module like the one above.
158 Put the following in your Apache config:
161 SetHandler perl-script
165 Copy the templates found in F<templates/factory> into the
166 F<beer/factory> directory off the web root. When the designers get
167 back to you with custom templates, they are to go in
168 F<beer/custom>. If you need to do override templates on a
169 database-table-by-table basis, put the new template in
172 This will automatically give you C<add>, C<edit>, C<list>, C<view> and
173 C<delete> commands; for instance, a list of breweries, go to
175 http://your.site/beer/brewery/list
177 For more information about how the system works and how to extend it,
180 =head1 Implementation
182 This class overrides a set of methods in the base Maypole class to provide it's
183 functionality. See L<Maypole> for these:
189 =item get_template_root
201 Simon Cozens, C<simon@cpan.org>
202 Marcus Ramberg, C<marcus@thefeed.no>
203 Screwed up by Sebastian Riedel, C<sri@oook.de>
207 You may distribute this code under the same terms as Perl itself.