NAME
CGI::FormBuilder::Source::File - Initialize FormBuilder from external file
SYNOPSIS
# use the main moduleuse 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 basicsmethod: POSTheader: 1title: Account Information# define fieldsfields:fname:label: First Namesize: 40minit:label: Middle Initialsize: 1lname:label: Last Namesize: 60email:size: 80phone:label: Home Phonecomment: (optional)required: 0sex:label: Genderoptions: M=Male, F=Femalejsclick: javascript:alert('Change your mind??')# custom options and sorting substate:options: \&getstatessortopts: \&sortstatesdatafile:label: Upload Survey Datatype: filegrowable: 1# validate our above fieldsvalidate:email: EMAILphone: /^1?-?\d{3}-?\d{3}-?\d{4}$/required: ALL# create two submit buttons, and skip validation on "Cancel"submit: Update, Canceljsfunc: <<EOJS// skip validationif (this._submit.value == 'Cancel') return true;EOJS# CSSstyleclass: acctInfoFormstylesheet: /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:
[email protected]
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 codeuse 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: 1cellspacing: 4td:align: centerbgcolor: grayfont:face: arial,helveticasize: +1
You get the idea...
SEE ALSO
CGI::FormBuilder, Text::FormBuilder
REVISION
$Id: File.pm 100 2007-03-02 18:13:13Z nwiger $
AUTHOR
Copyright (c) Nate Wiger <http://nateware.com>. 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.