]> Frank Brehm's Git Trees - books.git/commitdiff
Änderung der Sortierung der Bücherliste ermöglicht
authorFrank Brehm <frank@brehm-online.com>
Mon, 22 Dec 2008 17:40:21 +0000 (17:40 +0000)
committerFrank Brehm <frank@brehm-online.com>
Mon, 22 Dec 2008 17:40:21 +0000 (17:40 +0000)
lib/FrBr/Books/Controller/Books.pm
lib/FrBr/Books/Util/Book.pm
root/src/books/list.tt2
root/src/books/sorting.tt2 [new file with mode: 0644]

index 3408a3e97d8697fab39f8907a1f8c97bd63e2eb6..b327382c64c3067bdfcc4b929d331bb9554888ca 100644 (file)
@@ -178,6 +178,107 @@ sub list : Local {
 
 #-------------------------------------------------------
 
+=head2 sorting
+
+Stellt ein Formular zum Ändern der Sortierkriterien der Bücherliste zur Verfügung.
+
+=cut
+
+sub sorting : Local {
+
+    my ($self, $c) = @_;
+    my $K = ( caller(0) )[3] . "(): ";
+    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
+
+    $self->add_booklist_menu($c);
+
+    push @{ $c->stash->{'menu_path'} }, {
+        'path' => $c->web_path("/books/sorting"),
+        'name' => "Sortierung"
+    };
+
+    my $columns = get_booklist_sort_columns();
+
+    $c->stash->{'booklist_sort_kriterien'} = [];
+    $c->stash->{'booklist_sort_namen'}     = {};
+    push @{ $c->stash->{'booklist_sort_kriterien'} }, '###';
+    $c->stash->{'booklist_sort_namen'}{'###'} = '--- Wählen Sie ein Sortierkriterium aus ---';
+    for my $col ( sort { lc($a) cmp lc($b) } keys %$columns ) {
+        push @{ $c->stash->{'booklist_sort_kriterien'} }, $col;
+        $c->stash->{'booklist_sort_namen'}{$col} = $columns->{$col};
+    }
+
+    $c->stash->{'book_order_criteria'} = [];
+    $c->stash->{'book_order_col_dir'}  = {};
+
+    if ( $c->request->params->{'do_save'} ) {
+
+        my $col_ids = {};
+        for my $p ( keys %{ $c->request->params } ) {
+            my $id;
+            if ( ( $id ) = $p =~ /^sort_column-(\d+)$/ ) {
+                my $val = $c->request->params->{$p};
+                $col_ids->{$id} = $val if $columns->{$val};
+            }
+        }
+
+        my $sort_order = [];
+        for my $id ( sort { $a <=> $b } keys %$col_ids ) {
+            my $col = $col_ids->{$id};
+            my $dir = $c->request->params->{ 'sort_dir-' . $id };
+            $dir = ( $dir and uc($dir) eq 'DESC' ) ? 'DESC' : 'ASC';
+            my $val = $dir eq 'ASC' ? $col : { $col => 'DESC' };
+            push @$sort_order, $val;
+        }
+        unless ( scalar( @$sort_order ) ) {
+            push @$sort_order, 'autoren';
+            push @$sort_order, 'title';
+        }
+
+        $c->session->{'book_order_criteria'} = $sort_order;
+        $c->session->{'book_list_page'} = 1;
+
+    }
+
+    if ( $c->session->{'book_order_criteria'} ) {
+        for my $crit ( @{ $c->session->{'book_order_criteria'} } ) {
+            if ( ref($crit) and ref($crit) eq 'HASH' ) {
+                for my $key ( keys %$crit ) {
+                    my $col = lc($key);
+                    if ( $columns->{$col} ) {
+                        my $dir = $crit->{$key};
+                        $dir = ( $dir =~ /desc/i ) ? 'DESC' : 'ASC';
+                        push @{ $c->stash->{'book_order_criteria'} }, $col;
+                        $c->stash->{'book_order_col_dir'}{$col} = $dir;
+                    }
+                }
+            }
+            else {
+                my $col = lc($crit);
+                if ( $columns->{$col} ) {
+                    push @{ $c->stash->{'book_order_criteria'} }, $col;
+                    $c->stash->{'book_order_col_dir'}{$col} = 'ASC';
+                }
+            }
+        }
+    }
+    else {
+        push @{ $c->stash->{'book_order_criteria'} }, 'autoren';
+        push @{ $c->stash->{'book_order_criteria'} }, 'title';
+        $c->stash->{'book_order_col_dir'}{'autoren'} = 'ASC';
+        $c->stash->{'book_order_col_dir'}{'title'} = 'ASC';
+    }
+    $c->log->debug( get_output_string( $K, "book_order_criteria:: ", $c->stash->{'book_order_criteria'} ) ) if $c->stash->{'debug_level'} > 2;
+    $c->log->debug( get_output_string( $K, "book_order_col_dir:: ", $c->stash->{'book_order_col_dir'} ) ) if $c->stash->{'debug_level'} > 2;
+
+    $c->stash->{'template'} = 'books/sorting.tt2';
+
+    return 1;
+
+}
+
+#-------------------------------------------------------
+
 =head2 form_new( )
 
 Erstellen eines neuen Buches.
index bd6faab5de6a1ea8db1b394db6bbe2938de9f48c..99f8ed8130429edd402bb4998f6ce6310c15d1e3 100644 (file)
@@ -6,6 +6,7 @@ package FrBr::Books::Util::Book;
 use strict;
 use warnings;
 
+use Readonly;
 use FrBr::Common;
 
 # Export-Deklarationen
@@ -23,6 +24,7 @@ BEGIN {
     @ISA    = qw(Exporter);
     @EXPORT = qw(
         &get_booklist
+        &get_booklist_sort_columns
         &save_book
         &delete_book
     );
@@ -148,10 +150,15 @@ sub get_booklist {
     # Suchparameter auf undef setzen, falls es keine gibt.
     $b_search_params = undef unless scalar keys %$b_search_params;
 
+    # Anzahl der Buecher insgesamt (ohne paginierung) ermitteln
     my $other_params = {};
     $other_params->{'order_by'} = $order;
     $other_params->{'select'} = [ 'me.buch_id' ];
     $other_params->{'as'}     = [ 'buch_id' ];
+
+    $anzahl_buecher = $c->model('Schema::BuecherListe')->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;
 
@@ -164,8 +171,6 @@ sub get_booklist {
     return ( wantarray ? ( $book_ids, 0 ) : $book_ids ) unless scalar( @$book_ids );
 
     my $in = "IN ( " . join( ", ", @$book_ids ) . " )";
-    $anzahl_buecher = scalar( @$book_ids );
-    $c->log->debug(  get_output_string( $K, "Anzahl gefundene Buecher: ", $anzahl_buecher ) ) if $c->stash->{'debug_level'} >= 2;
 
     $b_search_params = { 'me.id' => \$in };
 
@@ -351,6 +356,37 @@ sub get_booklist {
 
 #-----------------------------------------------------------------------------------
 
+=head2 get_booklist_sort_columns( )
+
+Gibt eine Hash-Ref mit allen verfügbaren Spaltennamen zurück, nach denen
+die Bücherliste sortiert werden kann.
+
+=cut
+
+sub get_booklist_sort_columns {
+
+    Readonly::Scalar my $valid_columns => {
+        'autoren'        => 'Autor/-en',
+        'title'          => 'Buchtitel',
+        'title_original' => 'Original Buchtitel',
+        'bindungsart'    => 'Bindungsart',
+        'verlag'         => 'Buchverlag',
+        'ort'            => 'Aufbewahrungsort',
+        'preis'          => 'Preis',
+        'waehrung'       => 'Währung des Buchpreises',
+        'ausgabejahr'    => 'Ausgabejahr',
+        'druckjahr'      => 'Druckjahr',
+        'seiten'         => 'Seitenzahl',
+        'kategorien'     => 'Buchketagorie(-n)',
+        'serien'         => 'Zyklus/Reihe',
+    };
+
+    return $valid_columns;
+
+}
+
+#-----------------------------------------------------------------------------------
+
 =head2 collect_sort_criteria( $c )
 
 Sammelt aus der Sitzung die Sortierkriterien der Buchliste zusammen und gibt diese verwendbar
@@ -392,21 +428,7 @@ sub collect_sort_criteria {
 
     my $order = [];
 
-    my $valid_column = {
-        'autoren'        => 1,
-        'title'          => 1,
-        'title_original' => 1,
-        'bindungsart'    => 1,
-        'verlag'         => 1,
-        'ort'            => 1,
-        'preis'          => 1,
-        'waehrung'       => 1,
-        'ausgabejahr'    => 1,
-        'druckjahr'      => 1,
-        'seiten'         => 1,
-        'kategorien'     => 1,
-        'serien'         => 1,
-    };
+    my $valid_column = get_booklist_sort_columns();
 
     my $used_column = {};
 
index 7340d4afd3d04bba2d07138050028fc82e05ce2b..292e3e021cd827489a60e69aa9081a5556cdd916 100644 (file)
   </tr>
 [% END -%]
 
+[%- BLOCK listopt_row %]
+  <tr>
+    <td class="nav" colspan="[% tab_colspan %]"><table cellspacing="0" class="nav" width="100%">
+          <tr>
+              <td width="49%" style="text-align: center;"><b>
+                <a href="[% path('/books/sorting') %]" title="Sortierung">Sortierung</a>
+                &nbsp;|&nbsp;
+                <a href="[% path('/books/filter') %]" title="Filterung">Filter</a></b>[% IF booklist_filter_active %] <i>(aktiv)</i>[% END %]</td>
+          </tr>
+        </table></td>
+  </tr>
+[% END -%]
+
 <div class="center">
 
 <table class="wrapper" cellspacing="0">
@@ -40,7 +53,7 @@
     <th></th>
     [% IF Catalyst.user_exists %]<th></th>
     <th></th>[% END %]
-  </tr>[% PROCESS navrow %]
+  </tr>[% PROCESS listopt_row %][% PROCESS navrow %]
 [% rowstyle = 'even' %][%- FOREACH book IN books -%][% buch_id = book.id %]
   <tr>
     <td class="[% rowstyle %]">[% tt_authors = [ ]; tt_authors.push(autor) FOREACH autor = book.autoren %][% tt_authors.join(', ') %]</td>
diff --git a/root/src/books/sorting.tt2 b/root/src/books/sorting.tt2
new file mode 100644 (file)
index 0000000..aa61dd6
--- /dev/null
@@ -0,0 +1,64 @@
+<!-- [%#
+  ** Template fuer Formular zur Buchlistensortierung
+  **
+  ** vim: noai : ts=4 fenc=utf-8 filetype=html expandtab :
+  **
+  ** $Id$
+  ** $URL$
+  ** -%]
+
+  Buchlistensortierung
+
+-->
+
+[% num_kriteria = book_order_criteria.size %][% i = 0 -%]
+
+[% BLOCK sort_order_row -%]
+  [%- nr = i + 1 -%]
+  [%- c_col = book_order_criteria.$i -%]
+  [%- IF c_col -%]
+       [%- dir = book_order_col_dir.$c_col -%]
+  [%- ELSE -%]
+       [%- c_col = '###' -%]
+       [%- dir = 'ASC' -%]
+  [%- END -%]
+  <tr>
+    <th>[% nr %]. Kriterium</th>
+    <td><select name="sort_column-[% i %]" size="1">[% FOR col IN booklist_sort_kriterien %]<option value="[% col %]"[% IF col == c_col %] selected[% END %]>[% booklist_sort_namen.$col %]</option>[% END %]
+        </select></td>
+    <td><select name="sort_dir-[% i %]" size="1">
+          <option value="ASC"[% IF dir == 'ASC' %] selected[% END %]>Aufsteigend</option>
+          <option value="DESC"[% IF dir == 'DESC' %] selected[% END %]>Absteigend</option>
+        </select></td>
+  </tr>
+  [%- i = i + 1 -%]
+[% END -%]
+
+<form method="post" name="book_form" action="[% self_url %]">
+<table class="ftable" cellspacing="0">
+  <tr>
+    <th colspan="3" class="title">Sortierung der Buchliste</th>
+  </tr><tr>
+    <td colspan="3" class="empty"></td>
+  </tr><tr>
+    <th></th>
+    <th>Sortierfeld</th>
+    <th>Sortierrichtung</th>[% WHILE i <= num_kriteria %][% PROCESS sort_order_row %][% END %]
+  </tr><tr>
+    <td colspan="3" class="empty"></td>
+  </tr><tr>
+    <th colspan="3" class="button"><input type="submit" name="do_save" value="  OK  " /></th>
+  </tr>
+</table>
+</form>
+[%- IF error_message %]
+<div class="error">
+<span class="bold">Fehler:</span>&nbsp;[% error_message %]
+</div>
+[% END -%]
+
+<br />
+<div class="back">
+<h2><a href="[% path('/books/list') %]">[% 'Zurück' %]</a></h2>
+</div>
+<br />