my $K = ( caller(0) )[3] . "(): ";
$c->stash->{'template'} = 'serie/index.tt2';
+
+ $c->session->{'return_target_serie_save'} = $c->web_path("/serie");
+
+ delete $c->session->{'from_serie_list'} if exists $c->session->{'from_serie_list'};
+ delete $c->session->{'serie_data_edit'} if exists $c->session->{'serie_data_edit'};
+
}
#-------------------------------------------------------
#-------------------------------------------------------
+sub add_serienlist_menu : Private {
+
+ my ( $self, $c ) = @_;
+ my $K = ( caller(0) )[3] . "(): ";
+
+ push @{ $c->stash->{'menu_path'} }, {
+ 'path' => $c->web_path("/serie/list"),
+ 'name' => "Liste"
+ };
+
+}
+
+#-------------------------------------------------------
+
+=head2 list
+
+Sucht alle Buchserien als Objekt zusammen und übergibt das serie/list.tt2 zur Darstellung.
+
+=cut
+
+sub list : Local {
+
+ my ($self, $c) = @_;
+ my $K = ( caller(0) )[3] . "(): ";
+ $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+
+ $self->add_serienlist_menu($c);
+ delete $c->session->{'serie_data_edit'} if exists $c->session->{'serie_data_edit'};
+
+ my $page = $c->session->{'serie_list_page'} || 1;
+ my $list_length = $c->stash->{'list_length'} || 10;
+
+ if ( $c->request->params->{'page'} and to_int( $c->request->params->{'page'} ) ) {
+ $page = to_int( $c->request->params->{'page'} );
+ $c->session->{'serie_list_page'} = $page;
+ }
+
+ my ( $liste, $anzahl ) = get_serienliste( $c, 'get_books' => 1, 'page' => $page );
+ $c->log->debug( get_output_string( $K, "Erhaltene Liste der Buchserien: ", $liste ) ) if $c->stash->{'debug_level'} >= 2;
+ $c->stash->{'serien'} = $liste;
+
+ my $max_page = 1;
+ if ( $anzahl ) {
+ $max_page = int( $anzahl / $list_length ) + 1;
+ if ( ( $page - 1 ) * $list_length > $anzahl ) {
+ $page = $max_page;
+ $c->session->{'serie_list_page'} = $page;
+ }
+ }
+ else {
+ $page = 1;
+ $c->session->{'serie_list_page'} = 1;
+ }
+
+ my $nav = {
+ 'cur' => $page,
+ 'first' => 1,
+ 'last' => $max_page,
+ 'prev' => ( ( $page > 1 ) ? ( $page - 1 ) : 1 ),
+ 'next' => ( ( ( $page + 1 ) > $max_page ) ? $max_page : ( $page + 1 ) ),
+ 'serien' => $anzahl,
+ 'serie_from' => ( $anzahl ? ( ( $page - 1 ) * $list_length ) + 1 : 0 ),
+ 'serie_to' => ( ( $page * $list_length ) > $anzahl ? $anzahl : ( $page * $list_length ) ),
+ };
+ $c->stash->{'nav'} = $nav;
+ $c->log->debug( get_output_string( $K, "Seitennavigation: ", $nav ) ) if $c->stash->{'debug_level'} >= 2;
+
+ $c->session->{'return_target_view'} = $c->web_path("/serie/list");
+ $c->session->{'return_target_serie_save'} = $c->web_path("/serie/list");
+ $c->session->{'from_serie_list'} = 1;
+ $c->stash->{'template'} = 'serie/list.tt2';
+
+}
+
+#-------------------------------------------------------
+
=head2 form_new( )
Erstellen einer neuen Buchserie.
=head1 NAME
-FrBr::Books::Util::Author - Modul fuer Funktionen rund um Buchserien
+FrBr::Books::Util::Serie - Modul fuer Funktionen rund um Buchserien
=head1 METHODS
Folgende benannte Parameter koennen ueber $params uebergeben werden:
-Rueckgabe: Eine Array-Ref von Hash-Refs mit allen verlagen, die den uebergebenen Suchkriterien entsprechen:
+=over 4
+
+=item B<get_books>
+
+Boolscher Parameter, der aussagt, dass auch die Buecher der Buchserie mit zuammengesammelt werden sollen.
+
+=item I<serien_id>: Die ID einer konkreten Buchserie
+
+=item B<page>
+
+Integer: Zeigt an, welche Seite von Verlagen dargestellt werden soll.
+
+Wenn nicht angegeben, werden alle Verlage zurückgegeben.
+
+=back
+
+Rueckgabe: Eine Array-Ref von Hash-Refs mit allen Buchserien, die den uebergebenen Suchkriterien entsprechen:
+Rueckgabe: Eine Array-Ref von Hash-Refs mit allen Buchserien, die den uebergebenen Suchkriterien entsprechen, sowie im Listenkontext die Anzahl der Buchserien, die den uebergebenen Suchkriterien entsprechen.
+
+Die zurueckgegebene Array-Ref hat folgenden Aufbau:
$res = [
- { 'id' => 1,
- 'name' => 'Perry Rhodan',
- 'descr' => 'Abenteuer des Weltraumspezis',
- 'anzahl_buecher' => 60,
+ {
+ 'id' => 1,
+ 'name' => 'Perry Rhodan',
+ 'descr' => 'Abenteuer des Weltraumspezis',
+ 'count_books' => 60,
+ 'books' => [
+ {
+ 'id' => 2,
+ 'serien_ord_num' => 60,
+ 'title' => 'Perry Rhodan - Die Cynos',
+ 'title_original' => undef,
+ 'untertitel' => undef,
+ 'bindungsart_id' => 1,
+ 'bindungsart' => 'Hartcover',
+ 'orts_id' => 4,
+ 'isbn' => undef,
+ 'verlags_id' => 2,
+ 'verlags_name' => 'Bertelsmann',
+ 'buch_nr' => '0820 4',
+ 'ausgabejahr' => '1997',
+ 'druckjahr' => '2007',
+ 'seiten' => 402,
+ 'preis' => 18,
+ 'waehrungs_id' => 1,
+ 'waehrungs_kuerzel' => '€',
+ 'waehrungs_name' => 'Euro',
+ 'umrechnung_in_euro' => 1,
+ 'ortsname' => 'Dachboden',
+ 'ort_beschreibung' => '',
+ 'ort_ist_statisch' => 'n',
+ 'autoren' => [ 'Verschiedene Autoren' ];
+ 'autor_ids' => [ 2 ];
+ },
+ {
+ 'id' => 22,
+ ...
+ },
+ ...
+ ],
},
{ 'id' => 2,
...
Die Liste ist nach den Serien-Namen alphabetisch sortiert.
+Im Listenkontext wird als zweiter Rückgabewert die Gesamtzahl aller Buchserien zurueckgegeben.
+
=cut
sub get_serienliste {
$c->log->debug( get_output_string( $K, "Uebergebene Parameter: ", $params ) ) if $c->stash->{'debug_level'} >= 2;
my $list = [];
+ my $anzahl_serien = 0;
+
+ my $page = to_int( $params->{'page'} ) ? to_int( $params->{'page'} ) : undef;
+ my $rows = undef;
+ $rows = $c->stash->{'list_length'} || 20 if defined $page;
my $search_params = undef;
+ if ( $params->{'serien_id'} ) {
+ $search_params = {
+ 'me.id' => $params->{'serien_id'},
+ };
+ }
+
+ $anzahl_serien = $c->model('Schema::Serien')->count( $search_params );
+ $c->log->debug( get_output_string( $K, "Anzahl gefundene Serien: ", $anzahl_serien ) ) if $c->stash->{'debug_level'} >= 2;
my $other_params = {};
$other_params->{'order_by'} = [ 'serien_name' ];
$other_params->{'select'} = [
- 'id',
- 'serien_name',
- 'descr',
+ 'me.id',
+ 'me.serien_name',
+ 'me.descr',
+ { 'count' => 'buch_serie.id' }
];
$other_params->{'as'} = [
'id',
'serien_name',
'descr',
+ 'count_books',
];
+ $other_params->{'join'} = [ 'buch_serie'];
+ $other_params->{'group_by'} = [ 'id' ];
- my %SidMap;
+ if ( $page ) {
+ $other_params->{'rows'} = $rows;
+ $other_params->{'page'} = $page;
+ }
- my $i = 0;
for my $serie_rs ( $c->model('Schema::Serien')->search( $search_params, $other_params )->all() ) {
my $serie = {};
$serie->{'id'} = $serie_rs->id();
$serie->{'name'} = $serie_rs->serien_name();
$serie->{'descr'} = $serie_rs->descr();
- $serie->{'anzahl_buecher'} = 0;
+ $serie->{'count_books'} = $serie_rs->get_column('count_books');
push @$list, $serie;
- $SidMap{$serie->{'id'}} = $i;
- $i++;
}
- $search_params = undef;
- $other_params = {};
- $other_params->{'select'} = [ 'serien_id', { 'count' => 'buch_id' } ];
- $other_params->{'as'} = [ 'serien_id', 'anzahl_buecher' ];
- $other_params->{'group_by'} = [ 'serien_id', ];
- for my $rs ( $c->model('Schema::Buch2serie')->search( $search_params, $other_params )->all() ) {
- my $sid = $rs->serien_id();
- my $j = $SidMap{$sid};
- $list->[$j]{'anzahl_buecher'} = $rs->get_column('anzahl_buecher');
+ return ( wantarray ? ( $list, 0 ) : $list ) unless scalar @$list;
+ return ( wantarray ? ( $list, $anzahl_serien ) : $list ) unless $params->{'get_books'};
+
+ for my $serie ( @$list ) {
+
+ $serie->{'books'} = [];
+
+ my $sid = $serie->{'id'};
+
+ $search_params = {
+ 'buch_serie.serien_id' => $sid,
+ };
+
+ $other_params = {};
+ $other_params->{'join'} = [ 'waehrung', 'ort', 'bindungsart', 'buch_serie', 'verlag', ];
+
+ $other_params->{'order_by'} = [ 'buch_serie.ord_num', 'me.title', ];
+
+ $other_params->{'select'} = [
+ 'me.id',
+ 'buch_serie.ord_num',
+ 'me.title',
+ 'me.title_original',
+ 'me.untertitel',
+ 'me.bindungsart_id',
+ 'bindungsart.art_name',
+ 'me.orts_id',
+ 'me.isbn',
+ 'me.verlags_id',
+ 'verlag.name_short',
+ 'me.buch_nr',
+ 'me.ausgabejahr',
+ 'me.druckjahr',
+ 'me.seiten',
+ 'me.preis',
+ 'me.waehrungs_id',
+ 'waehrung.waehrungs_kuerzel',
+ 'waehrung.waehrungs_name',
+ 'waehrung.umrechnung_in_euro',
+ 'ort.name',
+ 'ort.descr',
+ 'ort.statisch',
+ ];
+
+ $other_params->{'as'} = [
+ 'id',
+ 'serien_ord_num',
+ 'title',
+ 'title_original',
+ 'untertitel',
+ 'bindungsart_id',
+ 'bindungsart',
+ 'orts_id',
+ 'isbn',
+ 'verlags_id',
+ 'verlagsname',
+ 'buch_nr',
+ 'ausgabejahr',
+ 'druckjahr',
+ 'seiten',
+ 'preis',
+ 'waehrungs_id',
+ 'waehrungs_kuerzel',
+ 'waehrungs_name',
+ 'umrechnung_in_euro',
+ 'ortsname',
+ 'ort_beschreibung',
+ 'ort_ist_statisch',
+ ];
+
+ for my $book ( $c->model('Schema::Buecher')->search( $search_params, $other_params )->all() ) {
+ my $buch = {};
+ $buch->{'id'} = $book->id();
+ $buch->{'serien_ord_num'} = $book->get_column('serien_ord_num');
+ $buch->{'title'} = $book->title();
+ $buch->{'title_original'} = $book->title_original();
+ $buch->{'untertitel'} = $book->untertitel();
+ $buch->{'bindungsart_id'} = $book->bindungsart_id();
+ $buch->{'bindungsart'} = $book->get_column('bindungsart');
+ $buch->{'orts_id'} = $book->orts_id();
+ $buch->{'isbn'} = $book->isbn();
+ $buch->{'verlags_id'} = $book->verlags_id();
+ $buch->{'verlags_name'} = $book->get_column('verlagsname');
+ $buch->{'buch_nr'} = $book->buch_nr();
+ $buch->{'ausgabejahr'} = $book->ausgabejahr();
+ $buch->{'druckjahr'} = $book->druckjahr();
+ $buch->{'seiten'} = $book->seiten();
+ $buch->{'preis'} = $book->preis();
+ $buch->{'waehrungs_id'} = $book->waehrungs_id();
+ $buch->{'waehrungs_kuerzel'} = $book->get_column('waehrungs_kuerzel');
+ $buch->{'waehrungs_name'} = $book->get_column('waehrungs_name');
+ $buch->{'umrechnung_in_euro'} = $book->get_column('umrechnung_in_euro');
+ $buch->{'ortsname'} = $book->get_column('ortsname');
+ $buch->{'ort_beschreibung'} = $book->get_column('ort_beschreibung');
+ $buch->{'ort_ist_statisch'} = $book->get_column('ort_ist_statisch');
+ $buch->{'autoren'} = [];
+ $buch->{'autor_ids'} = [];
+
+ my $a_search_params = {};
+ $a_search_params->{'buch_id'} = $buch->{'id'};
+ $other_params = {};
+ $other_params->{'order_by'} = [ 'ord_num' ];
+ $other_params->{'join'} = [ 'autor' ];
+ $other_params->{'select'} = [
+ 'me.buch_id',
+ 'autor.id',
+ 'autor.titel',
+ 'autor.vorname',
+ 'autor.mittelname',
+ 'autor.nachname',
+ 'autor.name_suffix',
+ ];
+ $other_params->{'as'} = [
+ 'buch_id',
+ 'autor_id',
+ 'titel',
+ 'vorname',
+ 'mittelname',
+ 'nachname',
+ 'name_suffix',
+ ];
+ for my $ref ( $c->model('Schema::Autor2buch')->search( $a_search_params, $other_params )->all() ) {
+ my $aid = $ref->get_column('autor_id');
+ my @N;
+ push @N, $ref->get_column('titel') if $ref->get_column('titel');
+ push @N, $ref->get_column('vorname') if $ref->get_column('vorname');
+ push @N, $ref->get_column('mittelname') if $ref->get_column('mittelname');
+ push @N, $ref->get_column('nachname');
+ push @N, $ref->get_column('name_suffix') if $ref->get_column('name_suffix');
+ my $autor = join( " ", @N );
+ push @{ $buch->{'autoren'} }, $autor;
+ push @{ $buch->{'autor_ids'} }, $aid;
+ }
+
+ push @{ $serie->{'books'} }, $buch;
+
+ }
}
- return $list;
+ return ( wantarray ? ( $list, $anzahl_serien ) : $list );
+
}
#-----------------------------------------------------------------------------------
--- /dev/null
+<!-- [%#
+ ** Template fuer Buchserienliste
+ **
+ ** vim: noai : ts=4 fenc=utf-8 filetype=html expandtab :
+ **
+ ** $Id$
+ ** $URL$
+ ** -%]
+
+[%- BLOCK book_entry -%]
+[% link_target = Catalyst.web_path( '/books/view', { 'return_target_form' => self_url, view_book_id => book.id, } ) -%]
+<a href="[% link_target %]">[% book.title | html %]</a>[% IF book.autoren.size %] ([% book.autoren.join( ', ' ) | html %])[% END %]
+[%- END -%]
+
+ Buchserienliste
+
+-->
+
+[% tab_colspan = 4 %][% IF Catalyst.user_exists %][% tab_colspan = 6 %][% END -%]
+
+[% META title = 'Liste der Buchserien' -%]
+
+[% BLOCK navrow %]
+ <tr>
+ <td class="nav" colspan="[% tab_colspan %]"><table cellspacing="0" class="nav" width="100%">
+ <tr>
+ <td width="33%" style="text-align: left;"><b>[% IF nav.cur != 1 %]<a href="[% self_url %]?page=1" title="Erste Seite"><<</a>[% ELSE %]<<[% END %] [% IF nav.cur != nav.prev %]<a href="[% self_url %]?page=[% nav.prev %]" title="Vorherige Seite"><</a>[% ELSE %]<[% END %]</b></td>
+ <td width="33%" style="text-align: center;">Buchserie [% nav.serie_from %] bis [% nav.serie_to %] von [% nav.serien %]</td>
+ <td width="33%" style="text-align: right;"><b>[% IF nav.cur != nav.next %]<a href="[% self_url %]?page=[% nav.next %]" title="Nächste Seite">></a>[% ELSE %]>[% END %] [% IF nav.cur != nav.last %]<a href="[% self_url %]?page=[% nav.last %]" title="Letzte Seite">>></a>[% ELSE %]>>[% END %]</b></td>
+ </tr>
+ </table></td>
+ </tr>
+[% END -%]
+
+<div class="center">
+
+<table class="wrapper" cellspacing="0">
+<tr><th>Liste der Buchserien</th> </tr>
+[% IF Catalyst.user_exists %]<tr><td class="action"><a href="[% path('/serie/new') %]">Neue Buchserie ...</a></td></tr>[% END %]
+<tr><td><table class="serienliste">
+ <tr>
+ <th>Name der Buchserie</th>
+ <th>zusätzliche Angaben</th>
+ <th>Bücher</th>
+ <th></th>
+ [% IF Catalyst.user_exists %]<th></th>
+ <th></th>[% END %]
+ </tr>[% PROCESS navrow %]
+[% rowstyle = 'even' %][%- FOREACH serie IN serien -%][% serien_id = serie.id %]
+ <tr>
+ <td class="[% rowstyle %]">[% serie.name %]</td>
+ <td class="[% rowstyle %]">[% serie.descr %]</td>
+ <td class="[% rowstyle %]"><ul class="serienliste">[% IF serie.books and serie.books.size > 0 %][% FOREACH b IN serie.books %]
+ <li>[% PROCESS book_entry book=b %]</li>[% END %][% ELSE %]<li><i>keine</i></li>[% END %]
+ </ul></td>
+ <td class="button [% rowstyle %]"><a href="[% path('/serie/view') %]?view_serien_id=[% serie.id %]">Ansehen</a></td>
+ [% IF Catalyst.user_exists %]<td class="button [% rowstyle %]"><a href="[% path('/serie/edit') %]?edit_serien_id=[% serie.id %]">Ändern</a></td>
+ <td class="button [% rowstyle %]">[% IF serie.books and serie.books.size > 0 %]Löschen[% ELSE %]<a href="[% path('/serie/delete') %]?delete_serie_id=[% serie.id %]">Löschen</a>[% END %]</td>[% END %]
+ </tr>
+[% IF rowstyle == 'even' %][% rowstyle = 'odd'%][% ELSE %][% rowstyle = 'even' %][% END %][% END -%]
+[% PROCESS navrow %]</table></td></tr></table>
+</div>
+<br />