1CGI::FormBuilder(3) User Contributed Perl Documentation CGI::FormBuilder(3)
2
3
4
6 CGI::FormBuilder - Easily generate and process stateful forms
7
9 use CGI::FormBuilder;
10
11 # Assume we did a DBI query to get existing values
12 my $dbval = $sth->fetchrow_hashref;
13
14 # First create our form
15 my $form = CGI::FormBuilder->new(
16 name => 'acctinfo',
17 method => 'post',
18 stylesheet => '/path/to/style.css',
19 values => $dbval, # defaults
20 );
21
22 # Now create form fields, in order
23 # FormBuilder will automatically determine the type for you
24 $form->field(name => 'fname', label => 'First Name');
25 $form->field(name => 'lname', label => 'Last Name');
26
27 # Setup gender field to have options
28 $form->field(name => 'gender',
29 options => [qw(Male Female)] );
30
31 # Include validation for the email field
32 $form->field(name => 'email',
33 size => 60,
34 validate => 'EMAIL',
35 required => 1);
36
37 # And the (optional) phone field
38 $form->field(name => 'phone',
39 size => 10,
40 validate => '/^1?-?\d{3}-?\d{3}-?\d{4}$/',
41 comment => '<i>optional</i>');
42
43 # Check to see if we're submitted and valid
44 if ($form->submitted && $form->validate) {
45 # Get form fields as hashref
46 my $field = $form->fields;
47
48 # Do something to update your data (you would write this)
49 do_data_update($field->{lname}, $field->{fname},
50 $field->{email}, $field->{phone},
51 $field->{gender});
52
53 # Show confirmation screen
54 print $form->confirm(header => 1);
55 } else {
56 # Print out the form
57 print $form->render(header => 1);
58 }
59
61 If this is your first time using FormBuilder, you should check out the
62 website for tutorials and examples at <http://formbuilder.org>.
63
64 You should also consider joining the google group at
65 <http://groups.google.com/group/perl-formbuilder>. There are some
66 pretty smart people on the list that can help you out.
67
68 Overview
69 I hate generating and processing forms. Hate it, hate it, hate it, hate
70 it. My forms almost always end up looking the same, and almost always
71 end up doing the same thing. Unfortunately, there haven't really been
72 any tools out there that streamline the process. Many modules simply
73 substitute Perl for HTML code:
74
75 # The manual way
76 print qq(<input name="email" type="text" size="20">);
77
78 # The module way
79 print input(-name => 'email', -type => 'text', -size => '20');
80
81 The problem is, that doesn't really gain you anything - you still have
82 just as much code. Modules like "CGI.pm" are great for decoding
83 parameters, but not for generating and processing whole forms.
84
85 The goal of CGI::FormBuilder (FormBuilder) is to provide an easy way
86 for you to generate and process entire CGI form-based applications.
87 Its main features are:
88
89 Field Abstraction
90 Viewing fields as entities (instead of just params), where the HTML
91 representation, CGI values, validation, and so on are properties of
92 each field.
93
94 DWIMmery
95 Lots of built-in "intelligence" (such as automatic field typing),
96 giving you about a 4:1 ratio of the code it generates versus what
97 you have to write.
98
99 Built-in Validation
100 Full-blown regex validation for fields, even including JavaScript
101 code generation.
102
103 Template Support
104 Pluggable support for external template engines, such as
105 "HTML::Template", "Text::Template", "Template Toolkit", and
106 "CGI::FastTemplate".
107
108 Plus, the native HTML generated is valid XHTML 1.0 Transitional.
109
110 Quick Reference
111 For the incredibly impatient, here's the quickest reference you can
112 get:
113
114 # Create form
115 my $form = CGI::FormBuilder->new(
116
117 # Important options
118 fields => \@array | \%hash, # define form fields
119 header => 0 | 1, # send Content-type?
120 method => 'post' | 'get', # default is get
121 name => $string, # namespace (recommended)
122 reset => 0 | 1 | $str, # "Reset" button
123 submit => 0 | 1 | $str | \@array, # "Submit" button(s)
124 text => $text, # printed above form
125 title => $title, # printed up top
126 required => \@array | 'ALL' | 'NONE', # required fields?
127 values => \%hash | \@array, # from DBI, session, etc
128 validate => \%hash, # automatic field validation
129
130 # Lesser-used options
131 action => $script, # not needed (loops back)
132 cookies => 0 | 1, # use cookies for sessionid?
133 debug => 0 | 1 | 2 | 3, # gunk into error_log?
134 fieldsubs => 0 | 1, # allow $form->$field()
135 javascript => 0 | 1 | 'auto', # generate JS validate() code?
136 keepextras => 0 | 1 | \@array, # keep non-field params?
137 params => $object, # instead of CGI.pm
138 sticky => 0 | 1, # keep CGI values "sticky"?
139 messages => $file | \%hash | $locale | 'auto',
140 template => $file | \%hash | $object, # custom HTML
141
142 # HTML formatting and JavaScript options
143 body => \%attr, # {background => 'black'}
144 disabled => 0 | 1, # display as grayed-out?
145 fieldsets => \@arrayref # split form into <fieldsets>
146 font => $font | \%attr, # 'arial,helvetica'
147 jsfunc => $jscode, # JS code into validate()
148 jshead => $jscode, # JS code into <head>
149 linebreaks => 0 | 1, # put breaks in form?
150 selectnum => $threshold, # for auto-type generation
151 smartness => 0 | 1 | 2, # tweak "intelligence"
152 static => 0 | 1 | 2, # show non-editable form?
153 styleclass => $string, # style class to use ("fb")
154 stylesheet => 0 | 1 | $path, # turn on style class=
155 table => 0 | 1 | \%attr, # wrap form in <table>?
156 td => \%attr, # <td> options
157 tr => \%attr, # <tr> options
158
159 # These are deprecated and you should use field() instead
160 fieldtype => 'type',
161 fieldattr => \%attr,
162 labels => \%hash,
163 options => \%hash,
164 sortopts => 'NAME' | 'NUM' | 1 | \&sub,
165
166 # External source file (see CGI::FormBuilder::Source::File)
167 source => $file,
168 );
169
170 # Tweak fields individually
171 $form->field(
172
173 # Important options
174 name => $name, # name of field (required)
175 label => $string, # shown in front of <input>
176 type => $type, # normally auto-determined
177 multiple => 0 | 1, # allow multiple values?
178 options => \@options | \%options, # radio/select/checkbox
179 value => $value | \@values, # default value
180
181 # Lesser-used options
182 fieldset => $string, # put field into <fieldset>
183 force => 0 | 1, # override CGI value?
184 growable => 0 | 1 | $limit, # expand text/file inputs?
185 jsclick => $jscode, # instead of onclick
186 jsmessage => $string, # on JS validation failure
187 message => $string, # other validation failure
188 other => 0 | 1, # create "Other:" input?
189 required => 0 | 1, # must fill field in?
190 validate => '/regex/', # validate user input
191
192 # HTML formatting options
193 cleanopts => 0 | 1, # HTML-escape options?
194 columns => 0 | $width, # wrap field options at $width
195 comment => $string, # printed after field
196 disabled => 0 | 1, # display as grayed-out?
197 labels => \%hash, # deprecated (use "options")
198 linebreaks => 0 | 1, # insert breaks in options?
199 nameopts => 0 | 1, # auto-name options?
200 sortopts => 'NAME' | 'NUM' | 1 | \&sub, # sort options?
201
202 # Change size, maxlength, or any other HTML attr
203 $htmlattr => $htmlval,
204 );
205
206 # Check for submission
207 if ($form->submitted && $form->validate) {
208
209 # Get single value
210 my $value = $form->field('name');
211
212 # Get list of fields
213 my @field = $form->field;
214
215 # Get hashref of key/value pairs
216 my $field = $form->field;
217 my $value = $field->{name};
218
219 }
220
221 # Print form
222 print $form->render(any_opt_from_new => $some_value);
223
224 That's it. Keep reading.
225
226 Walkthrough
227 Let's walk through a whole example to see how FormBuilder works. We'll
228 start with this, which is actually a complete (albeit simple) form
229 application:
230
231 use CGI::FormBuilder;
232
233 my @fields = qw(name email password confirm_password zipcode);
234
235 my $form = CGI::FormBuilder->new(
236 fields => \@fields,
237 header => 1
238 );
239
240 print $form->render;
241
242 The above code will render an entire form, and take care of maintaining
243 state across submissions. But it doesn't really do anything useful at
244 this point.
245
246 So to start, let's add the "validate" option to make sure the data
247 entered is valid:
248
249 my $form = CGI::FormBuilder->new(
250 fields => \@fields,
251 header => 1,
252 validate => {
253 name => 'NAME',
254 email => 'EMAIL'
255 }
256 );
257
258 We now get a whole bunch of JavaScript validation code, and the
259 appropriate hooks are added so that the form is validated by the
260 browser "onsubmit" as well.
261
262 Now, we also want to validate our form on the server side, since the
263 user may not be running JavaScript. All we do is add the statement:
264
265 $form->validate;
266
267 Which will go through the form, checking each field specified to the
268 "validate" option to see if it's ok. If there's a problem, then that
269 field is highlighted, so that when you print it out the errors will be
270 apparent.
271
272 Of course, the above returns a truth value, which we should use to see
273 if the form was valid. That way, we only update our database if
274 everything looks good:
275
276 if ($form->validate) {
277 # print confirmation screen
278 print $form->confirm;
279 } else {
280 # print the form for them to fill out
281 print $form->render;
282 }
283
284 However, we really only want to do this after our form has been
285 submitted, since otherwise this will result in our form showing errors
286 even though the user hasn't gotten a chance to fill it out yet. As
287 such, we want to check for whether the form has been submitted() yet:
288
289 if ($form->submitted && $form->validate) {
290 # print confirmation screen
291 print $form->confirm;
292 } else {
293 # print the form for them to fill out
294 print $form->render;
295 }
296
297 Now that know that our form has been submitted and is valid, we need to
298 get our values. To do so, we use the field() method along with the name
299 of the field we want:
300
301 my $email = $form->field(name => 'email');
302
303 Note we can just specify the name of the field if it's the only option:
304
305 my $email = $form->field('email'); # same thing
306
307 As a very useful shortcut, we can get all our fields back as a hashref
308 of field/value pairs by calling field() with no arguments:
309
310 my $fields = $form->field; # all fields as hashref
311
312 To make things easy, we'll use this form so that we can pass it easily
313 into a sub of our choosing:
314
315 if ($form->submitted && $form->validate) {
316 # form was good, let's update database
317 my $fields = $form->field;
318
319 # update database (you write this part)
320 do_data_update($fields);
321
322 # print confirmation screen
323 print $form->confirm;
324 }
325
326 Finally, let's say we decide that we like our form fields, but we need
327 the HTML to be laid out very precisely. No problem! We simply create an
328 "HTML::Template" compatible template and tell FormBuilder to use it.
329 Then, in our template, we include a couple special tags which
330 FormBuilder will automatically expand:
331
332 <html>
333 <head>
334 <title><tmpl_var form-title></title>
335 <tmpl_var js-head><!-- this holds the JavaScript code -->
336 </head>
337 <tmpl_var form-start><!-- this holds the initial form tag -->
338 <h3>User Information</h3>
339 Please fill out the following information:
340 <!-- each of these tmpl_var's corresponds to a field -->
341 <p>Your full name: <tmpl_var field-name>
342 <p>Your email address: <tmpl_var field-email>
343 <p>Choose a password: <tmpl_var field-password>
344 <p>Please confirm it: <tmpl_var field-confirm_password>
345 <p>Your home zipcode: <tmpl_var field-zipcode>
346 <p>
347 <tmpl_var form-submit><!-- this holds the form submit button -->
348 </form><!-- can also use "tmpl_var form-end", same thing -->
349
350 Then, all we need to do add the "template" option, and the rest of the
351 code stays the same:
352
353 my $form = CGI::FormBuilder->new(
354 fields => \@fields,
355 header => 1,
356 validate => {
357 name => 'NAME',
358 email => 'EMAIL'
359 },
360 template => 'userinfo.tmpl'
361 );
362
363 So, our complete code thus far looks like this:
364
365 use CGI::FormBuilder;
366
367 my @fields = qw(name email password confirm_password zipcode);
368
369 my $form = CGI::FormBuilder->new(
370 fields => \@fields,
371 header => 1,
372 validate => {
373 name => 'NAME',
374 email => 'EMAIL'
375 },
376 template => 'userinfo.tmpl',
377 );
378
379 if ($form->submitted && $form->validate) {
380 # form was good, let's update database
381 my $fields = $form->field;
382
383 # update database (you write this part)
384 do_data_update($fields);
385
386 # print confirmation screen
387 print $form->confirm;
388
389 } else {
390 # print the form for them to fill out
391 print $form->render;
392 }
393
394 You may be surprised to learn that for many applications, the above is
395 probably all you'll need. Just fill in the parts that affect what you
396 want to do (like the database code), and you're on your way.
397
398 Note: If you are confused at all by the backslashes you see in front of
399 some data pieces above, such as "\@fields", skip down to the brief
400 section entitled "REFERENCES" at the bottom of this document (it's
401 short).
402
404 This documentation is very extensive, but can be a bit dizzying due to
405 the enormous number of options that let you tweak just about anything.
406 As such, I recommend that you stop and visit:
407
408 www.formbuilder.org
409
410 And click on "Tutorials" and "Examples". Then, use the following
411 section as a reference later on.
412
413 new()
414 This method creates a new $form object, which you then use to generate
415 and process your form. In the very shortest version, you can just
416 specify a list of fields for your form:
417
418 my $form = CGI::FormBuilder->new(
419 fields => [qw(first_name birthday favorite_car)]
420 );
421
422 As of 3.02:
423
424 my $form = CGI::FormBuilder->new(
425 source => 'myform.conf' # form and field options
426 );
427
428 For details on the external file format, see
429 CGI::FormBuilder::Source::File.
430
431 Any of the options below, in addition to being specified to new(), can
432 also be manipulated directly with a method of the same name. For
433 example, to change the "header" and "stylesheet" options, either of
434 these works:
435
436 # Way 1
437 my $form = CGI::FormBuilder->new(
438 fields => \@fields,
439 header => 1,
440 stylesheet => '/path/to/style.css',
441 );
442
443 # Way 2
444 my $form = CGI::FormBuilder->new(
445 fields => \@fields
446 );
447 $form->header(1);
448 $form->stylesheet('/path/to/style.css');
449
450 The second form is useful if you want to wrap certain options in
451 conditionals:
452
453 if ($have_template) {
454 $form->header(0);
455 $form->template('template.tmpl');
456 } else {
457 $form->header(1);
458 $form->stylesheet('/path/to/style.css');
459 }
460
461 The following is a description of each option, in alphabetical order:
462
463 action => $script
464 What script to point the form to. Defaults to itself, which is the
465 recommended setting.
466
467 body => \%attr
468 This takes a hashref of attributes that will be stuck in the
469 "<body>" tag verbatim (for example, bgcolor, alink, etc). See the
470 "fieldattr" tag for more details, and also the "template" option.
471
472 charset
473 This forcibly overrides the charset. Better handled by loading an
474 appropriate "messages" module, which will set this for you. See
475 CGI::FormBuilder::Messages for more details.
476
477 debug => 0 | 1 | 2 | 3
478 If set to 1, the module spits copious debugging info to STDERR. If
479 set to 2, it spits out even more gunk. 3 is too much. Defaults to
480 0.
481
482 fields => \@array | \%hash
483 As shown above, the "fields" option takes an arrayref of fields to
484 use in the form. The fields will be printed out in the same order
485 they are specified. This option is needed if you expect your form
486 to have any fields, and is the central option to FormBuilder.
487
488 You can also specify a hashref of key/value pairs. The advantage is
489 you can then bypass the "values" option. However, the big
490 disadvantage is you cannot control the order of the fields. This is
491 ok if you're using a template, but in real-life it turns out that
492 passing a hashref to "fields" is not very useful.
493
494 fieldtype => 'type'
495 This can be used to set the default type for all fields in the
496 form. You can then override it on a per-field basis using the
497 field() method.
498
499 fieldattr => \%attr
500 This option allows you to specify any HTML attribute and have it be
501 the default for all fields. This used to be good for stylesheets,
502 but now that there is a "stylesheet" option, this is fairly
503 useless.
504
505 fieldsets => \@attr
506 This allows you to define fieldsets for your form. Fieldsets are
507 used to group fields together. Fields are rendered in order, inside
508 the fieldset they belong to. If a field does not have a fieldset,
509 it is appended to the end of the form.
510
511 To use fieldsets, specify an arrayref of "<fieldset>" names:
512
513 fieldsets => [qw(account preferences contacts)]
514
515 You can get a different "<legend>" tag if you specify a nested
516 arrayref:
517
518 fieldsets => [
519 [ account => 'Account Information' ],
520 [ preferences => 'Website Preferences' ],
521 [ contacts => 'Email and Phone Numbers' ],
522 ]
523
524 If you're using the source file, that looks like this:
525
526 fieldsets: account=Account Information,preferences=...
527
528 Then, for each field, specify which fieldset it belongs to:
529
530 $form->field(name => 'first_name', fieldset => 'account');
531 $form->field(name => 'last_name', fieldset => 'account');
532 $form->field(name => 'email_me', fieldset => 'preferences');
533 $form->field(name => 'home_phone', fieldset => 'contacts');
534 $form->field(name => 'work_phone', fieldset => 'contacts');
535
536 You can also automatically create a new "fieldset" on the fly by
537 specifying a new one:
538
539 $form->field(name => 'remember_me', fieldset => 'advanced');
540
541 To set the "<legend>" in this case, you have two options. First,
542 you can just choose a more readable "fieldset" name:
543
544 $form->field(name => 'remember_me',
545 fieldset => 'Advanced');
546
547 Or, you can change the name using the "fieldset" accessor:
548
549 $form->fieldset(advanced => 'Advanced Options');
550
551 Note that fieldsets without fields are silently ignored, so you can
552 also just specify a huge list of possible fieldsets to new(), and
553 then only add fields as you need them.
554
555 fieldsubs => 0 | 1
556 This allows autoloading of field names so you can directly access
557 them as:
558
559 $form->$fieldname(opt => 'val');
560
561 Instead of:
562
563 $form->field(name => $fieldname, opt => 'val');
564
565 Warning: If present, it will hide any attributes of the same name.
566 For example, if you define "name" field, you won't be able to
567 change your form's name dynamically. Also, you cannot use this
568 format to create new fields. Use with caution.
569
570 font => $font | \%attr
571 The font face to use for the form. This is output as a series of
572 "<font>" tags for old browser compatibility, and will properly nest
573 them in all of the table elements. If you specify a hashref instead
574 of just a font name, then each key/value pair will be taken as part
575 of the "<font>" tag:
576
577 font => {face => 'verdana', size => '-1', color => 'gray'}
578
579 The above becomes:
580
581 <font face="verdana" size="-1" color="gray">
582
583 I used to use this all the time, but the "stylesheet" option is SO
584 MUCH BETTER. Trust me, take a day and learn the basics of CSS, it's
585 totally worth it.
586
587 header => 0 | 1
588 If set to 1, a valid "Content-type" header will be printed out,
589 along with a whole bunch of HTML "<body>" code, a "<title>" tag,
590 and so on. This defaults to 0, since often people end up using
591 templates or embedding forms in other HTML.
592
593 javascript => 0 | 1
594 If set to 1, JavaScript is generated in addition to HTML, the
595 default setting.
596
597 jserror => 'function_name'
598 If specified, this will get called instead of the standard JS
599 alert() function on error. The function signature is:
600
601 function_name(form, invalid, alertstr, invalid_fields)
602
603 The function can be named anything you like. A simple one might
604 look like this:
605
606 my $form = CGI::FormBuilder->new(
607 jserror => 'field_errors',
608 jshead => <<'EOJS',
609 function field_errors(form, invalid, alertstr, invalid_fields) {
610 // first reset all fields
611 for (var i=0; i < form.elements.length; i++) {
612 form.elements[i].className = 'normal_field';
613 }
614 // now attach a special style class to highlight the field
615 for (var i=0; i < invalid_fields.length; i++) {
616 form.elements[invalid_fields[i]].className = 'invalid_field';
617 }
618 alert(alertstr);
619 return false;
620 }
621 EOJS
622 );
623
624 Note that it should return false to prevent form submission.
625
626 This can be used in conjunction with "jsfunc", which can add
627 additional manual validations before "jserror" is called.
628
629 jsfunc => $jscode
630 This is verbatim JavaScript that will go into the "validate"
631 JavaScript function. It is useful for adding your own validation
632 code, while still getting all the automatic hooks. If something
633 fails, you should do two things:
634
635 1. append to the JavaScript string "alertstr"
636 2. increment the JavaScript number "invalid"
637
638 For example:
639
640 my $jsfunc = <<'EOJS'; # note single quote (see Hint)
641 if (form.password.value == 'password') {
642 alertstr += "Moron, you can't use 'password' for your password!\\n";
643 invalid++;
644 }
645 EOJS
646
647 my $form = CGI::FormBuilder->new(... jsfunc => $jsfunc);
648
649 Then, this code will be automatically called when form validation
650 is invoked. I find this option can be incredibly useful. Most
651 often, I use it to bypass validation on certain submit modes. The
652 submit button that was clicked is "form._submit.value":
653
654 my $jsfunc = <<'EOJS'; # note single quotes (see Hint)
655 if (form._submit.value == 'Delete') {
656 if (confirm("Really DELETE this entry?")) return true;
657 return false;
658 } else if (form._submit.value == 'Cancel') {
659 // skip validation since we're cancelling
660 return true;
661 }
662 EOJS
663
664 Hint: To prevent accidental expansion of embedding strings and
665 escapes, you should put your "HERE" string in single quotes, as
666 shown above.
667
668 jshead => $jscode
669 If using JavaScript, you can also specify some JavaScript code that
670 will be included verbatim in the <head> section of the document.
671 I'm not very fond of this one, what you probably want is the
672 previous option.
673
674 keepextras => 0 | 1 | \@array
675 If set to 1, then extra parameters not set in your fields
676 declaration will be kept as hidden fields in the form. However, you
677 will need to use cgi_param(), NOT field(), to access the values.
678
679 This is useful if you want to keep some extra parameters like mode
680 or company available but not have them be valid form fields:
681
682 keepextras => 1
683
684 That will preserve any extra params. You can also specify an
685 arrayref, in which case only params in that list will be preserved.
686 For example:
687
688 keepextras => [qw(mode company)]
689
690 Will only preserve the params "mode" and "company". Again, to
691 access them:
692
693 my $mode = $form->cgi_param('mode');
694 $form->cgi_param(name => 'mode', value => 'relogin');
695
696 See "CGI.pm" for details on param() usage.
697
698 labels => \%hash
699 Like "values", this is a list of key/value pairs where the keys are
700 the names of "fields" specified above. By default, FormBuilder does
701 some snazzy case and character conversion to create pretty labels
702 for you. However, if you want to explicitly name your fields, use
703 this option.
704
705 For example:
706
707 my $form = CGI::FormBuilder->new(
708 fields => [qw(name email)],
709 labels => {
710 name => 'Your Full Name',
711 email => 'Primary Email Address'
712 }
713 );
714
715 Usually you'll find that if you're contemplating this option what
716 you really want is a template.
717
718 lalign => 'left' | 'right' | 'center'
719 A legacy shortcut for:
720
721 th => { align => 'left' }
722
723 Even better, use the "stylesheet" option and tweak the ".fb_label"
724 class. Either way, don't use this.
725
726 lang
727 This forcibly overrides the lang. Better handled by loading an
728 appropriate "messages" module, which will set this for you. See
729 CGI::FormBuilder::Messages for more details.
730
731 method => 'post' | 'get'
732 The type of CGI method to use, either "post" or "get". Defaults to
733 "get" if nothing is specified. Note that for forms that cause
734 changes on the server, such as database inserts, you should use the
735 "post" method.
736
737 messages => 'auto' | $file | \%hash | $locale
738 This option overrides the default FormBuilder messages in order to
739 provide multilingual locale support (or just different text for the
740 picky ones). For details on this option, please refer to
741 CGI::FormBuilder::Messages.
742
743 name => $string
744 This names the form. It is optional, but when used, it renames
745 several key variables and functions according to the name of the
746 form. In addition, it also adds the following "<div>" tags to each
747 row of the table:
748
749 <tr id="${form}_${field}_row">
750 <td id="${form}_${field}_label">Label</td>
751 <td id="${form}_${field}_input"><input tag></td>
752 <td id="${form}_${field}_error">Error</td><!-- if invalid -->
753 </tr>
754
755 These changes allow you to (a) use multiple forms in a sequential
756 application and/or (b) display multiple forms inline in one
757 document. If you're trying to build a complex multi-form app and
758 are having problems, try naming your forms.
759
760 options => \%hash
761 This is one of several meta-options that allows you to specify
762 stuff for multiple fields at once:
763
764 my $form = CGI::FormBuilder->new(
765 fields => [qw(part_number department in_stock)],
766 options => {
767 department => [qw(hardware software)],
768 in_stock => [qw(yes no)],
769 }
770 );
771
772 This has the same effect as using field() for the "department" and
773 "in_stock" fields to set options individually.
774
775 params => $object
776 This specifies an object from which the parameters should be
777 derived. The object must have a param() method which will return
778 values for each parameter by name. By default a CGI object will be
779 automatically created and used.
780
781 However, you will want to specify this if you're using "mod_perl":
782
783 use Apache::Request;
784 use CGI::FormBuilder;
785
786 sub handler {
787 my $r = Apache::Request->new(shift);
788 my $form = CGI::FormBuilder->new(... params => $r);
789 print $form->render;
790 }
791
792 Or, if you need to initialize a "CGI.pm" object separately and are
793 using a "post" form method:
794
795 use CGI;
796 use CGI::FormBuilder;
797
798 my $q = new CGI;
799 my $form = CGI::FormBuilder->new(... params => $q);
800
801 Usually you don't need to do this, unless you need to access other
802 parameters outside of FormBuilder's control.
803
804 required => \@array | 'ALL' | 'NONE'
805 This is a list of those values that are required to be filled in.
806 Those fields named must be included by the user. If the "required"
807 option is not specified, by default any fields named in "validate"
808 will be required.
809
810 In addition, the "required" option also takes two other settings,
811 the strings "ALL" and "NONE". If you specify "ALL", then all fields
812 are required. If you specify "NONE", then none of them are in spite
813 of what may be set via the "validate" option.
814
815 This is useful if you have fields that are optional, but that you
816 want to be validated if filled in:
817
818 my $form = CGI::FormBuilder->new(
819 fields => qw[/name email/],
820 validate => { email => 'EMAIL' },
821 required => 'NONE'
822 );
823
824 This would make the "email" field optional, but if filled in then
825 it would have to match the "EMAIL" pattern.
826
827 In addition, it is very important to note that if the "required"
828 and "validate" options are specified, then they are taken as an
829 intersection. That is, only those fields specified as "required"
830 must be filled in, and the rest are optional. For example:
831
832 my $form = CGI::FormBuilder->new(
833 fields => qw[/name email/],
834 validate => { email => 'EMAIL' },
835 required => [qw(name)]
836 );
837
838 This would make the "name" field mandatory, but the "email" field
839 optional. However, if "email" is filled in, then it must match the
840 builtin "EMAIL" pattern.
841
842 reset => 0 | 1 | $string
843 If set to 0, then the "Reset" button is not printed. If set to
844 text, then that will be printed out as the reset button. Defaults
845 to printing out a button that says "Reset".
846
847 selectnum => $threshold
848 This detects how FormBuilder's auto-type generation works. If a
849 given field has options, then it will be a radio group by default.
850 However, if more than "selectnum" options are present, then it will
851 become a select list. The default is 5 or more options. For
852 example:
853
854 # This will be a radio group
855 my @opt = qw(Yes No);
856 $form->field(name => 'answer', options => \@opt);
857
858 # However, this will be a select list
859 my @states = qw(AK CA FL NY TX);
860 $form->field(name => 'state', options => \@states);
861
862 # Single items are checkboxes (allows unselect)
863 $form->field(name => 'answer', options => ['Yes']);
864
865 There is no threshold for checkboxes since, if you think about it,
866 they are really a multi-radio select group. As such, a radio group
867 becomes a checkbox group if the "multiple" option is specified and
868 the field has less than "selectnum" options. Got it?
869
870 smartness => 0 | 1 | 2
871 By default CGI::FormBuilder tries to be pretty smart for you, like
872 figuring out the types of fields based on their names and number of
873 options. If you don't want this behavior at all, set "smartness" to
874 0. If you want it to be really smart, like figuring out what type
875 of validation routines to use for you, set it to 2. It defaults to
876 1.
877
878 sortopts => BUILTIN | 1 | \&sub
879 If specified to new(), this has the same effect as the same-named
880 option to field(), only it applies to all fields.
881
882 source => $filename
883 You can use this option to initialize FormBuilder from an external
884 configuration file. This allows you to separate your field code
885 from your form layout, which is pretty cool. See
886 CGI::FormBuilder::Source::File for details on the format of the
887 external file.
888
889 static => 0 | 1 | 2
890 If set to 1, then the form will be output with static hidden
891 fields. If set to 2, then in addition fields without values will
892 be omitted. Defaults to 0.
893
894 sticky => 0 | 1
895 Determines whether or not form values should be sticky across
896 submissions. This defaults to 1, meaning values are sticky.
897 However, you may want to set it to 0 if you have a form which does
898 something like adding parts to a database. See the "EXAMPLES"
899 section for a good example.
900
901 submit => 0 | 1 | $string | \@array
902 If set to 0, then the "Submit" button is not printed. It defaults
903 to creating a button that says "Submit" verbatim. If given an
904 argument, then that argument becomes the text to show. For example:
905
906 print $form->render(submit => 'Do Lookup');
907
908 Would make it so the submit button says "Do Lookup" on it.
909
910 If you pass an arrayref of multiple values, you get a key benefit.
911 This will create multiple submit buttons, each with a different
912 value. In addition, though, when submitted only the one that was
913 clicked will be sent across CGI via some JavaScript tricks. So
914 this:
915
916 print $form->render(submit => ['Add A Gift', 'No Thank You']);
917
918 Would create two submit buttons. Clicking on either would submit
919 the form, but you would be able to see which one was submitted via
920 the submitted() function:
921
922 my $clicked = $form->submitted;
923
924 So if the user clicked "Add A Gift" then that is what would end up
925 in the variable $clicked above. This allows nice conditionality:
926
927 if ($form->submitted eq 'Add A Gift') {
928 # show the gift selection screen
929 } elsif ($form->submitted eq 'No Thank You')
930 # just process the form
931 }
932
933 See the "EXAMPLES" section for more details.
934
935 styleclass => $string
936 The string to use as the "style" name, if the following option is
937 enabled.
938
939 stylesheet => 0 | 1 | $path
940 This option turns on stylesheets in the HTML output by FormBuilder.
941 Each element is printed with the "class" of "styleclass" ("fb" by
942 default). It is up to you to provide the actual style definitions.
943 If you provide a $path rather than just a 1/0 toggle, then that
944 $path will be included in a "<link>" tag as well.
945
946 The following tags are created by this option:
947
948 ${styleclass} top-level table/form class
949 ${styleclass}_required labels for fields that are required
950 ${styleclass}_invalid any fields that failed validate()
951
952 If you're contemplating stylesheets, the best thing is to just turn
953 this option on, then see what's spit out.
954
955 See the section on "STYLESHEETS" for more details on FormBuilder
956 style sheets.
957
958 table => 0 | 1 | \%tabletags
959 By default FormBuilder decides how to layout the form based on the
960 number of fields, values, etc. You can force it into a table by
961 specifying 1, or force it out of one with 0.
962
963 If you specify a hashref instead, then these will be used to create
964 the "<table>" tag. For example, to create a table with no
965 cellpadding or cellspacing, use:
966
967 table => {cellpadding => 0, cellspacing => 0}
968
969 Also, you can specify options to the "<td>" and "<tr>" elements as
970 well in the same fashion.
971
972 template => $filename | \%hash | \&sub | $object
973 This points to a filename that contains an "HTML::Template"
974 compatible template to use to layout the HTML. You can also specify
975 the "template" option as a reference to a hash, allowing you to
976 further customize the template processing options, or use other
977 template engines.
978
979 If "template" points to a sub reference, that routine is called and
980 its return value directly returned. If it is an object, then that
981 object's render() routine is called and its value returned.
982
983 For lots more information, please see CGI::FormBuilder::Template.
984
985 text => $text
986 This is text that is included below the title but above the actual
987 form. Useful if you want to say something simple like "Contact $adm
988 for more help", but if you want lots of text check out the
989 "template" option above.
990
991 title => $title
992 This takes a string to use as the title of the form.
993
994 values => \%hash | \@array
995 The "values" option takes a hashref of key/value pairs specifying
996 the default values for the fields. These values will be overridden
997 by the values entered by the user across the CGI. The values are
998 used case-insensitively, making it easier to use DBI hashref
999 records (which are in upper or lower case depending on your
1000 database).
1001
1002 This option is useful for selecting a record from a database or
1003 hardwiring some sensible defaults, and then including them in the
1004 form so that the user can change them if they wish. For example:
1005
1006 my $rec = $sth->fetchrow_hashref;
1007 my $form = CGI::FormBuilder->new(fields => \@fields,
1008 values => $rec);
1009
1010 You can also pass an arrayref, in which case each value is used
1011 sequentially for each field as specified to the "fields" option.
1012
1013 validate => \%hash | $object
1014 This option takes either a hashref of key/value pairs or a
1015 Data::FormValidator object.
1016
1017 In the case of the hashref, each key is the name of a field from
1018 the "fields" option, or the string "ALL" in which case it applies
1019 to all fields. Each value is one of the following:
1020
1021 - a regular expression in 'quotes' to match against
1022 - an arrayref of values, of which the field must be one
1023 - a string that corresponds to one of the builtin patterns
1024 - a string containing a literal code comparison to do
1025 - a reference to a sub to be used to validate the field
1026 (the sub will receive the value to check as the first arg)
1027
1028 In addition, each of these can also be grouped together as:
1029
1030 - a hashref containing pairings of comparisons to do for
1031 the two different languages, "javascript" and "perl"
1032
1033 By default, the "validate" option also toggles each field to make
1034 it required. However, you can use the "required" option to change
1035 this, see it for more details.
1036
1037 Let's look at a concrete example. Note that the javascript
1038 validation is a negative match, while the perl validation is a
1039 positive match.
1040
1041 my $form = CGI::FormBuilder->new(
1042 fields => [qw(
1043 username password confirm_password
1044 first_name last_name email
1045 )],
1046 validate => {
1047 username => [qw(nate jim bob)],
1048 first_name => '/^\w+$/', # note the
1049 last_name => '/^\w+$/', # single quotes!
1050 email => 'EMAIL',
1051 password => \&check_password,
1052 confirm_password => {
1053 javascript => '!= form.password.value', # neg
1054 perl => 'eq $form->field("password")', # pos
1055 },
1056 },
1057 );
1058
1059 # simple sub example to check the password
1060 sub check_password ($) {
1061 my $v = shift; # first arg is value
1062 return unless $v =~ /^.{6,8}/; # 6-8 chars
1063 return if $v eq "password"; # dummy check
1064 return unless passes_crack($v); # you write "passes_crack()"
1065 return 1; # success
1066 }
1067
1068 This would create both JavaScript and Perl routines on the fly that
1069 would ensure:
1070
1071 - "username" was either "nate", "jim", or "bob"
1072 - "first_name" and "last_name" both match the regex's specified
1073 - "email" is a valid EMAIL format
1074 - "password" passes the checks done by check_password(), meaning
1075 that the sub returns true
1076 - "confirm_password" is equal to the "password" field
1077
1078 Any regular expressions you specify must be enclosed in single
1079 quotes because they need to be used in both JavaScript and Perl
1080 code. As such, specifying a "qr//" will NOT work.
1081
1082 Note that for both the "javascript" and "perl" hashref code
1083 options, the form will be present as the variable named "form". For
1084 the Perl code, you actually get a complete $form object meaning
1085 that you have full access to all its methods (although the field()
1086 method is probably the only one you'll need for validation).
1087
1088 In addition to taking any regular expression you'd like, the
1089 "validate" option also has many builtin defaults that can prove
1090 helpful:
1091
1092 VALUE - is any type of non-null value
1093 WORD - is a word (\w+)
1094 NAME - matches [a-zA-Z] only
1095 FNAME - person's first name, like "Jim" or "Joe-Bob"
1096 LNAME - person's last name, like "Smith" or "King, Jr."
1097 NUM - number, decimal or integer
1098 INT - integer
1099 FLOAT - floating-point number
1100 PHONE - phone number in form "123-456-7890" or "(123) 456-7890"
1101 INTPHONE- international phone number in form "+prefix local-number"
1102 EMAIL - email addr in form "name@host.domain"
1103 CARD - credit card, including Amex, with or without -'s
1104 DATE - date in format MM/DD/YYYY
1105 EUDATE - date in format DD/MM/YYYY
1106 MMYY - date in format MM/YY or MMYY
1107 MMYYYY - date in format MM/YYYY or MMYYYY
1108 CCMM - strict checking for valid credit card 2-digit month ([0-9]|1[012])
1109 CCYY - valid credit card 2-digit year
1110 ZIPCODE - US postal code in format 12345 or 12345-6789
1111 STATE - valid two-letter state in all uppercase
1112 IPV4 - valid IPv4 address
1113 NETMASK - valid IPv4 netmask
1114 FILE - UNIX format filename (/usr/bin)
1115 WINFILE - Windows format filename (C:\windows\system)
1116 MACFILE - MacOS format filename (folder:subfolder:subfolder)
1117 HOST - valid hostname (some-name)
1118 DOMAIN - valid domainname (www.i-love-bacon.com)
1119 ETHER - valid ethernet address using either : or . as separators
1120
1121 I know some of the above are US-centric, but then again that's
1122 where I live. :-) So if you need different processing just create
1123 your own regular expression and pass it in. If there's something
1124 really useful let me know and maybe I'll add it.
1125
1126 You can also pass a Data::FormValidator object as the value of
1127 "validate". This allows you to do things like requiring any one of
1128 several fields (but where you don't care which one). In this case,
1129 the "required" option to new() is ignored, since you should be
1130 setting the required fields through your FormValidator profile.
1131
1132 By default, FormBuilder will try to use a profile named `fb' to
1133 validate itself. You can change this by providing a different
1134 profile name when you call validate().
1135
1136 Note that currently, doing validation through a FormValidator
1137 object doesn't generate any JavaScript validation code for you.
1138
1139 Note that any other options specified are passed to the "<form>" tag
1140 verbatim. For example, you could specify "onsubmit" or "enctype" to add
1141 the respective attributes.
1142
1143 prepare()
1144 This function prepares a form for rendering. It is automatically called
1145 by render(), but calling it yourself may be useful if you are using
1146 Catalyst or some other large framework. It returns the same hash that
1147 will be used by render():
1148
1149 my %expanded = $form->prepare;
1150
1151 You could use this to, say, tweak some custom values and then pass it
1152 to your own rendering object.
1153
1154 render()
1155 This function renders the form into HTML, and returns a string
1156 containing the form. The most common use is simply:
1157
1158 print $form->render;
1159
1160 You can also supply options to render(), just like you had called the
1161 accessor functions individually. These two uses are equivalent:
1162
1163 # this code:
1164 $form->header(1);
1165 $form->stylesheet('style.css');
1166 print $form->render;
1167
1168 # is the same as:
1169 print $form->render(header => 1,
1170 stylesheet => 'style.css');
1171
1172 Note that both forms make permanent changes to the underlying object.
1173 So the next call to render() will still have the header and stylesheet
1174 options in either case.
1175
1176 field()
1177 This method is used to both get at field values:
1178
1179 my $bday = $form->field('birthday');
1180
1181 As well as make changes to their attributes:
1182
1183 $form->field(name => 'fname',
1184 label => "First Name");
1185
1186 A very common use is to specify a list of options and/or the field
1187 type:
1188
1189 $form->field(name => 'state',
1190 type => 'select',
1191 options => \@states); # you supply @states
1192
1193 In addition, when you call field() without any arguments, it returns a
1194 list of valid field names in an array context:
1195
1196 my @fields = $form->field;
1197
1198 And a hashref of field/value pairs in scalar context:
1199
1200 my $fields = $form->field;
1201 my $name = $fields->{name};
1202
1203 Note that if you call it in this manner, you only get one single value
1204 per field. This is fine as long as you don't have multiple values per
1205 field (the normal case). However, if you have a field that allows
1206 multiple options:
1207
1208 $form->field(name => 'color', options => \@colors,
1209 multiple => 1); # allow multi-select
1210
1211 Then you will only get one value for "color" in the hashref. In this
1212 case you'll need to access it via field() to get them all:
1213
1214 my @colors = $form->field('color');
1215
1216 The "name" option is described first, and the remaining options are in
1217 order:
1218
1219 name => $name
1220 The field to manipulate. The "name =>" part is optional if it's the
1221 only argument. For example:
1222
1223 my $email = $form->field(name => 'email');
1224 my $email = $form->field('email'); # same thing
1225
1226 However, if you're specifying more than one argument, then you must
1227 include the "name" part:
1228
1229 $form->field(name => 'email', size => '40');
1230
1231 add_after_option => $html
1232 Adds the specified HTML code after each checkbox (or radio) option.
1233
1234 add_before_option => $html
1235 Adds the specified HTML code before each checkbox (or radio)
1236 option.
1237
1238 columns => 0 | $width
1239 If set and the field is of type 'checkbox' or 'radio', then the
1240 options will be wrapped at the given width.
1241
1242 comment => $string
1243 This prints out the given comment after the field. A good use of
1244 this is for additional help on what the field should contain:
1245
1246 $form->field(name => 'dob',
1247 label => 'D.O.B.',
1248 comment => 'in the format MM/DD/YY');
1249
1250 The above would yield something like this:
1251
1252 D.O.B. [____________] in the format MM/DD/YY
1253
1254 The comment is rendered verbatim, meaning you can use HTML links or
1255 code in it if you want.
1256
1257 cleanopts => 0 | 1
1258 If set to 1 (the default), field options are escaped to make sure
1259 any special chars don't screw up the HTML. Set to 0 if you want to
1260 include verbatim HTML in your options, and know what you're doing.
1261
1262 cookies => 0 | 1
1263 Controls whether to generate a cookie if "sessionid" has been set.
1264 This also requires that "header" be set as well, since the cookie
1265 is wrapped in the header. Defaults to 1, meaning it will
1266 automatically work if you turn on "header".
1267
1268 force => 0 | 1
1269 This is used in conjunction with the "value" option to forcibly
1270 override a field's value. See below under the "value" option for
1271 more details. For compatibility with "CGI.pm", you can also call
1272 this option "override" instead, but don't tell anyone.
1273
1274 growable => 0 | 1 | $limit
1275 This option adds a button and the appropriate JavaScript code to
1276 your form to allow the additional copies of the field to be added
1277 by the client filling out the form. Currently, this only works with
1278 "text" and "file" field types.
1279
1280 If you set "growable" to a positive integer greater than 1, that
1281 will become the limit of growth for that field. You won't be able
1282 to add more than $limit extra inputs to the form, and FormBuilder
1283 will issue a warning if the CGI params come in with more than the
1284 allowed number of values.
1285
1286 jsclick => $jscode
1287 This is a cool abstraction over directly specifying the JavaScript
1288 action. This turns out to be extremely useful, since if a field
1289 type changes from "select" to "radio" or "checkbox", then the
1290 action changes from "onchange" to "onclick". Why?!?!
1291
1292 So if you said:
1293
1294 $form->field(name => 'credit_card',
1295 options => \@cards,
1296 jsclick => 'recalc_total();');
1297
1298 This would generate the following code, depending on the number of
1299 @cards:
1300
1301 <select name="credit_card" onchange="recalc_total();"> ...
1302
1303 <radio name="credit_card" onclick="recalc_total();"> ...
1304
1305 You get the idea.
1306
1307 jsmessage => $string
1308 You can use this to specify your own custom message for the field,
1309 which will be printed if it fails validation. The "jsmessage"
1310 option affects the JavaScript popup box, and the "message" option
1311 affects what is printed out if the server-side validation fails.
1312 If "message" is specified but not "jsmessage", then "message" will
1313 be used for JavaScript as well.
1314
1315 $form->field(name => 'cc',
1316 label => 'Credit Card',
1317 message => 'Invalid credit card number',
1318 jsmessage => 'The card number in "%s" is invalid');
1319
1320 The %s will be filled in with the field's "label".
1321
1322 label => $string
1323 This is the label printed out before the field. By default it is
1324 automatically generated from the field name. If you want to be
1325 really lazy, get in the habit of naming your database fields as
1326 complete words so you can pass them directly to/from your form.
1327
1328 labels => \%hash
1329 This option to field() is outdated. You can get the same effect by
1330 passing data structures directly to the "options" argument (see
1331 below). If you have well-named data, check out the "nameopts"
1332 option.
1333
1334 This takes a hashref of key/value pairs where each key is one of
1335 the options, and each value is what its printed label should be:
1336
1337 $form->field(name => 'state',
1338 options => [qw(AZ CA NV OR WA)],
1339 labels => {
1340 AZ => 'Arizona',
1341 CA => 'California',
1342 NV => 'Nevada',
1343 OR => 'Oregon',
1344 WA => 'Washington
1345 });
1346
1347 When rendered, this would create a select list where the option
1348 values were "CA", "NV", etc, but where the state's full name was
1349 displayed for the user to select. As mentioned, this has the exact
1350 same effect:
1351
1352 $form->field(name => 'state',
1353 options => [
1354 [ AZ => 'Arizona' ],
1355 [ CA => 'California' ],
1356 [ NV => 'Nevada' ],
1357 [ OR => 'Oregon' ],
1358 [ WA => 'Washington ],
1359 ]);
1360
1361 I can think of some rare situations where you might have a set of
1362 predefined labels, but only some of those are present in a given
1363 field... but usually you should just use the "options" arg.
1364
1365 linebreaks => 0 | 1
1366 Similar to the top-level "linebreaks" option, this one will put
1367 breaks in between options, to space things out more. This is useful
1368 with radio and checkboxes especially.
1369
1370 message => $string
1371 Like "jsmessage", this customizes the output error string if
1372 server-side validation fails for the field. The "message" option
1373 will also be used for JavaScript messages if it is specified but
1374 "jsmessage" is not. See above under "jsmessage" for details.
1375
1376 multiple => 0 | 1
1377 If set to 1, then the user is allowed to choose multiple values
1378 from the options provided. This turns radio groups into checkboxes
1379 and selects into multi-selects. Defaults to automatically being
1380 figured out based on number of values.
1381
1382 nameopts => 0 | 1
1383 If set to 1, then options for select lists will be automatically
1384 named using the same algorithm as field labels. For example:
1385
1386 $form->field(name => 'department',
1387 options => qw[(molecular_biology
1388 philosophy psychology
1389 particle_physics
1390 social_anthropology)],
1391 nameopts => 1);
1392
1393 This would create a list like:
1394
1395 <select name="department">
1396 <option value="molecular_biology">Molecular Biology</option>
1397 <option value="philosophy">Philosophy</option>
1398 <option value="psychology">Psychology</option>
1399 <option value="particle_physics">Particle Physics</option>
1400 <option value="social_anthropology">Social Anthropology</option>
1401 </select>
1402
1403 Basically, you get names for the options that are determined in the
1404 same way as the names for the fields. This is designed as a simpler
1405 alternative to using custom "options" data structures if your data
1406 is regular enough to support it.
1407
1408 other => 0 | 1 | \%attr
1409 If set, this automatically creates an "other" field to the right of
1410 the main field. This is very useful if you want to present a
1411 present list, but then also allow the user to enter their own
1412 entry:
1413
1414 $form->field(name => 'vote_for_president',
1415 options => [qw(Bush Kerry)],
1416 other => 1);
1417
1418 That would generate HTML somewhat like this:
1419
1420 Vote For President: [ ] Bush [ ] Kerry [ ] Other: [______]
1421
1422 If the "other" button is checked, then the box becomes editable so
1423 that the user can write in their own text. This "other" box will be
1424 subject to the same validation as the main field, to make sure your
1425 data for that field is consistent.
1426
1427 options => \@options | \%options | \&sub
1428 This takes an arrayref of options. It also automatically results in
1429 the field becoming a radio (if < 5) or select list (if >= 5),
1430 unless you explicitly set the type with the "type" parameter:
1431
1432 $form->field(name => 'opinion',
1433 options => [qw(yes no maybe so)]);
1434
1435 From that, you will get something like this:
1436
1437 <select name="opinion">
1438 <option value="yes">yes</option>
1439 <option value="no">no</option>
1440 <option value="maybe">maybe</option>
1441 <option value="so">so</option>
1442 </select>
1443
1444 Also, this can accept more complicated data structures, allowing
1445 you to specify different labels and values for your options. If a
1446 given item is either an arrayref or hashref, then the first element
1447 will be taken as the value and the second as the label. For
1448 example, this:
1449
1450 push @opt, ['yes', 'You betcha!'];
1451 push @opt, ['no', 'No way Jose'];
1452 push @opt, ['maybe', 'Perchance...'];
1453 push @opt, ['so', 'So'];
1454 $form->field(name => 'opinion', options => \@opt);
1455
1456 Would result in something like the following:
1457
1458 <select name="opinion">
1459 <option value="yes">You betcha!</option>
1460 <option value="no">No way Jose</option>
1461 <option value="maybe">Perchance...</option>
1462 <option value="so">So</option>
1463 </select>
1464
1465 And this code would have the same effect:
1466
1467 push @opt, { yes => 'You betcha!' };
1468 push @opt, { no => 'No way Jose' };
1469 push @opt, { maybe => 'Perchance...' };
1470 push @opt, { so => 'So' };
1471 $form->field(name => 'opinion', options => \@opt);
1472
1473 Finally, you can specify a "\&sub" which must return either an
1474 "\@arrayref" or "\%hashref" of data, which is then expanded using
1475 the same algorithm.
1476
1477 optgroups => 0 | 1 | \%hashref
1478 If "optgroups" is specified for a field ("select" fields only),
1479 then the above "options" array is parsed so that the third argument
1480 is taken as the name of the optgroup, and an "<optgroup>" tag is
1481 generated appropriately.
1482
1483 An example will make this behavior immediately obvious:
1484
1485 my $opts = $dbh->selectall_arrayref(
1486 "select id, name, category from software
1487 order by category, name"
1488 );
1489
1490 $form->field(name => 'software_title',
1491 options => $opts,
1492 optgroups => 1);
1493
1494 The "optgroups" setting would then parse the third element of $opts
1495 so that you'd get an "optgroup" every time that "category" changed:
1496
1497 <optgroup label="antivirus">
1498 <option value="12">Norton Anti-virus 1.2</option>
1499 <option value="11">McAfee 1.1</option>
1500 </optgroup>
1501 <optgroup label="office">
1502 <option value="3">Microsoft Word</option>
1503 <option value="4">Open Office</option>
1504 <option value="6">WordPerfect</option>
1505 </optgroup>
1506
1507 In addition, if "optgroups" is instead a hashref, then the name of
1508 the optgroup is gotten from that. Using the above example, this
1509 would help if you had the category name in a separate table, and
1510 were just storing the "category_id" in the "software" table. You
1511 could provide an "optgroups" hash like:
1512
1513 my %optgroups = (
1514 1 => 'antivirus',
1515 2 => 'office',
1516 3 => 'misc',
1517 );
1518 $form->field(..., optgroups => \%optgroups);
1519
1520 Note: No attempt is made by FormBuilder to properly sort your
1521 option optgroups - it is up to you to provide them in a sensible
1522 order.
1523
1524 required => 0 | 1
1525 If set to 1, the field must be filled in:
1526
1527 $form->field(name => 'email', required => 1);
1528
1529 This is rarely useful - what you probably want are the "validate"
1530 and "required" options to new().
1531
1532 selectname => 0 | 1 | $string
1533 By default, this is set to 1 and any single-select lists are
1534 prefixed by the message "form_select_default" ("-select-" for
1535 English). If set to 0, then this string is not prefixed. If set to
1536 a $string, then that string is used explicitly.
1537
1538 Philosophically, the "-select-" behavior is intentional because it
1539 allows a null item to be transmitted (the same as not checking any
1540 checkboxes or radio buttons). Otherwise, the first item in a select
1541 list is automatically sent when the form is submitted. If you
1542 would like an item to be "pre-selected", consider using the "value"
1543 option to specify the default value.
1544
1545 sortopts => BUILTIN | 1 | \&sub
1546 If set, and there are options, then the options will be sorted in
1547 the specified order. There are four possible values for the
1548 "BUILTIN" setting:
1549
1550 NAME Sort option values by name
1551 NUM Sort option values numerically
1552 LABELNAME Sort option labels by name
1553 LABELNUM Sort option labels numerically
1554
1555 For example:
1556
1557 $form->field(name => 'category',
1558 options => \@cats,
1559 sortopts => 'NAME');
1560
1561 Would sort the @cats options in alphabetic ("NAME") order. The
1562 option "NUM" would sort them in numeric order. If you specify "1",
1563 then an alphabetic sort is done, just like the default Perl sort.
1564
1565 In addition, you can specify a sub reference which takes pairs of
1566 values to compare and returns the appropriate return value that
1567 Perl sort() expects.
1568
1569 type => $type
1570 The type of input box to create. Default is "text", and valid
1571 values include anything allowed by the HTML specs, including
1572 "select", "radio", "checkbox", "textarea", "password", "hidden",
1573 and so on.
1574
1575 By default, the type is automatically determined by FormBuilder
1576 based on the following algorithm:
1577
1578 Field options?
1579 No = text (done)
1580 Yes:
1581 Less than 'selectnum' setting?
1582 No = select (done)
1583 Yes:
1584 Is the 'multiple' option set?
1585 Yes = checkbox (done)
1586 No:
1587 Have just one single option?
1588 Yes = checkbox (done)
1589 No = radio (done)
1590
1591 I recommend you let FormBuilder do this for you in most cases, and
1592 only tweak those you really need to.
1593
1594 value => $value | \@values
1595 The "value" option can take either a single value or an arrayref of
1596 multiple values. In the case of multiple values, this will result
1597 in the field automatically becoming a multiple select list or radio
1598 group, depending on the number of options specified.
1599
1600 If a CGI value is present it will always win. To forcibly change a
1601 value, you need to specify the "force" option:
1602
1603 # Example that hides credit card on confirm screen
1604 if ($form->submitted && $form->validate) {
1605 my $val = $form->field;
1606
1607 # hide CC number
1608 $form->field(name => 'credit_card',
1609 value => '(not shown)',
1610 force => 1);
1611
1612 print $form->confirm;
1613 }
1614
1615 This would print out the string "(not shown)" on the confirm()
1616 screen instead of the actual number.
1617
1618 validate => '/regex/'
1619 Similar to the "validate" option used in new(), this affects the
1620 validation just of that single field. As such, rather than a
1621 hashref, you would just specify the regex to match against.
1622
1623 This regex must be specified as a single-quoted string, and NOT as
1624 a qr// regex. The reason for this is it needs to be usable by the
1625 JavaScript routines as well.
1626
1627 $htmlattr => $htmlval
1628 In addition to the above tags, the field() function can take any
1629 other valid HTML attribute, which will be placed in the tag
1630 verbatim. For example, if you wanted to alter the class of the
1631 field (if you're using stylesheets and a template, for example),
1632 you could say:
1633
1634 $form->field(name => 'email', class => 'FormField',
1635 size => 80);
1636
1637 Then when you call "$form-"render> you would get a field something
1638 like this:
1639
1640 <input type="text" name="email" class="FormField" size="80">
1641
1642 (Of course, for this to really work you still have to create a
1643 class called "FormField" in your stylesheet.)
1644
1645 See also the "fieldattr" option which provides global attributes to
1646 all fields.
1647
1648 cgi_param()
1649 The above field() method will only return fields which you have
1650 explicitly defined in your form. Excess parameters will be silently
1651 ignored, to help ensure users can't mess with your form.
1652
1653 But, you may have some times when you want extra params so that you can
1654 maintain state, but you don't want it to appear in your form. Branding
1655 is an easy example:
1656
1657 http://hr-outsourcing.com/newuser.cgi?company=mr_propane
1658
1659 This could change your page's HTML so that it displayed the appropriate
1660 company name and logo, without polluting your form parameters.
1661
1662 This call simply redispatches to "CGI.pm"'s param() method, so consult
1663 those docs for more information.
1664
1665 tmpl_param()
1666 This allows you to manipulate template parameters directly. Extending
1667 the above example:
1668
1669 my $form = CGI::FormBuilder->new(template => 'some.tmpl');
1670
1671 my $company = $form->cgi_param('company');
1672 $form->tmpl_param(company => $company);
1673
1674 Then, in your template:
1675
1676 Hello, <tmpl_var company> employee!
1677 <p>
1678 Please fill out this form:
1679 <tmpl_var form-start>
1680 <!-- etc... -->
1681
1682 For really precise template control, you can actually create your own
1683 template object and then pass it directly to FormBuilder. See
1684 CGI::FormBuilder::Template for more details.
1685
1686 sessionid()
1687 This gets and sets the sessionid, which is stored in the special form
1688 field "_sessionid". By default no session ids are generated or used.
1689 Rather, this is intended to provide a hook for you to easily integrate
1690 this with a session id module like "CGI::Session".
1691
1692 Since you can set the session id via the "_sessionid" field, you can
1693 pass it as an argument when first showing the form:
1694
1695 http://mydomain.com/forms/update_info.cgi?_sessionid=0123-091231
1696
1697 This would set things up so that if you called:
1698
1699 my $id = $form->sessionid;
1700
1701 This would get the value "0123-091231" in your script. Conversely, if
1702 you generate a new sessionid on your own, and wish to include it
1703 automatically, simply set is as follows:
1704
1705 $form->sessionid($id);
1706
1707 If the sessionid is set, and "header" is set, then FormBuilder will
1708 also automatically generate a cookie for you.
1709
1710 See "EXAMPLES" for "CGI::Session" example.
1711
1712 submitted()
1713 This returns the value of the "Submit" button if the form has been
1714 submitted, undef otherwise. This allows you to either test it in a
1715 boolean context:
1716
1717 if ($form->submitted) { ... }
1718
1719 Or to retrieve the button that was actually clicked on in the case of
1720 multiple submit buttons:
1721
1722 if ($form->submitted eq 'Update') {
1723 ...
1724 } elsif ($form->submitted eq 'Delete') {
1725 ...
1726 }
1727
1728 It's best to call validate() in conjunction with this to make sure the
1729 form validation works. To make sure you're getting accurate info, it's
1730 recommended that you name your forms with the "name" option described
1731 above.
1732
1733 If you're writing a multiple-form app, you should name your forms with
1734 the "name" option to ensure that you are getting an accurate return
1735 value from this sub. See the "name" option above, under render().
1736
1737 You can also specify the name of an optional field which you want to
1738 "watch" instead of the default "_submitted" hidden field. This is
1739 useful if you have a search form and also want to be able to link to it
1740 from other documents directly, such as:
1741
1742 mysearch.cgi?lookup=what+to+look+for
1743
1744 Normally, submitted() would return false since the "_submitted" field
1745 is not included. However, you can override this by saying:
1746
1747 $form->submitted('lookup');
1748
1749 Then, if the lookup field is present, you'll get a true value.
1750 (Actually, you'll still get the value of the "Submit" button if
1751 present.)
1752
1753 validate()
1754 This validates the form based on the validation criteria passed into
1755 new() via the "validate" option. In addition, you can specify
1756 additional criteria to check that will be valid for just that call of
1757 validate(). This is useful is you have to deal with different geos:
1758
1759 if ($location eq 'US') {
1760 $form->validate(state => 'STATE', zipcode => 'ZIPCODE');
1761 } else {
1762 $form->validate(state => '/^\w{2,3}$/');
1763 }
1764
1765 You can also provide a Data::FormValidator object as the first
1766 argument. In that case, the second argument (if present) will be
1767 interpreted as the name of the validation profile to use. A single
1768 string argument will also be interpreted as a validation profile name.
1769
1770 Note that if you pass args to your validate() function like this, you
1771 will not get JavaScript generated or required fields placed in bold.
1772 So, this is good for conditional validation like the above example, but
1773 for most applications you want to pass your validation requirements in
1774 via the "validate" option to the new() function, and just call the
1775 validate() function with no arguments.
1776
1777 confirm()
1778 The purpose of this function is to print out a static confirmation
1779 screen showing a short message along with the values that were
1780 submitted. It is actually just a special wrapper around render(),
1781 twiddling a couple options.
1782
1783 If you're using templates, you probably want to specify a separate
1784 success template, such as:
1785
1786 if ($form->submitted && $form->validate) {
1787 print $form->confirm(template => 'success.tmpl');
1788 } else {
1789 print $form->render(template => 'fillin.tmpl');
1790 }
1791
1792 So that you don't get the same screen twice.
1793
1794 mailconfirm()
1795 This sends a confirmation email to the named addresses. The "to"
1796 argument is required; everything else is optional. If no "from" is
1797 specified then it will be set to the address "auto-reply" since that is
1798 a common quasi-standard in the web app world.
1799
1800 This does not send any of the form results. Rather, it simply prints
1801 out a message saying the submission was received.
1802
1803 mailresults()
1804 This emails the form results to the specified address(es). By default
1805 it prints out the form results separated by a colon, such as:
1806
1807 name: Nate Wiger
1808 email: nate@wiger.org
1809 colors: red green blue
1810
1811 And so on. You can change this by specifying the "delimiter" and
1812 "joiner" options. For example this:
1813
1814 $form->mailresults(to => $to, delimiter => '=', joiner => ',');
1815
1816 Would produce an email like this:
1817
1818 name=Nate Wiger
1819 email=nate@wiger.org
1820 colors=red,green,blue
1821
1822 Note that now the last field ("colors") is separated by commas since
1823 you have multiple values and you specified a comma as your "joiner".
1824
1825 mailresults() with plugin
1826 Now you can also specify a plugin to use with mailresults, in the
1827 namespace "CGI::FormBuilder::Mail::*". These plugins may depend on
1828 other libraries. For example, this:
1829
1830 $form->mailresults(
1831 plugin => 'FormatMultiPart',
1832 from => 'Mark Hedges <hedges@ucsd.edu>',
1833 to => 'Nate Wiger <nwiger@gmail.com>',
1834 smtp => $smtp_host_or_ip,
1835 format => 'plain',
1836 );
1837
1838 will send your mail formatted nicely in text using "Text::FormatTable".
1839 (And if you used format => 'html' it would use "HTML::QuickTable".)
1840
1841 This particular plugin uses "MIME::Lite" and "Net::SMTP" to communicate
1842 directly with the SMTP server, and does not rely on a shell escape.
1843 See CGI::FormBuilder::Mail::FormatMultiPart for more information.
1844
1845 This establishes a simple mail plugin implementation standard for your
1846 own mailresults() plugins. The plugin should reside under the
1847 "CGI::FormBuilder::Mail::*" namespace. It should have a constructor
1848 new() which accepts a hash-as-array of named arg parameters, including
1849 form => $form. It should have a mailresults() object method that does
1850 the right thing. It should use "CGI::FormBuilder::Util" and puke() if
1851 something goes wrong.
1852
1853 Calling $form->mailresults( plugin => 'Foo', ... ) will load
1854 "CGI::FormBuilder::Mail::Foo" and will pass the FormBuilder object as a
1855 named param 'form' with all other parameters passed intact.
1856
1857 If it should croak, confess, die or otherwise break if something goes
1858 wrong, FormBuilder.pm will warn any errors and the built-in
1859 mailresults() method will still try.
1860
1861 mail()
1862 This is a more generic version of the above; it sends whatever is given
1863 as the "text" argument via email verbatim to the "to" address. In
1864 addition, if you're not running "sendmail" you can specify the "mailer"
1865 parameter to give the path of your mailer. This option is accepted by
1866 the above functions as well.
1867
1869 The following methods are provided to make FormBuilder behave more like
1870 other modules, when desired.
1871
1872 header()
1873 Returns a "CGI.pm" header, but only if "header => 1" is set.
1874
1875 param()
1876 This is an alias for field(), provided for compatibility. However,
1877 while field() does act "compliantly" for easy use in "CGI::Session",
1878 "Apache::Request", etc, it is not 100% the same. As such, I recommend
1879 you use field() in your code, and let receiving objects figure the
1880 param() thing out when needed:
1881
1882 my $sess = CGI::Session->new(...);
1883 $sess->save_param($form); # will see param()
1884
1885 query_string()
1886 This returns a query string similar to "CGI.pm", but ONLY containing
1887 form fields and any "keepextras", if specified. Other params are
1888 ignored.
1889
1890 self_url()
1891 This returns a self url, similar to "CGI.pm", but again ONLY with form
1892 fields.
1893
1894 script_name()
1895 An alias for "$form->action".
1896
1898 If the "stylesheet" option is enabled (by setting it to 1 or the path
1899 of a CSS file), then FormBuilder will automatically output style
1900 classes for every single form element:
1901
1902 fb main form table
1903 fb_label td containing field label
1904 fb_field td containing field input tag
1905 fb_submit td containing submit button(s)
1906
1907 fb_input input types
1908 fb_select select types
1909 fb_checkbox checkbox types
1910 fb_radio radio types
1911 fb_option labels for checkbox/radio options
1912 fb_button button types
1913 fb_hidden hidden types
1914 fb_static static types
1915
1916 fb_required span around labels for required fields
1917 fb_invalid span around labels for invalid fields
1918 fb_comment span around field comment
1919 fb_error span around field error message
1920
1921 Here's a simple example that you can put in "fb.css" which spruces up a
1922 couple basic form features:
1923
1924 /* FormBuilder */
1925 .fb {
1926 background: #ffc;
1927 font-family: verdana,arial,sans-serif;
1928 font-size: 10pt;
1929 }
1930
1931 .fb_label {
1932 text-align: right;
1933 padding-right: 1em;
1934 }
1935
1936 .fb_comment {
1937 font-size: 8pt;
1938 font-style: italic;
1939 }
1940
1941 .fb_submit {
1942 text-align: center;
1943 }
1944
1945 .fb_required {
1946 font-weight: bold;
1947 }
1948
1949 .fb_invalid {
1950 color: #c00;
1951 font-weight: bold;
1952 }
1953
1954 .fb_error {
1955 color: #c00;
1956 font-style: italic;
1957 }
1958
1959 Of course, if you're familiar with CSS, you know alot more is possible.
1960 Also, you can mess with all the id's (if you name your forms) to
1961 manipulate fields more exactly.
1962
1964 I find this module incredibly useful, so here are even more examples,
1965 pasted from sample code that I've written:
1966
1967 Ex1: order.cgi
1968 This example provides an order form, complete with validation of the
1969 important fields, and a "Cancel" button to abort the whole thing.
1970
1971 #!/usr/bin/perl
1972
1973 use strict;
1974 use CGI::FormBuilder;
1975
1976 my @states = my_state_list(); # you write this
1977
1978 my $form = CGI::FormBuilder->new(
1979 method => 'post',
1980 fields => [
1981 qw(first_name last_name
1982 email send_me_emails
1983 address state zipcode
1984 credit_card expiration)
1985 ],
1986
1987 header => 1,
1988 title => 'Finalize Your Order',
1989 submit => ['Place Order', 'Cancel'],
1990 reset => 0,
1991
1992 validate => {
1993 email => 'EMAIL',
1994 zipcode => 'ZIPCODE',
1995 credit_card => 'CARD',
1996 expiration => 'MMYY',
1997 },
1998 required => 'ALL',
1999 jsfunc => <<EOJS,
2000 // skip js validation if they clicked "Cancel"
2001 if (this._submit.value == 'Cancel') return true;
2002 EOJS
2003 );
2004
2005 # Provide a list of states
2006 $form->field(name => 'state',
2007 options => \@states,
2008 sortopts=> 'NAME');
2009
2010 # Options for mailing list
2011 $form->field(name => 'send_me_emails',
2012 options => [[1 => 'Yes'], [0 => 'No']],
2013 value => 0); # "No"
2014
2015 # Check for valid order
2016 if ($form->submitted eq 'Cancel') {
2017 # redirect them to the homepage
2018 print $form->cgi->redirect('/');
2019 exit;
2020 }
2021 elsif ($form->submitted && $form->validate) {
2022 # your code goes here to do stuff...
2023 print $form->confirm;
2024 }
2025 else {
2026 # either first printing or needs correction
2027 print $form->render;
2028 }
2029
2030 This will create a form called "Finalize Your Order" that will provide
2031 a pulldown menu for the "state", a radio group for "send_me_emails",
2032 and normal text boxes for the rest. It will then validate all the
2033 fields, using specific patterns for those fields specified to
2034 "validate".
2035
2036 Ex2: order_form.cgi
2037 Here's an example that adds some fields dynamically, and uses the
2038 "debug" option spit out gook:
2039
2040 #!/usr/bin/perl
2041
2042 use strict;
2043 use CGI::FormBuilder;
2044
2045 my $form = CGI::FormBuilder->new(
2046 method => 'post',
2047 fields => [
2048 qw(first_name last_name email
2049 address state zipcode)
2050 ],
2051 header => 1,
2052 debug => 2, # gook
2053 required => 'NONE',
2054 );
2055
2056 # This adds on the 'details' field to our form dynamically
2057 $form->field(name => 'details',
2058 type => 'textarea',
2059 cols => '50',
2060 rows => '10');
2061
2062 # And this adds user_name with validation
2063 $form->field(name => 'user_name',
2064 value => $ENV{REMOTE_USER},
2065 validate => 'NAME');
2066
2067 if ($form->submitted && $form->validate) {
2068 # ... more code goes here to do stuff ...
2069 print $form->confirm;
2070 } else {
2071 print $form->render;
2072 }
2073
2074 In this case, none of the fields are required, but the "user_name"
2075 field will still be validated if filled in.
2076
2077 Ex3: ticket_search.cgi
2078 This is a simple search script that uses a template to layout the
2079 search parameters very precisely. Note that we set our options for our
2080 different fields and types.
2081
2082 #!/usr/bin/perl
2083
2084 use strict;
2085 use CGI::FormBuilder;
2086
2087 my $form = CGI::FormBuilder->new(
2088 fields => [qw(type string status category)],
2089 header => 1,
2090 template => 'ticket_search.tmpl',
2091 submit => 'Search', # search button
2092 reset => 0, # and no reset
2093 );
2094
2095 # Need to setup some specific field options
2096 $form->field(name => 'type',
2097 options => [qw(ticket requestor hostname sysadmin)]);
2098
2099 $form->field(name => 'status',
2100 type => 'radio',
2101 options => [qw(incomplete recently_completed all)],
2102 value => 'incomplete');
2103
2104 $form->field(name => 'category',
2105 type => 'checkbox',
2106 options => [qw(server network desktop printer)]);
2107
2108 # Render the form and print it out so our submit button says "Search"
2109 print $form->render;
2110
2111 Then, in our "ticket_search.tmpl" HTML file, we would have something
2112 like this:
2113
2114 <html>
2115 <head>
2116 <title>Search Engine</title>
2117 <tmpl_var js-head>
2118 </head>
2119 <body bgcolor="white">
2120 <center>
2121 <p>
2122 Please enter a term to search the ticket database.
2123 <p>
2124 <tmpl_var form-start>
2125 Search by <tmpl_var field-type> for <tmpl_var field-string>
2126 <tmpl_var form-submit>
2127 <p>
2128 Status: <tmpl_var field-status>
2129 <p>
2130 Category: <tmpl_var field-category>
2131 <p>
2132 </form>
2133 </body>
2134 </html>
2135
2136 That's all you need for a sticky search form with the above HTML
2137 layout. Notice that you can change the HTML layout as much as you want
2138 without having to touch your CGI code.
2139
2140 Ex4: user_info.cgi
2141 This script grabs the user's information out of a database and lets
2142 them update it dynamically. The DBI information is provided as an
2143 example, your mileage may vary:
2144
2145 #!/usr/bin/perl
2146
2147 use strict;
2148 use CGI::FormBuilder;
2149 use DBI;
2150 use DBD::Oracle
2151
2152 my $dbh = DBI->connect('dbi:Oracle:db', 'user', 'pass');
2153
2154 # We create a new form. Note we've specified very little,
2155 # since we're getting all our values from our database.
2156 my $form = CGI::FormBuilder->new(
2157 fields => [qw(username password confirm_password
2158 first_name last_name email)]
2159 );
2160
2161 # Now get the value of the username from our app
2162 my $user = $form->cgi_param('user');
2163 my $sth = $dbh->prepare("select * from user_info where user = '$user'");
2164 $sth->execute;
2165 my $default_hashref = $sth->fetchrow_hashref;
2166
2167 # Render our form with the defaults we got in our hashref
2168 print $form->render(values => $default_hashref,
2169 title => "User information for '$user'",
2170 header => 1);
2171
2172 Ex5: add_part.cgi
2173 This presents a screen for users to add parts to an inventory database.
2174 Notice how it makes use of the "sticky" option. If there's an error,
2175 then the form is presented with sticky values so that the user can
2176 correct them and resubmit. If the submission is ok, though, then the
2177 form is presented without sticky values so that the user can enter the
2178 next part.
2179
2180 #!/usr/bin/perl
2181
2182 use strict;
2183 use CGI::FormBuilder;
2184
2185 my $form = CGI::FormBuilder->new(
2186 method => 'post',
2187 fields => [qw(sn pn model qty comments)],
2188 labels => {
2189 sn => 'Serial Number',
2190 pn => 'Part Number'
2191 },
2192 sticky => 0,
2193 header => 1,
2194 required => [qw(sn pn model qty)],
2195 validate => {
2196 sn => '/^[PL]\d{2}-\d{4}-\d{4}$/',
2197 pn => '/^[AQM]\d{2}-\d{4}$/',
2198 qty => 'INT'
2199 },
2200 font => 'arial,helvetica'
2201 );
2202
2203 # shrink the qty field for prettiness, lengthen model
2204 $form->field(name => 'qty', size => 4);
2205 $form->field(name => 'model', size => 60);
2206
2207 if ($form->submitted) {
2208 if ($form->validate) {
2209 # Add part to database
2210 } else {
2211 # Invalid; show form and allow corrections
2212 print $form->render(sticky => 1);
2213 exit;
2214 }
2215 }
2216
2217 # Print form for next part addition.
2218 print $form->render;
2219
2220 With the exception of the database code, that's the whole application.
2221
2222 Ex6: Session Management
2223 This creates a session via "CGI::Session", and ties it in with
2224 FormBuilder:
2225
2226 #!/usr/bin/perl
2227
2228 use CGI::Session;
2229 use CGI::FormBuilder;
2230
2231 my $form = CGI::FormBuilder->new(fields => \@fields);
2232
2233 # Initialize session
2234 my $session = CGI::Session->new('driver:File',
2235 $form->sessionid,
2236 { Directory=>'/tmp' });
2237
2238 if ($form->submitted && $form->validate) {
2239 # Automatically save all parameters
2240 $session->save_param($form);
2241 }
2242
2243 # Ensure we have the right sessionid (might be new)
2244 $form->sessionid($session->id);
2245
2246 print $form->render;
2247
2248 Yes, it's pretty much that easy. See CGI::FormBuilder::Multi for how to
2249 tie this into a multi-page form.
2250
2252 There are a couple questions and subtle traps that seem to poke people
2253 on a regular basis. Here are some hints.
2254
2255 I'm confused. Why doesn't this work like CGI.pm?
2256 If you're used to "CGI.pm", you have to do a little bit of a brain
2257 shift when working with this module.
2258
2259 FormBuilder is designed to address fields as abstract entities. That
2260 is, you don't create a "checkbox" or "radio group" per se. Instead,
2261 you create a field for the data you want to collect. The HTML
2262 representation is just one property of this field.
2263
2264 So, if you want a single-option checkbox, simply say something like
2265 this:
2266
2267 $form->field(name => 'join_mailing_list',
2268 options => ['Yes']);
2269
2270 If you want it to be checked by default, you add the "value" arg:
2271
2272 $form->field(name => 'join_mailing_list',
2273 options => ['Yes'],
2274 value => 'Yes');
2275
2276 You see, you're creating a field that has one possible option: "Yes".
2277 Then, you're saying its current value is, in fact, "Yes". This will
2278 result in FormBuilder creating a single-option field (which is a
2279 checkbox by default) and selecting the requested value (meaning that
2280 the box will be checked).
2281
2282 If you want multiple values, then all you have to do is specify
2283 multiple options:
2284
2285 $form->field(name => 'join_mailing_list',
2286 options => ['Yes', 'No'],
2287 value => 'Yes');
2288
2289 Now you'll get a radio group, and "Yes" will be selected for you! By
2290 viewing fields as data entities (instead of HTML tags) you get much
2291 more flexibility and less code maintenance. If you want to be able to
2292 accept multiple values, simply use the "multiple" arg:
2293
2294 $form->field(name => 'favorite_colors',
2295 options => [qw(red green blue)],
2296 multiple => 1);
2297
2298 In all of these examples, to get the data back you just use the field()
2299 method:
2300
2301 my @colors = $form->field('favorite_colors');
2302
2303 And the rest is taken care of for you.
2304
2305 How do I make a multi-screen/multi-mode form?
2306 This is easily doable, but you have to remember a couple things. Most
2307 importantly, that FormBuilder only knows about those fields you've told
2308 it about. So, let's assume that you're going to use a special parameter
2309 called "mode" to control the mode of your application so that you can
2310 call it like this:
2311
2312 myapp.cgi?mode=list&...
2313 myapp.cgi?mode=edit&...
2314 myapp.cgi?mode=remove&...
2315
2316 And so on. You need to do two things. First, you need the "keepextras"
2317 option:
2318
2319 my $form = CGI::FormBuilder->new(..., keepextras => 1);
2320
2321 This will maintain the "mode" field as a hidden field across requests
2322 automatically. Second, you need to realize that since the "mode" is not
2323 a defined field, you have to get it via the cgi_param() method:
2324
2325 my $mode = $form->cgi_param('mode');
2326
2327 This will allow you to build a large multiscreen application easily,
2328 even integrating it with modules like "CGI::Application" if you want.
2329
2330 You can also do this by simply defining "mode" as a field in your
2331 "fields" declaration. The reason this is discouraged is because when
2332 iterating over your fields you'll get "mode", which you likely don't
2333 want (since it's not "real" data).
2334
2335 Why won't CGI::FormBuilder work with post requests?
2336 It will, but chances are you're probably doing something like this:
2337
2338 use CGI qw(:standard);
2339 use CGI::FormBuilder;
2340
2341 # Our "mode" parameter determines what we do
2342 my $mode = param('mode');
2343
2344 # Change our form based on our mode
2345 if ($mode eq 'view') {
2346 my $form = CGI::FormBuilder->new(
2347 method => 'post',
2348 fields => [qw(...)],
2349 );
2350 } elsif ($mode eq 'edit') {
2351 my $form = CGI::FormBuilder->new(
2352 method => 'post',
2353 fields => [qw(...)],
2354 );
2355 }
2356
2357 The problem is this: Once you read a "post" request, it's gone forever.
2358 In the above code, what you're doing is having "CGI.pm" read the "post"
2359 request (on the first call of param()).
2360
2361 Luckily, there is an easy solution. First, you need to modify your code
2362 to use the OO form of "CGI.pm". Then, simply specify the "CGI" object
2363 you create to the "params" option of FormBuilder:
2364
2365 use CGI;
2366 use CGI::FormBuilder;
2367
2368 my $cgi = CGI->new;
2369
2370 # Our "mode" parameter determines what we do
2371 my $mode = $cgi->param('mode');
2372
2373 # Change our form based on our mode
2374 # Note: since it is post, must specify the 'params' option
2375 if ($mode eq 'view') {
2376 my $form = CGI::FormBuilder->new(
2377 method => 'post',
2378 fields => [qw(...)],
2379 params => $cgi # get CGI params
2380 );
2381 } elsif ($mode eq 'edit') {
2382 my $form = CGI::FormBuilder->new(
2383 method => 'post',
2384 fields => [qw(...)],
2385 params => $cgi # get CGI params
2386 );
2387 }
2388
2389 Or, since FormBuilder gives you a cgi_param() function, you could also
2390 modify your code so you use FormBuilder exclusively, as in the previous
2391 question.
2392
2393 How can I change option XXX based on a conditional?
2394 To change an option, simply use its accessor at any time:
2395
2396 my $form = CGI::FormBuilder->new(
2397 method => 'post',
2398 fields => [qw(name email phone)]
2399 );
2400
2401 my $mode = $form->cgi_param('mode');
2402
2403 if ($mode eq 'add') {
2404 $form->title('Add a new entry');
2405 } elsif ($mode eq 'edit') {
2406 $form->title('Edit existing entry');
2407
2408 # do something to select existing values
2409 my %values = select_values();
2410
2411 $form->values(\%values);
2412 }
2413 print $form->render;
2414
2415 Using the accessors makes permanent changes to your object, so be aware
2416 that if you want to reset something to its original value later, you'll
2417 have to first save it and then reset it:
2418
2419 my $style = $form->stylesheet;
2420 $form->stylesheet(0); # turn off
2421 $form->stylesheet($style); # original setting
2422
2423 You can also specify options to render(), although using the accessors
2424 is the preferred way.
2425
2426 How do I manually override the value of a field?
2427 You must specify the "force" option:
2428
2429 $form->field(name => 'name_of_field',
2430 value => $value,
2431 force => 1);
2432
2433 If you don't specify "force", then the CGI value will always win. This
2434 is because of the stateless nature of the CGI protocol.
2435
2436 How do I make it so that the values aren't shown in the form?
2437 Turn off sticky:
2438
2439 my $form = CGI::FormBuilder->new(... sticky => 0);
2440
2441 By turning off the "sticky" option, you will still be able to access
2442 the values, but they won't show up in the form.
2443
2444 I can't get "validate" to accept my regular expressions!
2445 You're probably not specifying them within single quotes. See the
2446 section on "validate" above.
2447
2448 Can FormBuilder handle file uploads?
2449 It sure can, and it's really easy too. Just change the "enctype" as an
2450 option to new():
2451
2452 use CGI::FormBuilder;
2453 my $form = CGI::FormBuilder->new(
2454 enctype => 'multipart/form-data',
2455 method => 'post',
2456 fields => [qw(filename)]
2457 );
2458
2459 $form->field(name => 'filename', type => 'file');
2460
2461 And then get to your file the same way as "CGI.pm":
2462
2463 if ($form->submitted) {
2464 my $file = $form->field('filename');
2465
2466 # save contents in file, etc ...
2467 open F, ">$dir/$file" or die $!;
2468 while (<$file>) {
2469 print F;
2470 }
2471 close F;
2472
2473 print $form->confirm(header => 1);
2474 } else {
2475 print $form->render(header => 1);
2476 }
2477
2478 In fact, that's a whole file upload program right there.
2479
2481 This really doesn't belong here, but unfortunately many people are
2482 confused by references in Perl. Don't be - they're not that tricky.
2483 When you take a reference, you're basically turning something into a
2484 scalar value. Sort of. You have to do this if you want to pass arrays
2485 intact into functions in Perl 5.
2486
2487 A reference is taken by preceding the variable with a backslash (\).
2488 In our examples above, you saw something similar to this:
2489
2490 my @fields = ('name', 'email'); # same as = qw(name email)
2491
2492 my $form = CGI::FormBuilder->new(fields => \@fields);
2493
2494 Here, "\@fields" is a reference. Specifically, it's an array reference,
2495 or "arrayref" for short.
2496
2497 Similarly, we can do the same thing with hashes:
2498
2499 my %validate = (
2500 name => 'NAME';
2501 email => 'EMAIL',
2502 );
2503
2504 my $form = CGI::FormBuilder->new( ... validate => \%validate);
2505
2506 Here, "\%validate" is a hash reference, or "hashref".
2507
2508 Basically, if you don't understand references and are having trouble
2509 wrapping your brain around them, you can try this simple rule: Any time
2510 you're passing an array or hash into a function, you must precede it
2511 with a backslash. Usually that's true for CPAN modules.
2512
2513 Finally, there are two more types of references: anonymous arrayrefs
2514 and anonymous hashrefs. These are created with "[]" and "{}",
2515 respectively. So, for our purposes there is no real difference between
2516 this code:
2517
2518 my @fields = qw(name email);
2519 my %validate = (name => 'NAME', email => 'EMAIL');
2520
2521 my $form = CGI::FormBuilder->new(
2522 fields => \@fields,
2523 validate => \%validate
2524 );
2525
2526 And this code:
2527
2528 my $form = CGI::FormBuilder->new(
2529 fields => [ qw(name email) ],
2530 validate => { name => 'NAME', email => 'EMAIL' }
2531 );
2532
2533 Except that the latter doesn't require that we first create @fields and
2534 %validate variables.
2535
2537 FORMBUILDER_DEBUG
2538 This toggles the debug flag, so that you can control FormBuilder
2539 debugging globally. Helpful in mod_perl.
2540
2542 Parameters beginning with a leading underscore are reserved for future
2543 use by this module. Use at your own peril.
2544
2545 The field() method has the alias param() for compatibility with other
2546 modules, allowing you to pass a $form around just like a $cgi object.
2547
2548 The output of the HTML generated natively may change slightly from
2549 release to release. If you need precise control, use a template.
2550
2551 Every attempt has been made to make this module taint-safe (-T).
2552 However, due to the way tainting works, you may run into the message
2553 "Insecure dependency" or "Insecure $ENV{PATH}". If so, make sure you
2554 are setting $ENV{PATH} at the top of your script.
2555
2557 This module has really taken off, thanks to very useful input, bug
2558 reports, and encouraging feedback from a number of people, including:
2559
2560 Norton Allen
2561 Mark Belanger
2562 Peter Billam
2563 Brad Bowman
2564 Jonathan Buhacoff
2565 Godfrey Carnegie
2566 Jakob Curdes
2567 Laurent Dami
2568 Bob Egert
2569 Peter Eichman
2570 Adam Foxson
2571 Jorge Gonzalez
2572 Florian Helmberger
2573 Mark Hedges
2574 Mark Houliston
2575 Victor Igumnov
2576 Robert James Kaes
2577 Dimitry Kharitonov
2578 Randy Kobes
2579 William Large
2580 Kevin Lubic
2581 Robert Mathews
2582 Mehryar
2583 Klaas Naajikens
2584 Koos Pol
2585 Shawn Poulson
2586 Victor Porton
2587 Dan Collis Puro
2588 Wolfgang Radke
2589 David Siegal
2590 Stephan Springl
2591 Ryan Tate
2592 John Theus
2593 Remi Turboult
2594 Andy Wardley
2595 Raphael Wegmann
2596 Emanuele Zeppieri
2597
2598 Thanks!
2599
2601 CGI::FormBuilder::Template, CGI::FormBuilder::Messages,
2602 CGI::FormBuilder::Multi, CGI::FormBuilder::Source::File,
2603 CGI::FormBuilder::Field, CGI::FormBuilder::Util,
2604 CGI::FormBuilder::Util, HTML::Template, Text::Template
2605 CGI::FastTemplate
2606
2608 $Id: FormBuilder.pm 65 2006-09-07 18:11:43Z nwiger $
2609
2611 Copyright (c) Nate Wiger <http://nateware.com>. All Rights Reserved.
2612
2613 This module is free software; you may copy this under the terms of the
2614 GNU General Public License, or the Artistic License, copies of which
2615 should have accompanied your Perl kit.
2616
2617
2618
2619perl v5.38.0 2023-07-20 CGI::FormBuilder(3)