[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