Brad Van Sickle wrote:
[ .. ]
Currently, I'm working on creating a content management system for a static website. The CMS has quite a few sections (manage users, manage events, manage articles, etc... ) but each section does basically the same things (displays the current records, allows you to delete or edit current records, allows you to create a new record) Right now I have it set up so each section is it's own application. I have an instance script and a package for each section. Within that package I change out the SQL statements and related code, load different templates for the create/edit forms, etc... It works well, but I'm not sure that this is the "right" way of doing things.

It seems to me that there is probably a way to do this by using a different instance script for each section, but having them all leverage the same package by initializing it with section specific data on the forms and SQL statements, and than adding in subclasses or instance script code for any additional methods that may be required... but I'm still kind of new with OO PERL and I can't quite wrap my head around the details.

Another way to approach this is to use CGI::Application::Dispatch, and revert to a single instance script pointing to your Dispatch class, and let *it* load the relevant controller class. That way you can have an integrated application with many separate components, for example - using the MVC approach - UserManager, EventManager, ArticleManager controller classes. So something like the following would do it:

# myapp.cgi:
use MyApp::Dispatch;
MyApp::Dispatch->dispatch();

# MyApp::Dispatch:
use base 'CGI::Application::Dispatch';

my @config_files = map { '/path/to/app/root/config/' . $_ }
  $d->read; # where $d = IO::Dir->new('/path/to/app/root/config')

sub dispatch_args {
  return {
    prefix  => 'MyApp',
    table => [
      '/' => { app => 'YourDefaultController', rm => 'default_rm' },
      # specific matches (optional):
      'admin/:app'        => { prefix => 'MyApp::C::Admin' },
      'admin/:app/:rm'    => { prefix => 'MyApp::C::Admin' },
      'admin/:app/:rm/:id'=> { prefix => 'MyApp::C::Admin' },
      # generic matches:
      ':app' => { }, # MyApp::C::* - uses default runmode
      ':app/:rm' => { }, # MyApp::C::* - uses specified runmode
      ':app/:rm/:id' => { }, # captures 'id' in $self->param('id')
    ],
    args_to_new => {
      PARAMS => {
        config_files => \...@config_files,
     },
  }
}

# MyApp:Controller::UserManager
use base 'MyApp::Base';

sub default_runmode { ..}
sub display_users { .. }
sub delete_user { .. }
etc

# MyApp::Base # you could put common methods in here eg create
# record, delete record, etc

use base 'CGI::Application';
use CGI::Application::Plugin::TT;
use CGI::Application::Plugin::Session;
etc

Note, I've used 'C' instead of Controller in the dispatch_args() table definition to save it line-wrapping. See:
http://search.cpan.org/~markstos/CGI-Application-Dispatch-2.16/lib/CGI/Application/Dispatch.pm
for more details.

CAD also works well in mod_perl & fastcgi environments, and also when using CGI::Application::Server for development.

> Coding that class to handle dynamically passed SQL statements
> and process dynamic forms seems very very difficult to me.

This is where ORM's such as DBIx::Class and Rose come in very useful as your 'Model' in the MVC architecture, but that's a subject for another time.
--
Richard Jones

#####  CGI::Application community mailing list  ################
##                                                            ##
##  To unsubscribe, or change your message delivery options,  ##
##  visit:  http://www.erlbaum.net/mailman/listinfo/cgiapp    ##
##                                                            ##
##  Web archive:   http://www.erlbaum.net/pipermail/cgiapp/   ##
##  Wiki:          http://cgiapp.erlbaum.net/                 ##
##                                                            ##
################################################################

Reply via email to