CGI-FormBuilder

 view release on metacpan or  search on metacpan

lib/CGI/FormBuilder.pm  view on Meta::CPAN

                if ($k) {
                    push @{$self->{fieldsets}}, [$k,$v];
                }
            }
        } else {
            puke "Invalid usage of \$form->fieldsets(name => 'Label')"
        }
    }

    # We look for all the fieldset definitions, checking the main
    # form for a "proper" legend ala our other settings. We then
    # divide up all the fields and group them in fieldsets.
    my(%legends, @sets);
    for (optalign($self->{fieldsets})) {
        my($o,$n) = optval($_);
        next if exists $legends{$o};
        push @sets, $o;
        debug 2, "added fieldset $o (legend=$n) to \@sets";
        $legends{$o} = $n;
    }

    # find *all* our fieldsets, even hidden in fields w/o Human Tags
    for ($self->field) {
        next unless my $o = $_->fieldset;
        next if exists $legends{$o};
        push @sets, $o;
        debug 2, "added fieldset $o (legend=undef) to \@sets";
        $legends{$o} = $o;  # use fieldset as <legend>
    }
    return wantarray ? @sets : \%legends;
}

sub fieldlist {
    my $self = shift;
    my @fields = @_ ? @_ : $self->field;
    my(%saw, @ret);
    for my $set ($self->fieldsets) {
        # reorder fields
        for (@fields) {
            next if $saw{$_};

lib/CGI/FormBuilder.pod  view on Meta::CPAN


This allows you to define fieldsets for your form. Fieldsets are used
to group fields together. Fields are rendered in order, inside the
fieldset they belong to. If a field does not have a fieldset, it
is appended to the end of the form.

To use fieldsets, specify an arrayref of C<< <fieldset> >> names:

    fieldsets => [qw(account preferences contacts)]

You can get a different C<< <legend> >> tag if you specify a nested arrayref:

    fieldsets => [
        [ account  => 'Account Information' ],
        [ preferences => 'Website Preferences' ],
        [ contacts => 'Email and Phone Numbers' ],
    ]

If you're using the source file, that looks like this:

    fieldsets: account=Account Information,preferences=...

lib/CGI/FormBuilder.pod  view on Meta::CPAN

    $form->field(name => 'last_name',  fieldset => 'account');
    $form->field(name => 'email_me',   fieldset => 'preferences');
    $form->field(name => 'home_phone', fieldset => 'contacts');
    $form->field(name => 'work_phone', fieldset => 'contacts');

You can also automatically create a new C<fieldset> on the fly by
specifying a new one:

    $form->field(name => 'remember_me', fieldset => 'advanced');

To set the C<< <legend> >> in this case, you have two options.
First, you can just choose a more readable C<fieldset> name:

    $form->field(name => 'remember_me',
                 fieldset => 'Advanced');

Or, you can change the name using the C<fieldset> accessor:

    $form->fieldset(advanced => 'Advanced Options');

Note that fieldsets without fields are silently ignored, so you can

lib/CGI/FormBuilder/Template/Builtin.pm  view on Meta::CPAN

    }

    # Render hidden fields first
    my @unhidden;
    for my $field ($form->fieldlist) {
        push(@unhidden, $field), next if $field->type ne 'hidden';
        push @html, $field->tag;   # no label/etc for hidden fields
    }

    # Support fieldset => 'name' to organize by fieldset on the fly
    my $legend = $form->fieldsets;

    # Get table stuff and reused calls
    my $table = $form->table(id => $form->idname($form->bodyname), class => $form->class);
    my $tabn = 1;
    push @html, $table if $table;

    # Render regular fields in table
    my $lastset;
    for my $field (@unhidden) {
        if (my $set = $field->fieldset) {

lib/CGI/FormBuilder/Template/Builtin.pm  view on Meta::CPAN

                    }
                }

                # Wrap fieldset in a <div> to allow jquery #tabs
                push @html, $form->div(id => $form->idname($form->tabname.$tabn++),
                                       class => $form->class($form->tabname));

                (my $sn = lc $set) =~ s/\W+/_/g;
                push @html, htmltag('fieldset', id => $form->idname("_$sn"),
                                                class => $form->class('_set'));
                push @html, htmltag('legend') . ($legend->{$set}||$set) . htmltag('/legend')
                  if defined $legend->{$set};

                # Wrap fields in a table
                push @html, $form->table if $table;

                $lastset = $set;
            }
        } elsif ($lastset) {
            # ended <fieldset> defs before form has ended
            # remaining fields are not in a fieldset
            push @html, htmltag('/table') if $table;

lib/CGI/FormBuilder/Template/Div.pm  view on Meta::CPAN

    for my $field ($form->fieldlist) {
        push(@unhidden, $field), next if $field->type ne 'hidden';
        push @html, $field->tag;   # no label/etc for hidden fields
    }

    my $div = $form->div(id => $form->idname($form->bodyname), class => $form->class);
    my $tabn = 1;
    push @html, $div if $div;

    # Support fieldset => 'name' to organize by fieldset on the fly
    my $legend = $form->fieldsets;

    # Render regular fields in <div> for CSS happiness
    my $lastset;
    for my $field (@unhidden) {
        if (my $set = $field->fieldset) {
            # hooks (hack?) for fieldsets
            if ($set ne $lastset) {
                # close any open divs/fieldsets
                if ($lastset) {
                    push @html, htmltag('/fieldset');

lib/CGI/FormBuilder/Template/Div.pm  view on Meta::CPAN

                    }
                }

                # wrap fieldset in a <div> to allow jquery #tabs
                push @html, $form->div(id => $form->idname($form->tabname.$tabn++),
                                       class => $form->class($form->tabname));

                (my $sn = lc $set) =~ s/\W+/_/g;
                push @html, htmltag('fieldset', id => $form->idname("_$sn"),
                                                class => $form->class('_set'));
                push @html, htmltag('legend') . ($legend->{$set}||$set) . htmltag('/legend')
                  if defined $legend->{$set};

                $lastset = $set;
            }
        } elsif ($lastset) {
            # ended <fieldset> defs before form has ended
            # remaining fields are not in a fieldset
            push @html, htmltag('/div') if $div;
            push @html, htmltag('/fieldset');
            push @html, $div;
            undef $lastset;     # avoid dup </fieldset> below

t/1a-test32.html  view on Meta::CPAN

<form action="TEST" class="fb_form" id="account" method="get" name="account">
<div class="fb_state" id="account_state"><input id="_submitted_account" name="_submitted_account" type="hidden" value="1" /></div>
<div class="fb_tab" id="account_tab1">
<fieldset class="fb_set" id="account_acct">
<legend>Account Information</legend>
<table class="fb">
<tr id="account_first_name_row">
  <td class="fb_label" id="account_first_name_label">First Name</td>
  <td class="fb_field" id="account_first_name_field"><input class="fb_input" id="first_name" name="first_name" type="text" /></td>
</tr>
<tr id="account_last_name_row">
  <td class="fb_label" id="account_last_name_label">Last Name</td>
  <td class="fb_field" id="account_last_name_field"><input class="fb_input" id="last_name" name="last_name" type="text" /></td>
</tr>
<tr id="account_email_row">

t/1a-test32.html  view on Meta::CPAN

  <td class="fb_label" id="account_sex_label">Sex</td>
  <td class="fb_field" id="account_sex_field"><input class="fb_radio" id="sex_Yes" name="sex" type="radio" value="Yes" /> <label class="fb_option" for="sex_Yes">Yes</label>
<input class="fb_radio" id="sex_No" name="sex" type="radio" value="No" /> <label class="fb_option" for="sex_No">No</label>
</td>
</tr>
</table>
</fieldset>
</div>
<div class="fb_tab" id="account_tab2">
<fieldset class="fb_set" id="account_prefs">
<legend>User Preferences</legend>
<table class="fb">
<tr id="account_call_me_row">
  <td class="fb_label" id="account_call_me_label">Call Me</td>
  <td class="fb_field" id="account_call_me_field"><input class="fb_input" id="call_me" name="call_me" type="text" /></td>
</tr>
<tr id="account_email_me_row">
  <td class="fb_label" id="account_email_me_label">Email Me</td>
  <td class="fb_field" id="account_email_me_field"><input class="fb_input" id="email_me" name="email_me" type="text" /></td>
</tr>
</table>
</fieldset>
</div>
<div class="fb_tab" id="account_tab3">
<fieldset class="fb_set" id="account_phone">
<legend>Phone Number(s)</legend>
<table class="fb">
<tr id="account_home_phone_row">
  <td class="fb_label" id="account_home_phone_label">Home Phone</td>
  <td class="fb_field" id="account_home_phone_field"><input class="fb_input" id="home_phone" name="home_phone" type="text" /></td>
</tr>
<tr id="account_work_phone_row">
  <td class="fb_label" id="account_work_phone_label">Work Phone</td>
  <td class="fb_field" id="account_work_phone_field"><input class="fb_input" id="work_phone" name="work_phone" type="text" /></td>
</tr>
</table>
</fieldset>
</div>
<div class="fb_tab" id="account_tab4">
<fieldset class="fb_set" id="account_inline_created">
<legend>Inline Created</legend>
<table class="fb">
<tr id="account_new_set_row">
  <td class="fb_label" id="account_new_set_label">New Set</td>
  <td class="fb_field" id="account_new_set_field"><input class="fb_input" id="new_set" name="new_set" type="text" /></td>
</tr>
</table>
</fieldset>
</div>
<table class="fb" id="account_body">
<tr id="account_outside_1_row">

t/1a-test33.html  view on Meta::CPAN

<p>Fields that are <span class="fb_required">highlighted</span> are required.</p>
<form action="TEST" class="fb_form" id="parts" method="post" name="parts" onsubmit="return validate_parts(this);">
<div class="fb_state" id="parts_state"><input id="_submitted_parts" name="_submitted_parts" type="hidden" value="1" /></div>
<div class="fb_extra" id="parts_extra"><input id="replacement" name="replacement" type="hidden" value="TRUE" />
<input id="action" name="action" type="hidden" value="Unsubscribe" />
<input id="name" name="name" type="hidden" value="Pete Peteson" />
<input id="extra" name="extra" type="hidden" value="junk" />
<input id="other_test" name="other_test" type="hidden" value="_other_other_test" /></div>
<div class="fb_tab" id="parts_tab1">
<fieldset class="fb_set" id="parts_acct">
<legend>Account Information</legend>
<div id="parts_ticket_row">
  <div class="fb_label" id="parts_ticket_label"><span class="fb_required">Ticket</span></div>
  <div class="fb_field" id="parts_ticket_field"><input class="fb_input" id="ticket" name="ticket" type="text" value="111" /></div>
</div>
</fieldset>
</div>
<div class="fb_tab" id="parts_tab2">
<fieldset class="fb_set" id="parts_prefs">
<legend>Part Information</legend>
<div id="parts_email_row">
  <div class="fb_label" id="parts_email_label">Email</div>
  <div class="fb_field" id="parts_email_field"><input class="fb_input" id="email" name="email" type="text" value="pete@peteson.com" /></div>
</div>
</div>
</fieldset>
<div class="fb" id="parts_body">
<div id="parts_user_row">
  <div class="fb_label" id="parts_user_label">User</div>
  <div class="fb_field" id="parts_user_field"><input class="fb_input" id="user" name="user" type="text" value="pete" /></div>



( run in 1.026 second using v1.01-cache-2.11-cpan-49f99fa48dc )