NAME

CGI::FormBuilder::Source::File - Initialize FormBuilder from external file

SYNOPSIS

# use the main module
use CGI::FormBuilder;

my $form = CGI::FormBuilder->new(source => 'form.conf');

my $lname = $form->field('lname');  # like normal

DESCRIPTION

This parses a file that contains FormBuilder configuration options, and returns a hash suitable for creating a new $form object. Usually, you should not use this directly, but instead pass a $filename into CGI::FormBuilder, which calls this module.

The configuration format steals from Python (ack!) which is sensitive to indentation and newlines. This saves you work in the long run. Here's a complete form:

  # form basics
  method: POST
  header: 1
  title:  Account Information

  # define fields
  fields:
      fname:
          label:   First Name
          size:    40

      minit:
          label:   Middle Initial
          size:    1

      lname:
          label:   Last Name
          size:    60

      email:
          size:    80

      phone:
          label:    Home Phone
          comment:  (optional)
          required: 0

      sex:
          label:   Gender
          options: M=Male, F=Female
          jsclick: javascript:alert('Change your mind??')

      # custom options and sorting sub
      state:
          options:  \&getstates
          sortopts: \&sortstates

      datafile:
          label:   Upload Survey Data
          type:    file
          growable:   1

  # validate our above fields
  validate:
      email:  EMAIL
      phone:  /^1?-?\d{3}-?\d{3}-?\d{4}$/

  required: ALL

  # create two submit buttons, and skip validation on "Cancel"
  submit:  Update, Cancel
  jsfunc:  <<EOJS
// skip validation
if (this._submit.value == 'Cancel') return true;
EOJS

  # CSS
  styleclass: acctInfoForm
  stylesheet: /style/acct.css

Any option that FormBuilder accepts is supported by this configuration file. Basically, any time that you would place a new bracket to create a nested data structure in FormBuilder, you put a newline and indent instead.

Multiple options MUST be separated by commas. All whitespace is preserved intact, so don't be confused and do something like this:

fields:
    send_me_emails:
        options: Yes No

Which will result in a single "Yes No" option. You want:

fields:
    send_me_emails:
        options: Yes, No

Or even better:

fields:
    send_me_emails:
        options: 1=Yes, 0=No

Or perhaps best of all:

fields:
    send_me_emails:
        options: 1=Yes Please, 0=No Thanks

If you're confused, please join the mailing list:

fbusers-subscribe@formbuilder.org

We'll be able to help you out.

METHODS

new()

This creates a new CGI::FormBuilder::Source::File object.

my $source = CGI::FormBuilder::Source::File->new;

Any arguments specified are taken as defaults, which the file then overrides. For example, to always turn off javascript (so you don't have to in all your config files), use:

my $source = CGI::FormBuilder::Source::File->new(
                  javascript => 0
             );

Then, every file parsed by $source will have javascript => 0 in it, unless that file has a javascript: setting itself.

parse($source)

This parses the specified source, which is either a $file, \$string, or \@array, and returns a hash which can be passed directly into CGI::FormBuilder:

my %conf = $source->parse('myform.conf');
my $form = CGI::FormBuilder->new(%conf);

write_module($modname)

This will actually write a module in the current directory which you can then use in subsequent scripts to get the same form:

$source->parse('myform.conf');
$source->write_module('MyForm');    # write MyForm.pm

# then in your Perl code
use MyForm;
my $form = MyForm->new;

You can also override settings from MyForm the same as you would in FormBuilder:

my $form = MyForm->new(
                header => 1,
                submit => ['Save Changes', 'Abort']
           );

This will speed things up, since you don't have to re-parse the file every time. Nice idea Peter.

NOTES

This module was completely inspired by Peter Eichman's Text::FormBuilder, though the syntax is different.

Remember that to get a new level in a hashref, you need to add a newline and indent. So to get something like this:

table => {cellpadding => 1, cellspacing => 4},
td    => {align => 'center', bgcolor => 'gray'},
font  => {face => 'arial,helvetica', size => '+1'},

You need to say:

table:
    cellpadding: 1
    cellspacing: 4

td:
    align: center
    bgcolor: gray

font:
    face: arial,helvetica
    size: +1

You get the idea...

SEE ALSO

CGI::FormBuilder, Text::FormBuilder

REVISION

$Id: File.pm 46 2006-08-22 16:11:04Z nwiger $

AUTHOR

Copyright (c) 2005-2006 Nathan Wiger <nate@wiger.org>. All Rights Reserved.

This module is free software; you may copy this under the terms of the GNU General Public License, or the Artistic License, copies of which should have accompanied your Perl kit.