No opinions or suggestions on this?
On Tue, Jan 17, 2006 at 02:24:21PM -0800, Bill Moseley wrote:
>
> I'm looking for namespace and package name suggestions for a (yes,
> another) form processing module.
>
> Its job it to move data between a store and input/output forms,
> validating along the way. It doesn't generate any HTML, although I use
> it in web applications mostly. But it's not limited to web
> applications.
>
> In my world it's in the "Form" namespace (Form::Base, Form::Field,
> Form::Model). But I'm not sure where it fits best in CPAN.
>
> Here's a somewhat brief description:
>
> A user of this module creates a form object that is used in their
> application. The user's form object inherits from this module (currently
> called Form::Base). A form is made up of field objects that inherit
> from Form::Field. So A "Text" field is Form::Field::Text and inherits
> from Form::Field. An "Integer" field is Form::Field::Integer and
> inherits from Form::Field::Text. And so on.
>
> Fields can contain a form object, so compound fields are easy to
> build (such as separate day, month, year that is a DateTime object
> internally).
>
>
> The magic of this module is when forms inherit from a "model" class
> instead of directly from Form::Base. For example, I use Class::DBI
> and there's Form::Model::CDBI. By looking at the database
> relationships Form::Model::CDBI can populate option lists, validate
> against those lists, and update many-to-many relationships.
>
> The module is based partly on the design of Rose-HTML-Objects, but
> again, this module focuses more on the database side instead of doing
> HTML generation.
>
> Here's a synopsis, if still following along:
>
> In an application you might want a controller to handle creating and
> updating a "User"
> record. And not want to write much code. Here's using Catalyst as an
> example:
>
> # Catalyst Controller
> package MyApplication::Controller::User;
> use strict;
> use MyApplication::Form::User;
>
> sub edit : Local {
> my ( $self, $c, $id ) = @_;
>
> # Create the form object
> my $form = MyApplication::Form::User->new( $id );
>
> # Update the user record if form posted and form validates
> $form->update_from_from( $c->request->parameters )
> if $c->form_posted;
>
> $c->stash->{form} = $form;
> }
>
> The above form class might then look like this:
>
> package MyApplication::Form::User;
> use strict;
> use base 'Form::Model::CDBI';
>
> sub object_class { 'DB::User' }
>
> sub profile {
> my $self = shift;
>
> return {
> required => {
> name => 'Text',
> age => 'PosInteger',
> username => 'Text'.
> password => 'Password',
> sex => 'Select',
> birthdate => 'PastDate',
> },
> optional => {
> hobbies => 'Multiple', # many-to-many
> address => 'Text',
> city => 'Text',
> state => 'Select', # lookup table
> },
>
> # Make sure this is unique in the database
> unique => [ qw/ username / ],
>
> # if any entered then all are required
> dependency => [
> [qw/ address city state /],
> ],
> };
> }
>
> sub options_sex {
> return (
> m => 'Male',
> f => 'Female',
> );
> }
> sub validate_age {
> my ( $self, $field ) = @_;
> $field->add_error('Sorry, you must be 18')
> if $field->value < 18;
> }
>
>
>
> Or when you need a quick, small form do this in a controller:
>
> my @fields = qw/ first_name last_name email /;
> $c->stash->{form} = Form::Base->new(
> profile => {
> required => {
> map { $_ => 'Text' } qw/ first_name last_name email /,
> },
> },
> );
>
>
>
>
>
> --
> Bill Moseley
> [EMAIL PROTECTED]
>
>
--
Bill Moseley
[EMAIL PROTECTED]