Hi,

The problem:

my $new = $form->element({
       type=>'Checkboxgroup',
       name=>'emblem',
       label_loc=>'Emblems',
       options=>$emblems,
       attributes=>{class=>'emblems'}});

$form->insert_before( $new , $submit );

adds twice the Checkboxgroup:
* one before submit
* other after the last element of the form (submit element).

The solution:

Then I've look at source of insert_before() in HTML::FormFu::ObjectUtil.pm

0: sub insert_before {
1:    my ( $self, $object, $position ) = @_;
2:    for my $i ( 1 .. @{ $self->_elements } ) {
3: if ( refaddr( $self->_elements->[ $i - 1 ] ) eq refaddr($position) ) {
4:            splice @{ $self->_elements }, $i - 1, 0, $object;
5:            $object->{parent} = $position->{parent};
6:            weaken $object->{parent};
7:            return $object;
8:        }
9:    }
10:
11:    croak 'position element not found';
12:}


insert_before() doesn't drop $object from @{ $self->_elements } while
on line 4 splice increase @{ $self->_elements }.

on line 2: scalar @{ $self->_elements } is 12
on line 5: scalar @{ $self->_elements } is 13

Then $object has to be first drop from _elements then inserted in the right place.

sub insert_before {
   my ( $self, $object, $position ) = @_;
   for my $i ( 0 .. @{ $self->_elements } ) {
       if ( refaddr( $self->_elements->[ $i ] ) eq refaddr($object) ) {
           splice @{ $self->_elements }, $i, 1;
       }
   }
   for my $i ( 0 .. @{ $self->_elements } ) {
       if ( refaddr( $self->_elements->[ $i ] ) eq refaddr($position) ) {
           splice @{ $self->_elements }, $i, 0, $object;
           $object->{parent} = $position->{parent};
           weaken $object->{parent};
           return $object;
       }
   }
   croak 'position element not found';
}

I don't know if there is a better way to write, but it works.
Perhaps insert_after() has to be fixed too.


Sorry for my long and boring post.

Bye,                \fer

--

The patch:

--- lib/HTML/FormFu/ObjectUtil.pm       2008-05-13 22:58:38 +0200
+++ patch_lib/HTML/FormFu/ObjectUtil.pm 2008-05-14 10:36:01 +0200
@@ -277,13 +277,18 @@
sub insert_before {
    my ( $self, $object, $position ) = @_;

-    for my $i ( 1 .. @{ $self->_elements } ) {
- if ( refaddr( $self->_elements->[ $i - 1 ] ) eq refaddr($position) ) {
-            splice @{ $self->_elements }, $i - 1, 0, $object;
+    for my $i ( 0 .. @{ $self->_elements } ) {
+        if ( refaddr( $self->_elements->[ $i ] ) eq refaddr($object) ) {
+           splice @{ $self->_elements }, $i, 1;
+       }
+    }
+    for my $i ( 0 .. @{ $self->_elements } ) {
+       if ( refaddr( $self->_elements->[ $i ] ) eq refaddr($position) ) {
+            splice @{ $self->_elements }, $i, 0, $object;
            $object->{parent} = $position->{parent};
            weaken $object->{parent};
-            return $object;
-        }
+           return $object;
+       }
    }

    croak 'position element not found';


_______________________________________________
HTML-FormFu mailing list
[email protected]
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu

Reply via email to