CGI-AutoForm
view release on metacpan or search on metacpan
lib/CGI/AutoForm.pm view on Meta::CPAN
unless ($field->{DATATYPE})
{
$field->{DATATYPE} = $field->{_imp_datetype} if $field->{_imp_datetype};
}
my $dval = $io->default_value($fname);
# Dates cannot have default values from the data dictionary, I don't want to bother with formatting them!
undef($dval) if $field->{_imp_datetype};
$field->{DEFAULT_VALUE} = $dval unless length($field->{DEFAULT_VALUE}) || !length($dval);
$field->{REQUIRED} = ($io->required($fname) ? 'Y' : undef) unless $field->{REQUIRED};
my $flen = $io->field_length($fname);
if ($field->{DATATYPE} eq 'DATE')
{
##at const depends on output date format
$flen = 11;
}
elsif ($field->{DATATYPE} eq 'DATETIME')
{
##at const depends on output date format
$flen = 17;
}
$field->{INPUT_SIZE} = ($flen > $CGI::AutoForm::DEFAULT_FIELD_LENGTH ? $CGI::AutoForm::DEFAULT_FIELD_LENGTH : $flen)
unless $field->{INPUT_SIZE};
$field->{INPUT_MAXLENGTH} = $flen unless $field->{INPUT_MAXLENGTH};
return $field;
}
# Set the html attribute of $field with, and return a string of HTML
# according to INPUT_CONTROL_TYPE.
# Note that INPUT_CONTROL_TYPE may have been set by _export_field() depending
# on the way $field will be used in the form.
sub field_html
{
my ($self,$field) = @_;
my $type = $self->control_type($field);
if ($type eq 'TEXT' || $type eq 'PASSWORD' || $type eq 'MATCH TEXT' || $type eq 'COMMALIST')
{
return ($field->{html} = $self->text_pass_html($field,$type));
}
elsif ($type eq 'TEXTAREA')
{
return ($field->{html} = $self->textarea_html($field));
}
elsif ($type eq 'SELECT')
{
return ($field->{html} = $self->select_html($field));
}
elsif ($type eq $CGI::AutoForm::DISPLAY_ONLY_GROUP)
{
return ($field->{html} = $self->display_html($field));
}
elsif ($type eq 'CHECKBOX' or $type eq 'CHECKGROUP')
{
return ($field->{html} = $self->checkbox_html($field));
}
elsif ($type eq 'RADIO')
{
return ($field->{html} = $self->radio_html($field));
}
elsif ($type eq 'FILE')
{
return ($field->{html} = $self->fileupload_html($field));
}
else
{
die("Field type [$type] not recognized for $field->{FIELD_NAME}");
return undef;
}
}
# File type input.
##at not sure if the comments below are correct?
## In order for file uploads to work on a form,
## the enctype="file" attribute needs to be added to the form tag.
sub fileupload_html
{
my ($self,$field) = @_;
my $need_req = $field->{REQUIRED} eq 'Y';
my $need_req_class = 0;
if ($need_req)
{
$need_req_class = 1 unless $field->{ELEMENT_ATTRS} =~
s/CLASS\s*=\s*['"]?(.*?)['"]?/CLASS="$1 REQI"/i;
}
my $name = qq[name="] . $self->escape($field->{FORM_ELEMENT_NAME}) . qq["];
my $class = $need_req_class ? qq[CLASS="REQI" ] : "";
my $attrs = $field->{ELEMENT_ATTRS};
my $html = qq[<input type="file" $class $name $attrs>];
$self->{form_enctype_attr} = qq[enctype="multipart/form-data"];
return $html;
}
# A checkbox field results in a series of checkboxes, one for each
# PICK_LIST element, multiple values may be checked for the same field.
# A PICK_LIST attribute of $field is necessary (see create_field())
# The default layout of the checkboxes will be a tabular with
# $CGI::AutoForm::DEFAULT_RADIO_CHECKBOX_COLS number of rows, this can
# be overridden by specifying UI_TABLE_COLUMN.RADIO_CHECKBOX_COLS
sub checkbox_html
{
my ($self,$field) = @_;
my %checked;
if (ref($field->{VALUE}) eq 'ARRAY')
{
map { $checked{$_} = 'CHECKED ' } (@{$field->{VALUE}});
}
elsif (!ref($field->{VALUE}))
{
$checked{$field->{VALUE}} = 'CHECKED ' if defined($field->{VALUE});
}
else
{
die "A horrible death";
}
my $need_req = $field->{REQUIRED} eq 'Y';
my $need_req_class = 0;
if ($need_req)
{
$need_req_class = 1 unless $field->{ELEMENT_ATTRS} =~ s/CLASS\s*=\s*['"]?(.*?)['"]?/CLASS="$1 REQI"/i;
}
##at should have a {RADIO_CHECKBOX_COLS} = 0 where no <TABLE> and related tags are generated
my $ret = '<TABLE><TR>';
my $i;
my $cols = ($field->{RADIO_CHECKBOX_COLS} ? $field->{RADIO_CHECKBOX_COLS} : $CGI::AutoForm::DEFAULT_RADIO_CHECKBOX_COLS);
foreach my $opt (@{$field->{PICK_LIST}})
{
( run in 0.612 second using v1.01-cache-2.11-cpan-b16cb0d3907 )