[html-formfu] patch for insert_before()

Ferruccio Zamuner nonsolosoft at diff.org
Thu May 15 18:35:35 BST 2008


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';




More information about the HTML-FormFu mailing list