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);
34 my %headers = $self->{ar}->headers_in;
36 $self->headers_in->set($_, $headers{$_});
39 $self->{path} = $self->{ar}->uri;
40 my $loc = $self->{ar}->location;
41 no warnings 'uninitialized';
42 $self->{path} .= '/' if $self->{path} eq $loc;
43 $self->{path} =~ s/^($loc)?\///;
50 $self->{params} = { $self->_mod_perl_args( $self->{ar} ) };
51 $self->{query} = { $self->_mod_perl_args( $self->{ar} ) };
56 $r->{ar}->content_type(
57 $r->{content_type} =~ m/^text/
58 ? $r->{content_type} . "; charset=" . $r->{document_encoding}
61 $r->{ar}->headers_out->set(
62 "Content-Length" => do { use bytes; length $r->{output} }
65 foreach ($r->headers_out->field_names) {
66 next if /^Content-(Type|Length)/;
67 $r->{ar}->headers_out->set($_ => $r->headers_out->get($_));
70 APACHE2 || $r->{ar}->send_http_header;
71 $r->{ar}->print( $r->{output} );
74 sub get_template_root {
76 $r->{ar}->document_root . "/" . $r->{ar}->location;
80 my ( $self, $apr ) = @_;
82 foreach my $key ( $apr->param ) {
83 my @values = $apr->param($key);
84 $args{$key} = @values == 1 ? $values[0] : \@values;
93 Apache::MVC - Apache front-end to Maypole
98 use base 'Apache::MVC';
99 BeerDB->setup("dbi:mysql:beerdb");
100 BeerDB->config->uri_base("http://your.site/");
101 BeerDB->config->display_tables([qw[beer brewery pub style]]);
102 # Now set up your database:
103 # has-a relationships
110 Maypole is a Perl web application framework to Java's struts. It is
111 essentially completely abstracted, and so doesn't know anything about
112 how to talk to the outside world. C<Apache::MVC> is a mod_perl based
115 To use it, you need to create a package which represents your entire
116 application. In our example above, this is the C<BeerDB> package.
118 This needs to first inherit from C<Apache::MVC>, and then call setup.
119 This will give your package an Apache-compatible C<handler> subroutine,
120 and then pass any parameters onto the C<setup_database> method of the
121 model class. The default model class for Maypole uses L<Class::DBI> to
122 map a database to classes, but this can be changed by messing with the
123 configuration. (B<Before> calling setup.)
125 Next, you should configure your application through the C<config>
126 method. Configuration parameters at present are:
132 You B<must> specify this; it is the base URI of the application, which
133 will be used to construct links.
137 If you do not want all of the tables in the database to be accessible,
138 then set this to a list of only the ones you want to display
142 List output is paged if you set this to a positive number of rows.
146 You should also set up relationships between your classes, such that,
147 for instance, calling C<brewery> on a C<BeerDB::Beer> object returns an
148 object representing its associated brewery.
150 For a full example, see the included "beer database" application.
154 Create a driver module like the one above.
156 Put the following in your Apache config:
159 SetHandler perl-script
163 Copy the templates found in F<templates/factory> into the
164 F<beer/factory> directory off the web root. When the designers get
165 back to you with custom templates, they are to go in
166 F<beer/custom>. If you need to do override templates on a
167 database-table-by-table basis, put the new template in
170 This will automatically give you C<add>, C<edit>, C<list>, C<view> and
171 C<delete> commands; for instance, a list of breweries, go to
173 http://your.site/beer/brewery/list
175 For more information about how the system works and how to extend it,
178 =head1 Implementation
180 This class overrides a set of methods in the base Maypole class to provide it's
181 functionality. See L<Maypole> for these:
187 =item get_template_root
199 Simon Cozens, C<simon@cpan.org>
200 Marcus Ramberg, C<marcus@thefeed.no>
201 Screwed up by Sebastian Riedel, C<sri@oook.de>
205 You may distribute this code under the same terms as Perl itself.