From: Kirrily R. <sk...@us...> - 2001-08-02 13:17:46
|
Update of /cvsroot/formmagick/formmagick/lib/CGI/FormMagick In directory usw-pr-cvs1:/tmp/cvs-serv2341 Modified Files: HTML.pm Log Message: Lots of messing around to clean up display_fields() Index: HTML.pm =================================================================== RCS file: /cvsroot/formmagick/formmagick/lib/CGI/FormMagick/HTML.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** HTML.pm 2001/08/02 12:43:54 1.8 --- HTML.pm 2001/08/02 13:17:18 1.9 *************** *** 225,288 **** my @definitions; - # HTML::TagMaker gives us an easy way to make form widgets. - my $tagmaker = CGI::FormMagick::TagMaker->new(); - while (my $fieldinfo = shift @fields ) { ! my $validation = $fieldinfo->{VALIDATION}; ! my $label = $fieldinfo->{LABEL}; ! my $type = $fieldinfo->{TYPE}; ! my $fieldname = $fieldinfo->{ID}; ! my $option_function = $fieldinfo->{OPTIONS}; ! my $value; ! if ($cgi->param("$fieldname")) { ! $value = $cgi->param("$fieldname"); ! } elsif ($fieldinfo->{VALUE} && $fieldinfo->{VALUE} =~ /()$/) { ! $value = $fm->call_defaultvalue_routine($cgi, $fieldinfo->{VALUE}); ! } else { ! $value = $fieldinfo->{VALUE} || ""; ! } ! ! my $description = $fieldinfo->{DESCRIPTION}; ! my $checked = $fieldinfo->{CHECKED}; ! my $multiple = $fieldinfo->{MULTIPLE}; ! my $size = $fieldinfo->{SIZE}; ! ! $fm->print_field_description($description) if $description; ! my $inputfield; ! ! my @option_values; # values for an options list ! my @option_labels; # displayed labels for an options list ! ! # if this is a grouped input (one with options), we'll need to ! # run the options function for it. ! if (($type eq "SELECT") || ($type eq "RADIO")) { ! ! # DWIM whether the options are in a hash or an array. ! my $lv_hashref = $fm->get_option_labels_and_values($cgi, $fieldinfo); ! ! @option_labels = @{$lv_hashref->{labels}}; ! @option_values = @{$lv_hashref->{vals}}; ! } ! # make HTML for the form field. ! $inputfield = $fm->build_inputfield ({TYPE => $type, ! FIELDNAME => $fieldname, ! LABELS => \@option_labels, ! VALUES => \@option_values, ! LABEL => $label, ! VALUE => $value, ! TAGMAKER => $tagmaker, ! CHECKED => $checked, ! MULTIPLE => $multiple, ! SIZE=> $size}); ! ! print qq(<tr><td class="label">) . $fm->localise($label) ; # display errors below the field description. ! my $error = $errors{$label}; print_field_error($error) if $error; --- 225,244 ---- my @definitions; while (my $fieldinfo = shift @fields ) { ! my $info = $fm->gather_field_info($cgi, $fieldinfo); ! $fm->print_field_description($info->{description}) if $info->{description}; ! if (($info->{type} eq "SELECT") || ($info->{type} eq "RADIO")) { ! $fm->set_option_lv($cgi, $info); } ! # make HTML for the form field. ! my $inputfield = $fm->build_inputfield ($info, CGI::FormMagick::TagMaker->new()); ! print qq(<tr><td class="label">) . $fm->localise($info->{label}) ; # display errors below the field description. ! my $error = $errors{$info->{label}}; print_field_error($error) if $error; *************** *** 303,355 **** sub build_inputfield { ! my ($fm, $forminfo) = @_; - my $type = $forminfo->{TYPE}; - my $fieldname = $forminfo->{'FIELDNAME'}; - my $option_labels_ref = $forminfo->{LABELS}; - my $option_values_ref = $forminfo->{VALUES}; - my $tagmaker = $forminfo->{'TAGMAKER'}; - my $checked = $forminfo->{'CHECKED'}; - my $value = $forminfo->{'VALUE'}; - my $label = $forminfo->{'LABEL'}; - my $multiple = $forminfo->{'MULTIPLE'}; - my $size = $forminfo->{'SIZE'}; - my $inputfield; # HTML for a form input ! if ($type eq "SELECT") { # don't specify a size if a size wasn't given in the XML ! if ($size && $size ne "") { $inputfield = $tagmaker->select_start( ! type => $type, ! name => $fieldname, ! multiple => $multiple, ! size => $size ) } else { $inputfield = $tagmaker->select_start( ! type => $type, ! name => $fieldname, ! multiple => $multiple, ) } ! $inputfield = $inputfield . $tagmaker->option_group( ! value => $option_values_ref, ! text => $option_labels_ref, ! ) . $tagmaker->select_end; ! } elsif ($type eq "RADIO") { ! $inputfield = $tagmaker->input_group(type => "$type", ! name => $fieldname, ! value => $option_values_ref, ! text => $option_labels_ref ); ! } elsif ($type eq "CHECKBOX") { $inputfield = $tagmaker->input( ! type => "$type", ! name => $fieldname, ! value => $value, ! checked => $checked, ! text => $label ); } else { # map HTML::TagMaker's functions to the type of this field. --- 259,306 ---- sub build_inputfield { ! my ($fm, $info, $tagmaker) = @_; my $inputfield; # HTML for a form input ! if ($info->{type} eq "SELECT") { # don't specify a size if a size wasn't given in the XML ! if ($info->{size} && $info->{size} ne "") { $inputfield = $tagmaker->select_start( ! type => $info->{type}, ! name => $info->{fieldname}, ! multiple => $info->{multiple}, ! size => $info->{size} ) } else { $inputfield = $tagmaker->select_start( ! type => $info->{type}, ! name => $info->{fieldname}, ! multiple => $info->{multiple}, ) } ! ! $inputfield = $inputfield . $tagmaker->option_group( ! value => $info->{option_values}, ! text => $info->{option_labels}, ! ) . $tagmaker->select_end; ! ! } elsif ($info->{type} eq "RADIO") { ! $inputfield = $tagmaker->input_group( ! type => $info->{type}, ! name => $info->{fieldname}, ! value => $info->{option_values}, ! text => $info->{option_labels} ! ); ! ! } elsif ($info->{type} eq "CHECKBOX") { $inputfield = $tagmaker->input( ! type => $info->{type}, ! name => $info->{fieldname}, ! value => $info->{value}, ! checked => $info->{checked}, ! text => $info->{label} ); + } else { # map HTML::TagMaker's functions to the type of this field. *************** *** 359,376 **** TEXT => 'input_field', ); ! my $function_name = $translation_table{$type}; # make sure no size gets specified if the size isn't given in the XML ! if ($size && $size ne "") { $inputfield = $tagmaker->$function_name( ! type => "$type", ! name => "$fieldname", ! value => "$value", ! size => "$size", ); } else { $inputfield = $tagmaker->$function_name( ! type => "$type", ! name => "$fieldname", ! value => "$value", ); } --- 310,327 ---- TEXT => 'input_field', ); ! my $function_name = $translation_table{$info->{type}}; # make sure no size gets specified if the size isn't given in the XML ! if ($info->{size} && $info->{size} ne "") { $inputfield = $tagmaker->$function_name( ! type => $info->{type}, ! name => $info->{fieldname}, ! value => $info->{value}, ! size => $info->{size}, ); } else { $inputfield = $tagmaker->$function_name( ! type => $info->{type}, ! name => $info->{fieldname}, ! value => $info->{value}, ); } *************** *** 378,381 **** --- 329,393 ---- return $inputfield; } + + =pod + + =head2 gather_field_info($fieldinfo) + + Gathers various information about a field and returns it as a hashref. + + =cut + + sub gather_field_info { + my ($fm, $cgi, $fieldinfo) = @_; + my %f; + foreach (qw( VALIDATION LABEL TYPE ID OPTIONS DESCRIPTION CHECKED + MULTIPLE SIZE)) { + $f{lc($_)} = $fieldinfo->{$_}; + } + + # value defaults to what the user filled in, if they filled + # something in on a previous visit to this field + if ($cgi->param($f{fieldname})) { + $f{value} = $cgi->param($f{fieldname}); + + # are we calling a subroutine to find the value? + } elsif ($fieldinfo->{VALUE} && $fieldinfo->{VALUE} =~ /()$/) { + $f{value} = $fm->call_defaultvalue_routine($cgi, $fieldinfo->{VALUE}); + + # otherwise, use VALUE attribute or default to blank. + } else { + $f{value} = $fieldinfo->{VALUE} || ""; + } + + return \%f; + } + + =pod + + =head2 set_option_lv($fm, $info) + + Given $info (a hashref with info about a field) figures out the option + values/labels for SELECT or RADIO fields and shoves them into + $info->{option values} and $info->{option_labels} + + =cut + + sub set_option_info { + my ($fm, $cgi, $info) = @_; + my @option_values; # values for an options list + my @option_labels; # displayed labels for an options list + + # if this is a grouped input (one with options), we'll need to + # run the options function for it. + if (($info->{type} eq "SELECT") || ($info->{type} eq "RADIO")) { + + # DWIM whether the options are in a hash or an array. + my $lv_hashref = $fm->get_option_labels_and_values($cgi, $info); + + $info->{option_labels} = @{$lv_hashref->{labels}}; + $info->{option_values} = @{$lv_hashref->{vals}}; + } + } + return 1; |