[Koha-patches] [PATCH] Adding Merge of two biblios from a virtualshelf
Henri-Damien LAURENT
henridamien.laurent at biblibre.com
Tue Aug 25 23:56:13 CEST 2009
---
.../includes/virtualshelves/merge/selection.tmpl | 18 +++
.../prog/en/modules/virtualshelves/merge.tmpl | 15 ++
.../prog/en/modules/virtualshelves/shelves.tmpl | 10 ++-
virtualshelves/addbybiblionumber.pl | 47 ++++++-
virtualshelves/merge.pl | 137 ++++++++++++++++++++
5 files changed, 220 insertions(+), 7 deletions(-)
create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
create mode 100755 virtualshelves/merge.pl
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
new file mode 100644
index 0000000..10d8b29
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
@@ -0,0 +1,18 @@
+<form><table><caption>Merge</caption>
+<!-- TMPL_LOOP NAME="fields" -->
+<tr>
+<td><!-- TMPL_VAR NAME="from" --></td>
+<td><!-- TMPL_VAR NAME="tag" --> <input type="checkbox" name="selected_field" value="<!-- TMPL_VAR NAME="id" -->">
+</td>
+<td><dl>
+<!-- TMPL_LOOP NAME="subfields" -->
+ <dt><!-- TMPL_VAR NAME="key" --></dt>
+ <dd><!-- TMPL_VAR NAME="value" --></dd>
+<!--/TMPL_LOOP -->
+</dl>
+</td>
+</tr>
+<!--/TMPL_LOOP -->
+</table>
+<input type="submit" value="selection" />
+</form>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
new file mode 100644
index 0000000..a189a57
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
@@ -0,0 +1,15 @@
+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" -->
+<title>Koha › <!-- TMPL_VAR NAME="shelf" --> merge</title>
+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
+<!-- TMPL_INCLUDE NAME="header.inc" -->
+
+<h1> <!-- TMPL_VAR NAME="session" --> </h1>
+
+<!-- TMPL_IF fields ><!-- TMPL_INCLUDE NAME="virtualshelves/merge/selection.tmpl" -->
+<!-- TMPL_ELSE -->
+<h1>DOIT</h1><pre><!-- TMPL_VAR NAME="new" --></pre>
+<h1>ITEMS</h1><pre><!-- TMPL_VAR NAME="items" --></pre>
+<!-- /TMPL_IF -->
+
+<!-- TMPL_INCLUDE NAME="intranet-bottom.inc" -->
+
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
index 8b0a7d3..5c9687c 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
@@ -120,7 +120,11 @@ function placeHold () {
<div class="yui-g">
<!-- TMPL_IF NAME="itemsloop" -->
-<form action="/cgi-bin/koha/virtualshelves/shelves.pl" method="post" class="checkboxed">
+ <form action="merge.pl" method="get">
+ <input type="hidden" name="shelf" value="<!-- TMPL_VAR NAME="shelf" -->" />
+ <input type="submit" class="editshelf" value="Merge" />
+ </form>
+ <form action="/cgi-bin/koha/virtualshelves/shelves.pl" method="post" class="checkboxed">
<input type="hidden" name="viewshelf" value="<!-- TMPL_VAR NAME="shelfnumber" -->" />
<input type="hidden" name="modifyshelfcontents" value="1" />
<fieldset>
@@ -324,6 +328,10 @@ function placeHold () {
</td>
<td>
<!-- TMPL_IF NAME="mine" -->
+ <form action="merge.pl" method="get">
+ <input type="hidden" name="shelf" value="<!-- TMPL_VAR NAME="shelf" -->" />
+ <input type="submit" class="editshelf" value="Merge" />
+ </form>
<form action="shelves.pl" method="get">
<input type="hidden" name="shelfnumber" value="<!-- TMPL_VAR NAME="shelf" -->" />
<input type="hidden" name="op" value="modif" />
diff --git a/virtualshelves/addbybiblionumber.pl b/virtualshelves/addbybiblionumber.pl
index d565493..ee199ec 100755
--- a/virtualshelves/addbybiblionumber.pl
+++ b/virtualshelves/addbybiblionumber.pl
@@ -66,6 +66,18 @@ use C4::Auth;
use CGI::Carp qw/fatalsToBrowser/;
use warnings;
+sub AddBibliosToShelf {
+ my ($shelfnumber, at biblionumber)=@_;
+
+ # multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
+ if (scalar(@biblionumber) == 1) {
+ @biblionumber = (split /\//,$biblionumber[0]);
+ }
+ for my $bib (@biblionumber){
+ AddToShelfFromBiblio($bib, $shelfnumber);
+ }
+}
+
my $query = new CGI;
# If set, then single item case.
@@ -99,12 +111,35 @@ if ($biblionumbers) {
$shelfnumber = AddShelf( $newvirtualshelf, $loggedinuser, $category, $sortfield )
if $newvirtualshelf;
if ( $shelfnumber || ( $shelfnumber == -1 ) ) { # the shelf already exist.
- foreach my $biblionumber (@biblionumbers) {
- AddToShelfFromBiblio( $biblionumber, $shelfnumber );
+ if ($confirmed == 1) {
+ AddBibliosToShelf($shelfnumber, at biblionumber);
+ print
+ "Content-Type: text/html\n\n<html><body onload=\"window.opener.location.reload(true);window.close()\"></body></html>";
+ exit;
+ } else {
+ my ( $singleshelf, $singleshelfname, $singlecategory ) = GetShelf( $query->param('shelfnumber') );
+ my @biblios;
+ for my $bib (@biblionumber) {
+ my $data = GetBiblioData( $bib );
+ push(@biblios,
+ { biblionumber => $bib,
+ title => $data->{'title'},
+ author => $data->{'author'},
+ } );
+ }
+
+ $template->param
+ (
+ biblionumber => \@biblionumber,
+ biblios => \@biblios,
+ multiple => (scalar(@biblionumber) > 1),
+ singleshelf => 1,
+ shelfname => $singleshelfname,
+ shelfnumber => $singleshelf,
+ total => scalar(@biblionumber),
+ confirm => 1,
+ );
}
- print
-"Content-Type: text/html\n\n<html><body onload=\"window.close()\"></body></html>";
- exit;
}
else { # this shelf doesn't already exist.
my $limit = 10;
@@ -163,5 +198,5 @@ else { # this shelf doesn't already exist.
);
}
- output_html_with_http_headers $query, $cookie, $template->output;
}
+output_html_with_http_headers $query, $cookie, $template->output;
diff --git a/virtualshelves/merge.pl b/virtualshelves/merge.pl
new file mode 100755
index 0000000..bff5aa7
--- /dev/null
+++ b/virtualshelves/merge.pl
@@ -0,0 +1,137 @@
+#! /usr/bin/perl
+# vim: enc=utf-8 fdm=marker fdn=1 sw=4
+use utf8;
+use strict;
+use warnings;
+use Devel::SimpleTrace;
+use Storable qw< freeze thaw >;
+use C4::Auth;
+use C4::Context;
+use C4::Biblio;
+use C4::VirtualShelves;
+use YAML;
+use CGI;
+
+sub debug { print STDERR @_,"\n" }
+
+# Global values {{{
+my $query = CGI->new;
+my $sessionID = (checkauth($query))[2];
+my $session = C4::Auth::get_session( $sessionID );
+
+my ( $template, $user, $cookie ) = get_template_and_user {
+ qw(
+ template_name virtualshelves/merge.tmpl
+ type intranet
+ authnotrequired 0
+ )
+ , query => $query
+ , flagsrequired => {}
+};
+# }}}
+# Functions {{{
+
+sub render {
+ use C4::Output;
+ $template->param( session => $sessionID );
+ output_html_with_http_headers $query, $cookie, $template->output;
+}
+
+sub maybe_lost {
+ $template->param( maybe_lost => 1 );
+ render; exit;
+}
+
+sub fields_to_merge { $session->param('fields_to_merge') }
+
+# global values ... but only for nextid
+
+my $selection_id = 0;
+sub nextid { $selection_id++ }
+
+sub prepare_subfield { { key => $$_[0], value => $$_[1] } }
+
+sub prepare_field {
+ my $ready = {
+ field => freeze($_)
+ , from => shift
+ , tag => $_->tag
+ , id => nextid
+ };
+
+ if ( $_->is_control_field ) {
+ $$ready{control} = 1;
+ } else {
+ $$ready{subfields} = [ map prepare_subfield, $_->subfields ]
+ };
+
+ $ready;
+}
+
+sub fields_by_tag { $$a{tag} cmp $$b{tag} }
+
+sub build_records {
+ my $newbiblio = MARC::Record->new;
+ my $items = MARC::Record->new;
+ my ( $selected_fields ) = @_;
+ my $stored_fields = $session->param('fields');
+ my $kept_biblio = $stored_fields->[0]->{id};
+ my %biblio_to_delete;
+
+ for ( @$stored_fields ) {
+ my $from = $$_{from};
+ $biblio_to_delete{ $from } = 1;
+
+ if ( $$_{tag} eq '995' ) {
+ if ( $from != $kept_biblio ) {
+ $items->append_fields( thaw $$_{field} )
+ }
+ } else {
+ if ( exists $$selected_fields{ $$_{id} } ) {
+ $newbiblio->append_fields( thaw $$_{field} )
+ }
+ }
+ }
+ delete $biblio_to_delete{ $kept_biblio };
+ ( $newbiblio, $kept_biblio, $items, [ values %biblio_to_delete ] );
+}
+
+sub clear_session { (shift)->clear([qw< fields shelf >]) }
+
+# }}}
+# the controller {{{
+
+if ( my %field_selection = map { $_ => 1 } $query->param('selected_field') ) {
+ my ($record, $number, $items, $delete ) = build_records( \%field_selection );
+ ModBiblio( $record, $number, GetFrameworkCode( $number ));
+ AddItems( $items, $number );
+ for ( @$delete ) {
+ if ( my $error = DelBiblio($_) ) {
+ die $error
+ }
+ }
+} else {
+ my $shelf = $query->param('shelf') or maybe_lost;
+ if ( my @records = C4::VirtualShelves::each_biblionumbers {
+ { id => $_, record => GetMarcBiblio($_) }
+ } $shelf
+ ) {
+ my @fields = sort {fields_by_tag} map {
+ my ( $id , $record ) = @$_{qw< id record >};
+ map { prepare_field($id) } $record->fields;
+ } @records;
+ my @store = ( fields => \@fields );
+
+ for ($session) {
+ clear_session($_);
+ $_->param(@store, shelf => $shelf );
+ }
+ $template->param(@store);
+ } else {
+ die "GET LOST ?";
+ }
+}
+
+render;
+
+# }}}
--
1.6.0.4
More information about the Koha-patches
mailing list