From: Frank Brehm Date: Sun, 27 Dec 2009 09:14:39 +0000 (+0000) Subject: Darstellung der Spalten, nach denen sortiert wird X-Git-Url: https://git.uhu-banane.net/?a=commitdiff_plain;h=c31c0e3c0931dbc150ac48d6ca62a0e206a64f17;p=books.git Darstellung der Spalten, nach denen sortiert wird --- diff --git a/lib/FrBr/Books/Controller/Books.pm b/lib/FrBr/Books/Controller/Books.pm index b077264..fa781bc 100644 --- a/lib/FrBr/Books/Controller/Books.pm +++ b/lib/FrBr/Books/Controller/Books.pm @@ -146,7 +146,40 @@ sub list : Local { $c->session->{'book_list_page'} = $page; } - my ( $buchliste, $anzahl ) = get_booklist( $c, { 'page' => $page } ); + my $book_order_criteria = $c->session->{'book_order_criteria'}; + unless ( $book_order_criteria and ref($book_order_criteria) and ref($book_order_criteria) eq 'ARRAY' and scalar(@$book_order_criteria) ) { + $book_order_criteria = [ + 'autoren', + 'title', + ]; + } + $c->stash->{'book_order_columns'} = {}; + for my $crit ( @$book_order_criteria ) { + if ( ref($crit) ) { + if ( ref($crit) eq 'HASH' ) { + for my $col ( keys %$crit ) { + if ( $crit->{$col} =~ /^\s*d(?:esc)?/i ) { + $c->stash->{'book_order_columns'}{$col} = 'd'; + } + else { + $c->stash->{'book_order_columns'}{$col} = 'a'; + } + } + } + } + else { + $c->stash->{'book_order_columns'}{$crit} = 'a'; + } + } + + my $list_params = { + 'page' => $page, + 'list_length' => $c->stash->{'list_length'}, + 'sort_criteria' => $book_order_criteria, + }; + $list_params->{'filter'} = $c->session->{'booklist_filter'} if $c->session->{'booklist_filter'}; + + my ( $buchliste, $anzahl ) = get_booklist( $c, $list_params ); my $max_page = 1; if ( $anzahl ) { $max_page = int( $anzahl / $list_length ) + 1; @@ -294,7 +327,7 @@ sub filter : Local { } - $c->detach('/books/list'); + $c->stash->{'booklist_filter_changed'} = 1; } diff --git a/lib/FrBr/Books/Db/BuchListe.pm b/lib/FrBr/Books/Db/BuchListe.pm index cd6d04c..8f665ed 100644 --- a/lib/FrBr/Books/Db/BuchListe.pm +++ b/lib/FrBr/Books/Db/BuchListe.pm @@ -13,17 +13,19 @@ __PACKAGE__->load_components("Core"); __PACKAGE__->table("NONE"); __PACKAGE__->add_columns( - "id", - "title", - "title_original", - "untertitel", - "verlag", - "isbn", - "buch_nr", - "ausgabejahr", - "druckjahr", - "seiten", - "preis", + "id", + "title", + "title_original", + "untertitel", + "verlag", + "isbn", + "buch_nr", + "ausgabejahr", + "druckjahr", + "seiten", + "preis", + "verlags_id", + "orts_id", "waehrungs_kuerzel", "waehrung", "ort", @@ -48,6 +50,8 @@ __PACKAGE__->result_source_instance()->name( \<result_source_instance()->name( \<: Alle Buecher des Autors mit dieser Id +=item I: Die Nummer der Listenseite, die dargestellt werden soll. + +Wenn nicht übergeben, werden alle Buecher des Resultsets zurueckgegeben. + +=item I: Laenge einer Listenseite. + +Ist standardmaessig 20. Wird nicht beruecksichtigt, wenn I nicht mit uebergeben wurde. + +=item I: eine optionale Hash-Ref mit folgenden Filterkriterien: + + + =item I: 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 @@ -157,6 +169,117 @@ sub get_booklist { $order = collect_sort_criteria( $c, $order ) } + # uebergebenen Filter auswerten + if ( $params->{'filter'} and ref($params->{'filter'}) and ( scalar( keys %{$params->{'filter'}} ) ) and not $params->{'buch_id'} ) { + + my $filter = $params->{'filter'}; + + # Es wurde ein Buchtitel als Filter uebergeben + if ( $filter->{'title_name'} ) { + if ( $filter->{'title_name_where'} eq 'contains' ) { + $b_search_params->{'-or'} = [ + 'title' => { 'RLIKE', $filter->{'title_name'} }, + 'title_original' => { 'RLIKE', $filter->{'title_name'} }, + 'untertitel' => { 'RLIKE', $filter->{'title_name'} }, + ]; + } + elsif ( $filter->{'title_name_where'} eq 'starts_with' ) { + $b_search_params->{'-or'} = [ + 'title' => { 'LIKE', ( $filter->{'title_name'} . '%' ) }, + 'title_original' => { 'LIKE', ( $filter->{'title_name'} . '%' ) }, + 'untertitel' => { 'LIKE', ( $filter->{'title_name'} . '%' ) }, + ]; + } + else { + $b_search_params->{'-or'} = [ + 'title' => $filter->{'title_name'}, + 'title_original' => $filter->{'title_name'}, + 'untertitel' => $filter->{'title_name'}, + ]; + } + } + + my $buch_id = {}; + + # Es wurden Autoren als Filter uebergeben + if ( $filter->{'autoren'} and scalar( keys %{ $filter->{'autoren'} } ) ) { + my $ids = [ keys( %{ $filter->{'autoren'} } ) ]; + my $s_params = {}; + if ( scalar(@$ids) > 1 ) { + $s_params->{'me.autor_id'} = { '-in' => $ids }; + } + else { + $s_params->{'me.autor_id'} = $ids->[0]; + } + for my $autor ( $c->model('Schema::Autor2buch')->search( $s_params )->all() ) { + my $id = $autor->get_column('buch_id'); + $buch_id->{$id} = 1; + } + } + + # Es wurden Kategorien als Filter uebergeben + if ( $filter->{'kategorien'} and scalar( keys %{ $filter->{'kategorien'} } ) ) { + my $ids = [ keys( %{ $filter->{'kategorien'} } ) ]; + my $s_params = {}; + if ( scalar(@$ids) > 1 ) { + $s_params->{'me.kategorie_id'} = { '-in' => $ids }; + } + else { + $s_params->{'me.kategorie_id'} = $ids->[0]; + } + for my $bkat ( $c->model('Schema::Buch2kategorie')->search( $s_params )->all() ) { + my $id = $bkat->get_column('buch_id'); + $buch_id->{$id} = 1; + } + } + + # Es wurden Buchserien als Filter uebergeben + if ( $filter->{'serien'} and scalar( keys %{ $filter->{'serien'} } ) ) { + my $ids = [ keys( %{ $filter->{'serien'} } ) ]; + my $s_params = {}; + if ( scalar(@$ids) > 1 ) { + $s_params->{'me.serien_id'} = { '-in' => $ids }; + } + else { + $s_params->{'me.serien_id'} = $ids->[0]; + } + for my $bserie ( $c->model('Schema::Buch2serie')->search( $s_params )->all() ) { + my $id = $bserie->get_column('buch_id'); + $buch_id->{$id} = 1; + } + } + + # eventuell spezifizierte Buch-Ids auswerten + my $buch_ids = undef; + if ( keys %$buch_id and scalar( keys %$buch_id ) ) { + $buch_ids = [ keys %$buch_id ]; + } + $b_search_params->{'me.id'} = ( scalar(@$buch_ids) > 1 ? { '-in' => $buch_ids } : $buch_ids->[0] ) if $buch_ids; + + # Es wurden Verlage als Filter uebergeben + if ( $filter->{'verlage'} and scalar( keys %{ $filter->{'verlage'} } ) ) { + my $ids = [ keys( %{ $filter->{'verlage'} } ) ]; + if ( scalar(@$ids) > 1 ) { + $b_search_params->{'me.verlags_id'} = { '-in' => $ids }; + } + else { + $b_search_params->{'me.verlags_id'} = $ids->[0]; + } + } + + # Es wurden Aufbewahrungsorte als Filter uebergeben + if ( $filter->{'orte'} and scalar( keys %{ $filter->{'orte'} } ) ) { + my $ids = [ keys( %{ $filter->{'orte'} } ) ]; + if ( scalar(@$ids) > 1 ) { + $b_search_params->{'me.orts_id'} = { '-in' => $ids }; + } + else { + $b_search_params->{'me.orts_id'} = $ids->[0]; + } + } + + } + # Suchparameter auf undef setzen, falls es keine gibt. $b_search_params = undef unless scalar keys %$b_search_params; @@ -171,7 +294,7 @@ sub get_booklist { my $page = to_int( $params->{'page'} ) ? to_int( $params->{'page'} ) : undef; my $rows = undef; - $rows = $c->stash->{'list_length'} || 20 if defined $page; + $rows = ( $params->{'list_length'} || $c->stash->{'list_length'} || 20 ) if defined $page; if ( $page ) { $other_params->{'rows'} = $rows; diff --git a/root/lib/config/main.tt2 b/root/lib/config/main.tt2 index edd0781..810e197 100644 --- a/root/lib/config/main.tt2 +++ b/root/lib/config/main.tt2 @@ -18,6 +18,8 @@ END; -%] +[%- MACRO icon_sort_asc BLOCK -%]aufsteigend[%- END -%] +[%- MACRO icon_sort_desc BLOCK -%]absteigend[%- END -%] [%- MACRO uri( path ) BLOCK; diff --git a/root/src/books/filter.tt2 b/root/src/books/filter.tt2 index 56b0539..f1e0026 100644 --- a/root/src/books/filter.tt2 +++ b/root/src/books/filter.tt2 @@ -62,7 +62,9 @@ function set_filter_enabled() {   - +
+ Hinweis: wenn Sie "enthält" als Suchmethode wählen, können Sie MySQL-reguläre Ausdrücke verwenden + (Siehe Beschreibung der MySQL-Syntax für reguläre Ausdrücke).