CGI-FormBuilder
view release on metacpan or search on metacpan
lib/CGI/FormBuilder/Field.pm view on Meta::CPAN
# default settings
$oa->{type} ||= 'text';
my $v = $self->{_form}->cgi_param($self->othername);
#$v = $self->tag_value unless defined $v;
if ($self->sticky and defined $v) {
$oa->{value} = $v;
}
$oa->{disabled} = 'disabled' if $self->javascript && ! defined $v; # fanciness
return htmltag('input', $oa);
}
sub growname {
my $self = shift;
return $self->{_form}->growname . '_' . $self->name;
}
sub cgi_value {
my $self = shift;
debug 2, "$self->{name}: called \$field->cgi_value";
puke "Cannot set \$field->cgi_value manually" if @_;
if (my @v = $self->{_form}{params}->can('multi_param') ? $self->{_form}{params}->multi_param($self->name) : $self->{_form}{params}->param($self->name)) {
for my $v (@v) {
if ($self->other && $v eq $self->othername) {
debug 1, "$self->{name}: redoing value from _other field";
$v = $self->{_form}{params}->param($self->othername);
}
}
local $" = ',';
debug 2, "$self->{name}: cgi value = (@v)";
return wantarray ? @v : $v[0];
}
return;
}
sub def_value {
my $self = shift;
debug 2, "$self->{name}: called \$field->def_value";
if (@_) {
$self->{value} = arglist(@_); # manually set
delete $self->{_cache}{type}; # clear auto-type
}
my @v = autodata $self->{value};
local $" = ',';
debug 2, "$self->{name}: def value = (@v)";
$self->inflate_value(\@v);
return wantarray ? @v : $v[0];
}
sub inflate_value {
my ($self, $v_aref) = @_;
debug 2, "$self->{name}: called \$field->inflate_value";
# trying to inflate?
return unless exists $self->{inflate};
debug 2, "$self->{name}: inflate routine exists";
# must return real values to the validate() routine:
return if grep { ((caller($_))[3] eq 'CGI::FormBuilder::Field::validate') }
1..2;
debug 2, "$self->{name}: made sure inflate not called via validate";
# must be valid:
#return unless exists $self->{invalid} && ! $self->{invalid};
return if $self->invalid;
debug 2, "$self->{name}: valid field, inflate proceeding";
my $cache = $self->{inflated_values};
if ($cache && ref $cache eq 'ARRAY' && @{$cache}) {
# could have been cached by validate() check
@{ $v_aref } = @{ $self->{inflated_values} };
debug 2, "$self->{name}: using cached inflate "
. "value from validate()";
}
else {
debug 2, "$self->{name}: new inflate";
puke("Field $self->{name}: inflate must be a reference to a \\&sub")
if ref $self->{inflate} ne 'CODE';
eval { @{ $v_aref } = map $self->{inflate}->($_), @{ $v_aref } };
# no choice but to die hard if didn't validate() first
puke("Field $self->{name}: inflate failed: $@") if $@;
# cache the result:
@{ $self->{inflated_values} } = @{ $v_aref };
}
return;
}
# CGI.pm happiness
*default = \&value;
*defaults = \&value;
*values = \&value;
sub value {
my $self = shift;
debug 2, "$self->{name}: called \$field->value(@_)";
if (@_) {
$self->{value} = arglist(@_); # manually set
delete $self->{_cache}{type}; # clear auto-type
}
unless ($self->force) {
# CGI wins if stickiness is set
debug 2, "$self->{name}: sticky && ! force";
if (my @v = $self->cgi_value) {
local $" = ',';
debug 1, "$self->{name}: returning value (@v)";
$self->inflate_value(\@v);
return wantarray ? @v : $v[0];
}
}
debug 2, "no cgi found, returning def_value";
# no CGI value, or value was forced, or not sticky
return $self->def_value;
}
# The value in the <tag> may be different than in code (sticky)
( run in 4.254 seconds using v1.01-cache-2.11-cpan-d8267643d1d )