📄 form.pm
字号:
}=item $form->dumpReturns a textual representation of the form. Mainly useful fordebugging. If called in void context, then the dump is printed onSTDERR.=cutsub dump{ my $self = shift; my $method = $self->{'method'}; my $uri = $self->{'action'}; my $enctype = $self->{'enctype'}; my $dump = "$method $uri"; $dump .= " ($enctype)" if $enctype eq "application/xxx-www-form-urlencoded"; $dump .= "\n"; for ($self->inputs) { $dump .= " " . $_->dump . "\n"; } print STDERR $dump unless defined wantarray; $dump;}#---------------------------------------------------package HTML::Form::Input;=back=head1 INPUTSAn C<HTML::Form> contains a sequence of inputs. References to theinputs can be obtained with the $form->inputs or $form->find_inputmethods. Once you have such a reference, then one of the followingmethods can be used on it:=over 4=cutsub new{ my $class = shift; my $self = bless {@_}, $class; $self;}sub add_to_form{ my($self, $form) = @_; push(@{$form->{'inputs'}}, $self); $self;}sub fixup {}=item $input->typeReturns the type of this input. Types are stuff like "text","password", "hidden", "textarea", "image", "submit", "radio","checkbox", "option"...=cutsub type{ shift->{type};}=item $input->name([$new])=item $input->value([$new])These methods can be used to set/get the current name or value of aninput. If the input only can take an enumerated list of values, thenit is an error to try to set it to something else and the method willcroak if you try.=cutsub name{ my $self = shift; my $old = $self->{name}; $self->{name} = shift if @_; $old;}sub value{ my $self = shift; my $old = $self->{value}; $self->{value} = shift if @_; $old;}=item $input->possible_valuesReturns a list of all values that and input can take. For inputs thatdoes not have discrete values this returns an empty list.=cutsub possible_values{ return;}=item $input->other_possible_valuesReturns a list of all values not tried yet.=cutsub other_possible_values{ return;}=item $input->form_name_valueReturns a (possible empty) list of key/value pairs that should beincorporated in the form value from this input.=cutsub form_name_value{ my $self = shift; my $name = $self->{'name'}; return unless defined $name; my $value = $self->value; return unless defined $value; return ($name => $value);}sub dump{ my $self = shift; my $name = $self->name; $name = "<NONAME>" unless defined $name; my $value = $self->value; $value = "<UNDEF>" unless defined $value; my $dump = "$name=$value"; my $type = $self->type; return $dump if $type eq "text"; $type = ($type eq "text") ? "" : " ($type)"; my $menu = $self->{menu} || ""; if ($menu) { my @menu; for (0 .. @$menu-1) { my $opt = $menu->[$_]; $opt = "<UNDEF>" unless defined $opt; substr($opt,0,0) = "*" if $self->{seen}[$_]; push(@menu, $opt); } $menu = "[" . join("|", @menu) . "]"; } sprintf "%-30s %-10s %s", $dump, $type, $menu;}#---------------------------------------------------package HTML::Form::TextInput;@HTML::Form::TextInput::ISA=qw(HTML::Form::Input);#input/text#input/password#input/file#input/hidden#textareasub value{ my $self = shift; if (@_) { if (exists($self->{readonly}) || $self->{type} eq "hidden") { Carp::carp("Input '$self->{name}' is readonly") if $^W; } } $self->SUPER::value(@_);}#---------------------------------------------------package HTML::Form::IgnoreInput;@HTML::Form::IgnoreInput::ISA=qw(HTML::Form::Input);#input/button#input/resetsub value { return }#---------------------------------------------------package HTML::Form::ListInput;@HTML::Form::ListInput::ISA=qw(HTML::Form::Input);#select/option (val1, val2, ....)#input/radio (undef, val1, val2,...)#input/checkbox (undef, value)sub new{ my $class = shift; my $self = $class->SUPER::new(@_); if ($self->type eq "checkbox") { my $value = delete $self->{value}; $value = "on" unless defined $value; $self->{menu} = [undef, $value]; $self->{current} = (exists $self->{checked}) ? 1 : 0; delete $self->{checked}; } else { $self->{menu} = [delete $self->{value}]; my $checked = exists $self->{checked} || exists $self->{selected}; delete $self->{checked}; delete $self->{selected}; if (exists $self->{multiple}) { unshift(@{$self->{menu}}, undef); $self->{current} = $checked ? 1 : 0; } else { $self->{current} = 0 if $checked; } } $self;}sub add_to_form{ my($self, $form) = @_; my $type = $self->type; return $self->SUPER::add_to_form($form) if $type eq "checkbox" || ($type eq "option" && exists $self->{multiple}); my $prev = $form->find_input($self->{name}, $self->{type}); return $self->SUPER::add_to_form($form) unless $prev; # merge menues push(@{$prev->{menu}}, @{$self->{menu}}); $prev->{current} = @{$prev->{menu}} - 1 if exists $self->{current};}sub fixup{ my $self = shift; if ($self->{type} eq "option" && !(exists $self->{current})) { $self->{current} = 0; } $self->{seen} = [(0) x @{$self->{menu}}]; $self->{seen}[$self->{current}] = 1 if exists $self->{current};}sub value{ my $self = shift; my $old; $old = $self->{menu}[$self->{current}] if exists $self->{current}; if (@_) { my $i = 0; my $val = shift; my $cur; for (@{$self->{menu}}) { if ((defined($val) && defined($_) && $val eq $_) || (!defined($val) && !defined($_)) ) { $cur = $i; last; } $i++; } Carp::croak("Illegal value '$val'") unless defined $cur; $self->{current} = $cur; $self->{seen}[$cur] = 1; } $old;}sub possible_values{ my $self = shift; @{$self->{menu}};}sub other_possible_values{ my $self = shift; map { $self->{menu}[$_] } grep {!$self->{seen}[$_]} 0 .. (@{$self->{seen}} - 1);}#---------------------------------------------------package HTML::Form::SubmitInput;@HTML::Form::SubmitInput::ISA=qw(HTML::Form::Input);#input/image#input/submit=item $input->click($form, $x, $y)Some input types (currently "sumbit" buttons and "images") can beclicked to submit the form. The click() method returns thecorrsponding C<HTTP::Request> object.=cutsub click{ my($self,$form,$x,$y) = @_; for ($x, $y) { $_ = 1 unless defined; } local($self->{clicked}) = [$x,$y]; return $form->make_request;}sub form_name_value{ my $self = shift; return unless $self->{clicked}; return $self->SUPER::form_name_value(@_);}#---------------------------------------------------package HTML::Form::ImageInput;@HTML::Form::ImageInput::ISA=qw(HTML::Form::SubmitInput);sub form_name_value{ my $self = shift; my $clicked = $self->{clicked}; return unless $clicked; my $name = $self->{name}; return unless defined $name; return ("$name.x" => $clicked->[0], "$name.y" => $clicked->[1] );}1;__END__=back=head1 SEE ALSOL<LWP>, L<HTML::Parser>, L<webchatpp>=head1 COPYRIGHTCopyright 1998-2000 Gisle Aas.This library is free software; you can redistribute it and/ormodify it under the same terms as Perl itself.=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -