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 100 2007-03-02 18:13:13Z nwiger $
AUTHOR
Copyright (c) Nate Wiger. 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.