]> Frank Brehm's Git Trees - books.git/commitdiff
Ändern einer Buchserie fertig, Löschen einer Buchserie dazu
authorFrank Brehm <frank@brehm-online.com>
Tue, 24 Nov 2009 21:51:33 +0000 (21:51 +0000)
committerFrank Brehm <frank@brehm-online.com>
Tue, 24 Nov 2009 21:51:33 +0000 (21:51 +0000)
lib/FrBr/Books/Controller/Serie.pm
lib/FrBr/Books/Util/Serie.pm
root/src/serie/form.tt2

index 2a91068e5b688c9834cafed18213af435f6c1e39..c8ebc7a028f44a93fd22aced605c25dfd47708f6 100644 (file)
@@ -242,6 +242,7 @@ sub form_view : Path('view') {
         return 1;
     }
 
+    # Angaben zur Buchserie aus der Datenbank holen
     my $sliste = get_serienliste( $c, 'get_books' => 1, 'serien_id' => $sid );
     $c->log->debug( get_output_string( $K, "Erhaltene Serienliste: ", $sliste ) ) if $c->stash->{'debug_level'} >= 2;
 
@@ -262,6 +263,86 @@ sub form_view : Path('view') {
 
 #-------------------------------------------------------
 
+=head2 delete_serie_form( )
+
+Loescht eine vorhandene Buchserie.
+
+=cut
+
+sub delete_serie_form : Path('delete') {
+
+    my ( $self, $c ) = @_;
+    my $K = ( caller(0) )[3] . "(): ";
+
+    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+
+    unless ( $c->user_exists() ) {
+        $c->detach('/not_allowed');
+        return;
+    }
+
+    $c->stash->{'menu_path'} = [] unless $c->stash->{'menu_path'};
+    $self->add_serienlist_menu($c) if $c->session->{'from_serie_list'};
+    push @{ $c->stash->{'menu_path'} }, {
+        'path' => $c->web_path("/serie/delete"),
+        'name' => "Löschen"
+    };
+
+    $c->stash->{'error_message'} = '';
+
+    my $sid = to_int( $c->request->params->{'delete_serie_id'} || $c->session->{'delete_serie_id'} || 0 );
+    unless ( $sid ) {
+        $c->stash->{'template'} = 'error.tt2';
+        $c->stash->{'error'}    = 'Keine oder ung&uuml;ltige Buchserien-Id &uuml;bergeben.';
+        return 1;
+    }
+    $c->session->{'delete_serie_id'} = $sid;
+
+    # Angaben zur Buchserie aus der Datenbank holen
+    my $sliste = get_serienliste( $c, 'serien_id' => $sid );
+    $c->log->debug( get_output_string( $K, "Erhaltene Serienliste: ", $sliste ) ) if $c->stash->{'debug_level'} >= 2;
+
+    unless ( $sliste and scalar( @$sliste ) ) {
+        $c->stash->{'template'} = 'error.tt2';
+        $c->stash->{'error'}    = 'Zur &uuml;bergebenen Buchserien-Id wurde nichts gefunden.';
+        return 1;
+    }
+
+    my $serie = $sliste->[0];
+    $c->log->debug( get_output_string( $K, "Buchserie aus Datenbank: ", $serie ) ) if $c->stash->{'debug_level'} >= 2;
+
+       my $anzahl_buecher = $c->model('Schema::Buch2serie')->count( { 'serien_id' => $sid, } );
+
+       if ( $anzahl_buecher ) {
+        $c->stash->{'template'} = 'error.tt2';
+        $c->stash->{'error'}    = 'Zur &uuml;bergebenen Buchserie gehören noch Bücher.';
+        return 1;
+       }
+
+    $c->stash->{'return_target'} = $c->session->{'return_target_serie_save'} or $c->web_path("/serie/list");
+
+    $c->stash->{'serie'} = $serie;
+    $sliste = undef;
+
+    $c->stash->{'template'} = 'serie/delete.tt2';
+    push @{$c->stash->{'cssfiles'}}, 'serie/view.css';
+
+    if ( $c->request->params->{'really_delete_serie'} and $c->request->params->{'really_delete_serie'} eq 'yes' and $c->request->params->{'do_delete'} ) {
+        eval {
+            delete_serie( $c, $sid );
+        };
+        if ( $@ ) {
+            $c->stash->{'error_message'} = $@;
+            $c->log->warn( "Fehler beim Löschen der Buchserie: " . $@ );
+            return undef;
+        }
+        $c->stash->{'template'} = 'serie/delete_success.tt2';
+    }
+
+}
+
+#-------------------------------------------------------
+
 =head2 form_edit( )
 
 Aendern einer vorhandenen Buchserie.
@@ -470,6 +551,16 @@ sub collect_cgi_books : Private {
 
     return unless ( $c->stash->{'book_list'} and $c->stash->{'book_array_sorted'} );
 
+    $c->stash->{'selected_book_ids'} = {};
+    my $bids = ref( $c->request->params->{'book_to_list'} ) eq 'ARRAY' ? $c->request->params->{'book_to_list'} : [$c->request->params->{'book_to_list'}];
+    for my $buch_id ( @$bids ) {
+        $c->stash->{'selected_book_ids'}{$buch_id} = 1;
+    }
+    $bids = ref( $c->request->params->{'book_from_list'} ) eq 'ARRAY' ? $c->request->params->{'book_from_list'} : [$c->request->params->{'book_from_list'}];
+    for my $buch_id ( @$bids ) {
+        $c->stash->{'selected_book_ids'}{$buch_id} = 1;
+    }
+
     my %Buch = ();
     my $i = 1;
     for my $buch_id ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
@@ -617,11 +708,14 @@ sub serie_session2stash : Private {
 
         my %Buch;
 
+        $c->stash->{'serie_edit'}{'book_ids'} = [];
+
         # Buch-Id's eintragen, die zur Serie gehoeren
         $c->stash->{'books_in_list'} = [];
         for my $buch_id ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
             next unless $c->stash->{'book_list'}{$buch_id};
             push @{$c->stash->{'books_in_list'}}, $buch_id;
+            push @{$c->stash->{'serie_edit'}{'book_ids'}}, $buch_id;
             $Buch{$buch_id} = 1;
         }
         $c->log->debug( get_output_string( $K . "Bücher dieser Buchserie: ", $c->stash->{'books_in_list'} ) );
index 5e2e4d143ebfc207b7524b279c6b675ea106e338..a11bb03921563c07c7add5e46a3f1044ccc0e750 100644 (file)
@@ -24,6 +24,7 @@ BEGIN {
     @EXPORT = qw(
         &get_serienliste
         &save_serie
+        &delete_serie
     );
 
     #%EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
@@ -353,8 +354,11 @@ sub save_serie {
     my $K     = ( caller(0) )[3] . "(): ";
 
     $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+    $c->log->debug( get_output_string( $K, "Zu speichernde Serie: ", $serie ) ) if $c->stash->{'debug_level'} >= 2;
 
     my $storage = $c->stash->{'storage'};
+    my $save_books = ( $serie->{'id'} and $serie->{'book_ids'} and ref($serie->{'book_ids'}) and ref($serie->{'book_ids'}) eq 'ARRAY') ? 1 : 0;
+    $c->log->debug( $K . "Speichern der Bücher erforderlich: " . ( $save_books ? 'ja' : 'nein' ) . "." ) if $c->stash->{'debug_level'} > 2;
 
     my $save_func = sub {
         my ( $storage, $dbh, $serien_id, $serien_name, $serien_desc ) = @_;
@@ -379,8 +383,139 @@ ENDE
     };
 
     $storage->dbh_do( $save_func, $serie->{'id'}, $serie->{'name'}, $serie->{'descr'}  );
+    my $serien_id = $storage->last_insert_id();
+    return $serien_id unless $serien_id;
 
-    return $storage->last_insert_id();
+    save_serien_buecher( $c, $serien_id, $serie->{'book_ids'} ) if $save_books;
+
+    return $serien_id;
+
+}
+
+#-----------------------------------------------------------------------------------
+
+=head2 save_serien_buecher( $c, $serien_id, @$book_ids )
+
+=cut
+
+sub save_serien_buecher {
+
+    my $c         = shift;
+    my $serien_id = shift;
+    my $book_ids  = shift;
+
+    my $K    = ( caller(0) )[3] . "(): ";
+    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+
+    my $storage = $c->stash->{'storage'};
+    my $dbh = $storage->dbh();
+
+    my $anzahl = 0;
+    $anzahl = scalar( @$book_ids );
+
+    my $in = '';
+    $in = '(' . join( ", ", map { $dbh->quote($_) } @$book_ids ) . ")" if $anzahl;
+
+    my $sql;
+    $sql = <<ENDE;
+DELETE FROM `buch2serie`
+ WHERE `serien_id` = ?
+ENDE
+    $sql .= "   AND `buch_id` NOT IN " . $in . "\n" if $anzahl;
+
+    my $qparams = [];
+    push @$qparams, $serien_id;
+
+    if ( $storage->debug() ) {
+        my $text = $sql;
+        $text =~ s/\s+$//;
+        $text .= ": " . join( ", ", map { $dbh->quote($_) } @$qparams ) . "\n";
+        warn $text;
+    }
+
+    my $sth = $dbh->prepare($sql);
+    $sth->execute( @$qparams );
+
+    return 1 unless $anzahl;
+
+    my $i = 0;
+
+    $sql = <<ENDE;
+INSERT INTO `buch2serie` (
+    `buch_id`, `serien_id`, `ord_num`
+  ) VALUES (
+    ?, ?, ? )
+  ON DUPLICATE KEY UPDATE
+    `ord_num` = ?
+ENDE
+
+    $sth = $dbh->prepare($sql);
+
+    for my $buch_id ( @$book_ids ) {
+
+        $qparams = [];
+        push @$qparams, $buch_id;
+        push @$qparams, $serien_id;
+        push @$qparams, $i;
+        push @$qparams, $i;
+
+        if ( $storage->debug() ) {
+            my $text = $sql;
+            $text =~ s/\s+$//;
+            $text .= ": " . join( ", ", map { $dbh->quote($_) } @$qparams ) . "\n";
+            warn $text;
+        }
+
+        $sth->execute( @$qparams );
+
+        $i++;
+    }
+
+}
+
+#-----------------------------------------------------------------------------------
+
+=head2 delete_serie( $c, $serien_id )
+
+Loescht die Buchserie mit der uebergebenen Serien-Id
+
+=cut
+
+sub delete_serie {
+
+    my $c         = shift;
+    my $serien_id = shift;
+    my $K         = ( caller(0) )[3] . "(): ";
+
+    $c->log->debug( $K . "aufgerufen fuer Serien-Id " . ( defined $serien_id ? $serien_id : '<undef>' ) . "." ) if $c->stash->{'debug_level'} > 2;
+
+    return undef unless $serien_id and to_int($serien_id);
+    $serien_id = to_int($serien_id);
+
+    my $schema =  $c->model('Schema')->{'schema'};
+
+       # Raus, wenn in der Serie noch Buecher sind ...
+       if ( $c->model('Schema::Buch2serie')->count( { 'serien_id' => $serien_id, } ) ) {
+               my $msg = 'In der Buchserie sind noch Bücher enthalten.';
+               die $msg . "\n";
+       }
+
+       # Das eigentliche Löschen
+    my $coderef = sub {
+        $c->model('Schema::Serien')->search( { 'id' => $serien_id } )->delete();
+    };
+
+    my $rs;
+    eval {
+        $rs = $schema->txn_do($coderef);
+    };
+
+    if ($@) {                             # Transaction failed
+               my $msg = $@ =~ /Rollback failed/i ? "Rollback nicht erfolgreich!" : $@;
+               die $msg . "\n";
+               return undef;
+    }
+       return 1;
 
 }
 
index d85e37dfe31a4bf2d301bbee4199a36f5e747e06..cf3d3723e4b79043200704ea9d90dd4204cf08fc 100644 (file)
@@ -40,7 +40,7 @@ Buchserien-Formular
           </tr><tr>
             <td><select name="book_to_list" size="15">
                   <option value="">-- Buch zum Hinzufügen wählen --</option>[% FOR book_id IN books_not_in_list %]
-                  <option value="[% book_id %]">[% book_list.$book_id %]</option>
+                  <option value="[% book_id %]"[% IF selected_book_ids.$book_id %] selected[% END %]>[% book_list.$book_id %]</option>
       [% END %]</select></td>
             <td><input type="submit" name="zur_serie"  value="&rArr;" class="shift_button" title="Zur Serie hinzufügen" />
                 <br /><br />
@@ -53,7 +53,7 @@ Buchserien-Formular
             </td>
             <td><select name="book_from_list" size="15">
                   <option value="">-- Buch zum Entfernen von der Serie wählen --</option>[% FOR book_id IN books_in_list %]
-                  <option value="[% book_id %]">[% book_list.$book_id %]</option>
+                  <option value="[% book_id %]"[% IF selected_book_ids.$book_id %] selected[% END %]>[% book_list.$book_id %]</option>
       [% END %]</select></td>
            </tr></table></td>
     [% END %]</tr><tr>