use FrBr::Common;
use FrBr::Books::Util::Serie;
+use FrBr::Books::Util::Book;
=head1 NAME
#-------------------------------------------------------
+=head2 form_edit( )
+
+Aendern einer vorhandenen Buchserie.
+
+=cut
+
+sub form_edit : Path('edit') {
+
+ 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/edit"),
+ 'name' => "Ändern"
+ };
+
+ $c->stash->{'error_message'} = '';
+
+ # Zu bearbeitende Serien-Id ermitteln
+ my $sid = to_int( $c->request->params->{'edit_serien_id'} || 0 );
+ unless ( $sid ) {
+ if ( $c->session->{'serie_data_edit'} and $c->session->{'serie_data_edit'}{'id'} ) {
+ $sid = $c->session->{'serie_data_edit'}{'id'};
+ }
+ }
+ unless ( $sid ) {
+ $c->stash->{'template'} = 'error.tt2';
+ $c->stash->{'error'} = 'Keine oder ungültige Buchserien-Id übergeben.';
+ return 1;
+ }
+
+ 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;
+
+ unless ( $sliste and scalar( @$sliste ) ) {
+ $c->stash->{'template'} = 'error.tt2';
+ $c->stash->{'error'} = 'Zur ü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;
+
+ # Ruecksprung-URL bestimmen
+ $c->stash->{'return_target'} = $c->session->{'return_target_edit'} or $c->web_path("/serie/list");
+
+ # Sitzungsdaten vorbelegen, falls noch nicht geschehen
+ if ( $c->session->{'serie_data_edit'} ) {
+ if ( ! $c->session->{'serie_data_edit'}{'id'} or $c->session->{'serie_data_edit'}{'id'} != $sid ) {
+ $c->session->{'serie_data_edit'} = $serie;
+ }
+ }
+ else {
+ $c->session->{'serie_data_edit'} = $serie;
+ }
+ $sliste = undef;
+
+ $self->prepare_data_structures($c);
+ $self->serie_cgi2session($c);
+
+ $c->stash->{'template'} = 'serie/edit.tt2';
+ push @{$c->stash->{'cssfiles'}}, 'serie/form.css';
+
+ $self->serie_session2stash($c);
+
+ return 1 unless $c->request->params->{'serie_form_sent'} and $c->request->params->{'do_save'};
+
+ return $self->do_save_serie($c);
+
+}
+
+#-------------------------------------------------------
+
+sub prepare_data_structures : Private {
+
+ my ( $self, $c ) = @_;
+ my $K = ( caller(0) )[3] . "(): ";
+
+ # Liste aller Bücher zusammensammeln
+ my $buchliste = get_booklist( $c, { 'sort_criteria' => [ 'title', 'autoren' ], } );
+
+ $c->stash->{'book_list'} = {};
+ $c->stash->{'book_array_sorted'} = [];
+
+ for my $book ( @$buchliste ) {
+
+ my $buch_id = $book->{'id'};
+ my $title = $book->{'title'};
+ $title .= " (" . join( ", ", @{ $book->{'autoren'} } ) . ")" if ( $book->{'autoren'} and scalar(@{ $book->{'autoren'} }) );
+
+ $c->stash->{'book_list'}{$buch_id} = $title;
+ push @{ $c->stash->{'book_array_sorted'} }, $buch_id;
+
+ }
+ $c->log->debug( get_output_string( $K . "Buchliste: ", $c->stash->{'book_list'} ) );
+ $c->log->debug( get_output_string( $K . "Alle Buch-Id's, sortiert: ", $c->stash->{'book_array_sorted'} ) );
+
+ undef $buchliste;
+
+}
+
+#-------------------------------------------------------
+
sub do_save_serie : Private {
my ( $self, $c ) = @_;
$c->session->{'serie_data_edit'}{'descr'} = '';
}
+ $self->collect_cgi_books( $c ) if $c->session->{'serie_data_edit'}{'id'};
+
return 1;
}
#-------------------------------------------------------
+sub collect_cgi_books : Private {
+
+ my ( $self, $c ) = @_;
+ my $K = ( caller(0) )[3] . "(): ";
+
+ return unless ( $c->stash->{'book_list'} and $c->stash->{'book_array_sorted'} );
+
+ my %Buch = ();
+ my $i = 1;
+ for my $buch_id ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
+ $Buch{$buch_id} = $i;
+ $i++;
+ }
+
+ # Buch zur Serie hinzufuegen
+ if ( $c->request->params->{'zur_serie'} ) {
+ if ( $c->request->params->{'book_to_list'} ) {
+ my $buch_ids = ref( $c->request->params->{'book_to_list'} ) eq 'ARRAY' ? $c->request->params->{'book_to_list'} : [$c->request->params->{'book_to_list'}];
+ $c->log->debug( get_output_string( $K . "Fuege Buch zu Buchserie hinzu: ", $buch_ids ) );
+ for my $buch_id ( @$buch_ids ) {
+ next unless $buch_id;
+ unless ( $Buch{$buch_id} ) {
+ push @{$c->session->{'serie_data_edit'}{'book_ids'}}, $buch_id;
+ $Buch{$buch_id} = scalar( @{$c->session->{'serie_data_edit'}{'book_ids'}} );
+ }
+ }
+ }
+ return;
+ }
+
+ # Buch aus Buchserie entfernen
+ if ( $c->request->params->{'von_serie'} ) {
+ if ( $c->request->params->{'book_from_list'} ) {
+ my $buch_ids = ref($c->request->params->{'book_from_list'}) eq 'ARRAY' ? $c->request->params->{'book_from_list'} : [$c->request->params->{'book_from_list'}];
+ $c->log->debug( get_output_string( $K . "Entferne Buch von Buchserie: ", $buch_ids ) );
+ for my $buch_id ( @$buch_ids ) {
+ next unless $buch_id;
+ $i = $Buch{$buch_id};
+ next unless $i;
+ splice( @{$c->session->{'serie_data_edit'}{'book_ids'}}, $i - 1, 1 );
+ $i = 1;
+ %Buch = ();
+ for my $bid ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
+ $Buch{$bid} = $i;
+ $i++;
+ }
+ }
+ }
+ return;
+ }
+
+ # Buch in der Buchserie nach oben
+ if ( $c->request->params->{'nach_oben'} ) {
+
+ if ( $c->request->params->{'book_from_list'} ) {
+
+ my $buch_id = ref($c->request->params->{'book_from_list'}) eq 'ARRAY' ? $c->request->params->{'book_from_list'}[0] : $c->request->params->{'book_from_list'};
+ return unless $buch_id;
+
+ $c->log->debug( get_output_string( $K . "Bewege Buch nach oben ", $buch_id ) );
+
+ $c->log->debug( get_output_string( $K . "Bücher vorher: ", $c->session->{'serie_data_edit'}{'book_ids'} ) );
+ my $new_list = [];
+ my $last_book_id = undef;
+ for my $bid ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
+ unless ( $last_book_id ) {
+ $last_book_id = $bid;
+ next;
+ }
+ if ( $bid == $buch_id ) {
+ push @$new_list, $bid;
+ next;
+ }
+ push @$new_list, $last_book_id;
+ $last_book_id = $bid;
+ }
+ push @$new_list, $last_book_id;
+ $c->session->{'serie_data_edit'}{'book_ids'} = $new_list;
+ $c->log->debug( get_output_string( $K . "Bücher hinterher: ", $c->session->{'serie_data_edit'}{'book_ids'} ) );
+
+ }
+
+ return;
+
+ }
+
+ # Buch in der Buchserie nach unten
+ if ( $c->request->params->{'nach_unten'} ) {
+
+ if ( $c->request->params->{'book_from_list'} ) {
+
+ my $buch_id = ref($c->request->params->{'book_from_list'}) eq 'ARRAY' ? $c->request->params->{'book_from_list'}[0] : $c->request->params->{'book_from_list'};
+ return unless $buch_id;
+
+ $c->log->debug( get_output_string( $K . "Bewege Buch nach unten ", $buch_id ) );
+ $c->log->debug( get_output_string( $K . "Bücher vorher: ", $c->session->{'serie_data_edit'}{'book_ids'} ) );
+
+ my $new_list = [];
+ my $last_book_id = undef;
+
+ for my $bid ( @{$c->session->{'serie_data_edit'}{'book_ids'}} ) {
+
+ $c->log->debug( $K . "Untersuche \$bid " . $bid . " ..." );
+
+ unless ( $last_book_id ) {
+ $c->log->debug( $K . "\$last_book_id war noch nicht gesetzt." );
+ if ( $bid == $buch_id ) {
+ $last_book_id = $bid;
+ $c->log->debug( $K . "Hebe \$bid " . $bid . " für nächste Runde auf." );
+ next;
+ }
+ push @$new_list, $bid if $bid;
+ next;
+ }
+
+ unless ( $bid == $buch_id ) {
+ $c->log->debug( $K . "\$bid != \$buch_id." );
+ push @$new_list, $bid if $bid;
+ }
+
+ if ( $last_book_id ) {
+ $c->log->debug( $K . "Hänge \$last_book_id: " . $last_book_id . " an Liste ran." );
+ push @$new_list, $last_book_id;
+ $last_book_id = undef;
+ }
+
+ }
+
+ $c->session->{'serie_data_edit'}{'book_ids'} = $new_list;
+ $c->log->debug( get_output_string( $K . "Bücher hinterher: ", $c->session->{'serie_data_edit'}{'book_ids'} ) );
+ }
+
+ }
+
+}
+
+#-------------------------------------------------------
+
sub serie_session2stash : Private {
my ( $self, $c ) = @_;
$c->stash->{'serie_edit'}{'name'} = $c->session->{'serie_data_edit'}{'name'} if $c->session->{'serie_data_edit'}{'name'};
$c->stash->{'serie_edit'}{'descr'} = $c->session->{'serie_data_edit'}{'descr'};
+ if ( $c->session->{'serie_data_edit'}{'id'} and $c->stash->{'book_array_sorted'} ) {
+
+ my %Buch;
+
+ # 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;
+ $Buch{$buch_id} = 1;
+ }
+ $c->log->debug( get_output_string( $K . "Bücher dieser Buchserie: ", $c->stash->{'books_in_list'} ) );
+
+ # Buch-Id's zusammensammeln, die nicht zur Serie gehoeren
+ $c->stash->{'books_not_in_list'} = [];
+ for my $buch_id ( @{$c->stash->{'book_array_sorted'}} ) {
+ push @{$c->stash->{'books_not_in_list'}}, $buch_id unless $Buch{$buch_id};
+ }
+ $c->log->debug( get_output_string( $K . "Bücher, die fehlen: ", $c->stash->{'books_not_in_list'} ) );
+
+ }
+
$c->stash->{'return_target_serie_save'} = $c->session->{'return_target_serie_save'} || $c->web_path('/serie');
return 1;
=item I<autor_id>: Alle Buecher des Autors mit dieser Id
+=item I<sort_criteria>: Eine Array-Ref mit den Spalten, nach denen sortiert wird.
+
+In diesem Fall wird anhand dieses Parameters und nicht des Sitzungsparameters 'book_order_criteria' sortiert
+(Siehe L<collect_sort_criteria>).
+
=back
Rueckgabe: Eine Array-Ref mit allen Buchtiteln, die den uebergebenen Suchkriterien entsprechen.
my $storage = $c->stash->{'storage'};
- # Suchparameter zusammensammeln
+ # Such- und Sortierparameter zusammensammeln
my $b_search_params = {};
my $order = undef;
+ if ( $params->{'sort_criteria'} and ref($params->{'sort_criteria'}) and ref($params->{'sort_criteria'}) eq 'ARRAY' ) {
+ $order = $params->{'sort_criteria'};
+ }
if ( $params->{'buch_id'} ) {
$b_search_params->{'me.id'} = $params->{'buch_id'};
+ $order = undef;
}
else {
- $order = collect_sort_criteria($c)
+ $order = collect_sort_criteria( $c, $order )
}
# Suchparameter auf undef setzen, falls es keine gibt.
$anzahl_buecher = $c->model('Schema::BuchListe')->count( $b_search_params, $other_params );
$c->log->debug( get_output_string( $K, "Anzahl gefundene Buecher: ", $anzahl_buecher ) ) if $c->stash->{'debug_level'} >= 2;
- $other_params->{'rows'} = $c->stash->{'list_length'} || 20;
- $other_params->{'page'} = $params->{'page'} || $c->stash->{'page'} || 1;
+ my $page = to_int( $params->{'page'} ) ? to_int( $params->{'page'} ) : undef;
+ my $rows = undef;
+ $rows = $c->stash->{'list_length'} || 20 if defined $page;
+
+ if ( $page ) {
+ $other_params->{'rows'} = $rows;
+ $other_params->{'page'} = $page;
+ }
+
+ #$other_params->{'rows'} = $c->stash->{'list_length'} || 20;
+ #$other_params->{'page'} = $params->{'page'} || $c->stash->{'page'} || 1;
my $book_ids = [];
#-----------------------------------------------------------------------------------
-=head2 collect_sort_criteria( $c )
+=head2 collect_sort_criteria( $c, [ $criteria ] )
Sammelt aus der Sitzung die Sortierkriterien der Buchliste zusammen und gibt diese verwendbar
für get_booklist() zurück.
als Array-Ref abgelegt sein. Die Elemente der Array-Ref sind entweder Scalare mit den
Spaltennamen oder Hashrefs der Form [ { 'autoren' => 'desc' }, { 'kategorien' => 'asc' }, ...].
+Es kann auch als weiterer Parameter eine Array-Ref mit den Sorierkriterien uebergeben werden.
+In diesem Fall wird der Sitzungsschluessel 'book_order_criteria' nicht beruecksichtigt.
+
Folgende Spaltennamen dürfen verwendet werden:
- autoren
als Voreinstellung verwendet:
$criteria = [
+ 'autoren',
'title',
];
my $c = shift;
my $K = ( caller(0) )[3] . "(): ";
+ my $given_criteria = shift;
+
my $order = [];
my $valid_column = get_booklist_sort_columns();
my $used_column = {};
- my $criteria = $c->session->{'book_order_criteria'};
+ $given_criteria = undef unless ( $given_criteria and ref($given_criteria) and ref($given_criteria) eq 'ARRAY' );
+
+ my $criteria = ( $given_criteria or $c->session->{'book_order_criteria'} );
unless ( $criteria and ref($criteria) and ref($criteria) eq 'ARRAY' and scalar(@$criteria) ) {
$criteria = [
'autoren',