diff -Naur HTML-FillInForm-2.00/lib/HTML/FillInForm.pm HTML-FillInForm-2.00.new/lib/HTML/FillInForm.pm --- HTML-FillInForm-2.00/lib/HTML/FillInForm.pm 2007-09-11 17:20:01.000000000 -0700 +++ HTML-FillInForm-2.00.new/lib/HTML/FillInForm.pm 2007-11-30 16:36:19.000000000 -0800 @@ -42,6 +42,8 @@ fill_password => 1, ignore_fields => 1, disable_fields => 1, + invalid_fields => 1, + invalid_class => 1, } } @@ -128,6 +130,11 @@ ? @{ $option{disable_fields} } : $option{disable_fields} if exists( $option{disable_fields} ); $self->{disable_fields} = \%disable_fields; + my %invalid_fields; + %invalid_fields = map { $_ => 1 } ( ref $option{'invalid_fields'} eq 'ARRAY' ) + ? @{ $option{invalid_fields} } : $option{invalid_fields} if exists( $option{invalid_fields} ); + $self->{invalid_fields} = \%invalid_fields; + if (my $fdat = $option{fdat}){ # Copy the structure to prevent side-effects. my %copy; @@ -158,6 +165,12 @@ $self->{'target'} = $target; } + if (my $invalid_class = $option{invalid_class}){ + $self->{'invalid_class'} = $invalid_class; + } else { + $self->{'invalid_class'} = 'invalid'; + } + if (defined($option{fill_password})){ $self->{fill_password} = $option{fill_password}; } else { @@ -220,6 +233,23 @@ exists $self->{disable_fields}{ $attr->{'name'} } and $self->{disable_fields}{ $attr->{'name'} } and not ( exists $attr->{disable} and $attr->{disable} ); + + # Check if we need to invalidate this field + my $invalidating = 0; + if (exists $attr->{name} and + exists $self->{invalid_fields}{ $attr->{name} } and + $self->{invalid_fields}{ $attr->{name} }) { + $invalidating = 1; + if (exists $attr->{class} and length $attr->{class}) { + # don't add the class if it's already there + unless ($attr->{class} =~ /\b\Q$self->{invalid_class}\E\b/) { + $attr->{class} .= " $self->{invalid_class}"; + } + } else { + $attr->{class} = $self->{invalid_class}; + } + } + if ($tagname eq 'input'){ my $value = exists $attr->{'name'} ? $self->_get_param($attr->{'name'}) : undef; # force hidden fields to have a value @@ -336,7 +366,18 @@ $self->{selectMultiple} = 0; $self->{selectSelected} = 0; # helper var to remember if an option was already selected in the current select tag } - $self->{output} .= $origtext; + + # need to re-output the + + + + +]; + +my $result = + HTML::FillInForm->new->fill(scalarref => \$html, + fdat => {two => "new val 2"}, + invalid_fields => ['one']); + +like($result, qr/]+name="one"[^>]+class="invalid"/); +unlike($result, qr/]+name="two"[^>]+class="invalid"/); + +$result = HTML::FillInForm->new->fill(scalarref => \$html, + fdat => {two => "new val 2"}, + invalid_fields => ['one', 'two', 'three', 'four']); + +like($result, qr/]+name="one"[^>]+class="invalid"/); +like($result, qr/]+name="two"[^>]+class="existing invalid"/); +like($result, qr/]+name="three"[^>]+class="invalid"/); +like($result, qr/]+name="four"[^>]+class="invalid"/); + +$result = HTML::FillInForm->new->fill(scalarref => \$html, + fdat => {two => "new val 2"}, + invalid_fields => ['one', 'three'], + invalid_class => "funky"); + +like($result, qr/]+name="one"[^>]+class="funky"/); +like($result, qr/]+name="two"[^>]+class="existing"/); +like($result, qr/]+name="three"[^>]+class="invalid funky"/);