ActsAsList: Neue Funktion "reorder_list"
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 30 Jan 2013 10:15:23 +0000 (11:15 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 30 Jan 2013 10:19:00 +0000 (11:19 +0100)
Conflicts:
SL/Controller/ProjectType.pm

SL/Controller/CustomVariableConfig.pm
SL/Controller/PaymentTerm.pm
SL/Controller/PriceFactor.pm
SL/Controller/Unit.pm
SL/Controller/Warehouse.pm
SL/DB/CustomVariableConfig.pm
SL/DB/Helper/ActsAsList.pm
SL/DB/PriceFactor.pm
SL/DB/Unit.pm
SL/DB/Warehouse.pm

index a2842a0..9a151da 100644 (file)
@@ -15,12 +15,7 @@ __PACKAGE__->run_before('check_auth');
 sub action_reorder {
   my ($self) = @_;
 
-  my @ids = @{ $::form->{cvarcfg_id} || [] };
-  my $result = SL::DB::CustomVariableConfig->new->db->do_transaction(sub {
-    foreach my $idx (0 .. scalar(@ids) - 1) {
-      SL::DB::CustomVariableConfig->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
-    }
-  });
+  SL::DB::CustomVariableConfig->reorder_list(@{ $::form->{cvarcfg_id} || [] });
 
   $self->render('1;', { type => 'js', inline => 1 });
 }
index 3a768a2..df86252 100644 (file)
@@ -68,12 +68,7 @@ sub action_destroy {
 sub action_reorder {
   my ($self) = @_;
 
-  my @ids = @{ $::form->{payment_term_id} || [] };
-  my $result = SL::DB::PaymentTerm->new->db->do_transaction(sub {
-    foreach my $idx (0 .. scalar(@ids) - 1) {
-      SL::DB::PaymentTerm->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
-    }
-  });
+  SL::DB::PaymentTerm->reorder_list(@{ $::form->{payment_term_id} || [] });
 
   $self->render('1;', { type => 'js', inline => 1 });
 }
index 31b376d..5def8aa 100644 (file)
@@ -15,12 +15,7 @@ __PACKAGE__->run_before('check_auth');
 sub action_reorder {
   my ($self) = @_;
 
-  my @ids = @{ $::form->{price_factor_id} || [] };
-  my $result = SL::DB::PriceFactor->new->db->do_transaction(sub {
-    foreach my $idx (0 .. scalar(@ids) - 1) {
-      SL::DB::PriceFactor->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
-    }
-  });
+  SL::DB::PriceFactor->reorder_list(@{ $::form->{price_factor_id} || [] });
 
   $self->render('1;', { type => 'js', inline => 1 });
 }
index 72cd5ce..ae6e313 100644 (file)
@@ -15,12 +15,7 @@ __PACKAGE__->run_before('check_auth');
 sub action_reorder {
   my ($self) = @_;
 
-  my @ids = @{ $::form->{unit_id} || [] };
-  my $result = SL::DB::Unit->new->db->do_transaction(sub {
-    foreach my $idx (0 .. scalar(@ids) - 1) {
-      SL::DB::Unit->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
-    }
-  });
+  SL::DB::Unit->reorder_list(@{ $::form->{unit_id} || [] });
 
   $self->render('1;', { type => 'js', inline => 1 });
 }
index cfc84a6..33c8bfc 100644 (file)
@@ -15,12 +15,7 @@ __PACKAGE__->run_before('check_auth');
 sub action_reorder {
   my ($self) = @_;
 
-  my @ids = @{ $::form->{warehouse_id} || [] };
-  my $result = SL::DB::Warehouse->new->db->do_transaction(sub {
-    foreach my $idx (0 .. scalar(@ids) - 1) {
-      SL::DB::Warehouse->new(id => $ids[$idx])->load->update_attributes(sortkey => $idx + 1);
-    }
-  });
+  SL::DB::Warehouse->reorder_list(@{ $::form->{warehouse_id} || [] });
 
   $self->render('1;', { type => 'js', inline => 1 });
 }
index 3410a49..5823e9b 100644 (file)
@@ -6,6 +6,7 @@ package SL::DB::CustomVariableConfig;
 use strict;
 
 use SL::DB::MetaSetup::CustomVariableConfig;
+use SL::DB::Helper::ActsAsList;
 
 # Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
 __PACKAGE__->meta->make_manager_class;
index a645053..ce927bb 100644 (file)
@@ -3,7 +3,7 @@ package SL::DB::Helper::ActsAsList;
 use strict;
 
 use parent qw(Exporter);
-our @EXPORT = qw(move_position_up move_position_down);
+our @EXPORT = qw(move_position_up move_position_down reorder_list);
 
 use Carp;
 
@@ -33,6 +33,27 @@ sub move_position_down {
   do_move($self, 'down');
 }
 
+sub reorder_list {
+  my ($class_or_self, @ids) = @_;
+
+  return 1 unless @ids;
+
+  my $self   = ref($class_or_self) ? $class_or_self : $class_or_self->new;
+  my $column = column_name($self);
+  my $result = $self->db->do_transaction(sub {
+    my $query = qq|UPDATE | . $self->meta->table . qq| SET ${column} = ? WHERE id = ?|;
+    my $sth   = $self->db->dbh->prepare($query) || die $self->db->dbh->errstr;
+
+    foreach my $new_position (1 .. scalar(@ids)) {
+      $sth->execute($new_position, $ids[$new_position - 1]) || die $sth->errstr;
+    }
+
+    $sth->finish;
+  });
+
+  return $result;
+}
+
 #
 # Helper functions
 #
@@ -139,6 +160,22 @@ regarding their sort order by exchanging their C<position> values.
 Swaps the object with the object one step below the current one
 regarding their sort order by exchanging their C<position> values.
 
+=item C<reorder_list @ids>
+
+Re-orders the objects given in C<@ids> by their position in C<@ids> by
+updating all of their positional columns. Each element in
+C<@positions> must be the ID of an object. The new position is the
+ID's index inside C<@ids> plus one (meaning the first element's new
+position will be 1 and not 0).
+
+This works by executing SQL "UPDATE" statements directly.
+
+Returns the result of the whole transaction (trueish in case of
+success).
+
+This method can be called both as a class method or an instance
+method.
+
 =back
 
 =head1 BUGS
index 6680a12..cf07b52 100644 (file)
@@ -3,6 +3,7 @@ package SL::DB::PriceFactor;
 use strict;
 
 use SL::DB::MetaSetup::PriceFactor;
+use SL::DB::Helper::ActsAsList;
 
 __PACKAGE__->meta->make_manager_class;
 
index 59740e7..927e31b 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 
 use SL::DB::MetaSetup::Unit;
 use SL::DB::Manager::Unit;
+use SL::DB::Helper::ActsAsList;
 
 __PACKAGE__->meta->add_relationships(
   base => {
index 938c31e..0557976 100644 (file)
@@ -6,6 +6,7 @@ package SL::DB::Warehouse;
 use strict;
 
 use SL::DB::MetaSetup::Warehouse;
+use SL::DB::Helper::ActsAsList;
 
 __PACKAGE__->meta->make_manager_class;