[Koha-patches] [PATCH] Tags - module, script and template support for user tagging in OPAC.
Joe Atzberger
joe.atzberger at liblime.com
Tue Apr 8 16:02:07 CEST 2008
---
C4/Tags.pm | 427 ++++++++++++++++++++
koha-tmpl/opac-tmpl/prog/en/modules/opac-tags.tmpl | 76 ++++
opac/opac-tags.pl | 154 +++++++
3 files changed, 657 insertions(+), 0 deletions(-)
create mode 100644 C4/Tags.pm
create mode 100644 koha-tmpl/opac-tmpl/prog/en/modules/opac-tags.tmpl
create mode 100755 opac/opac-tags.pl
diff --git a/C4/Tags.pm b/C4/Tags.pm
new file mode 100644
index 0000000..0eebb0c
--- /dev/null
+++ b/C4/Tags.pm
@@ -0,0 +1,427 @@
+package C4::Tags;
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
+
+use strict;
+use warnings;
+use Carp;
+use Exporter;
+
+use C4::Context;
+use C4::Debug;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+use vars qw($ext_dict $select_all @fields);
+
+BEGIN {
+ $VERSION = 0.01;
+ @ISA = qw(Exporter);
+ @EXPORT_OK = qw(
+ &get_tag &get_tags &get_tag_rows
+ &add_tags &add_tag
+ &delete_tag_row_by_id
+ &remove_tag
+ &delete_tag_rows_by_ids
+ &rectify_weights
+ );
+ # %EXPORT_TAGS = ();
+ $ext_dict = C4::Context->preference('TagsExternalDictionary');
+ if ($debug) {
+ require Data::Dumper;
+ import Data::Dumper qw(:DEFAULT);
+ print STDERR __PACKAGE__ . " external dictionary = " . ($ext_dict||'none') . "\n";
+ }
+ if ($ext_dict) {
+ require Lingua::Ispell;
+ import Lingua::Ispell qw(spellcheck);
+ }
+}
+
+INIT {
+ $ext_dict and $Lingua::Ispell::path = $ext_dict;
+ $debug and print STDERR "\$Lingua::Ispell::path = $Lingua::Ispell::path\n";
+ @fields = qw(tag_id borrowernumber biblionumber term language date_created);
+ $select_all = "SELECT " . join(',', at fields) . "\n FROM tags_all\n";
+}
+
+sub remove_tag ($) {
+ my $tag_id = shift;
+ my $rows = get_tag_rows({tag_id=>$tag_id}) or return 0;
+ (scalar(@$rows) == 1) or return undef;
+ my $row = shift(@$rows);
+ ($tag_id == $row->{tag_id}) or return 0;
+ my $tags = get_tags({term=>$row->{term}, biblionumber=>$row->{biblionumber}});
+ my $index = shift(@$tags);
+ $debug and print STDERR
+ sprintf "remove_tag: tag_id=>%s, biblionumber=>%s, weight=>%s, weight_total=>%s\n",
+ $row->{tag_id}, $row->{biblionumber}, $index->{weight}, $index->{weight_total};
+ if ($index->{weight} <= 1) {
+ delete_tag_index($row->{term},$row->{biblionumber});
+ } else {
+ decrement_weight($row->{term},$row->{biblionumber});
+ }
+ if ($index->{weight_total} <= 1) {
+ delete_tag_approval($row->{term});
+ } else {
+ decrement_weight_total($row->{term});
+ }
+ delete_tag_row_by_id($tag_id);
+}
+
+sub delete_tag_index ($$) {
+ (@_) or return undef;
+ my $sth = C4::Context->dbh->prepare("DELETE FROM tags_index WHERE term = ? AND biblionumber = ? LIMIT 1");
+ $sth->execute(@_);
+ return $sth->rows || 0;
+}
+sub delete_tag_approval ($) {
+ (@_) or return undef;
+ my $sth = C4::Context->dbh->prepare("DELETE FROM tags_approval WHERE term = ? LIMIT 1");
+ $sth->execute(shift);
+ return $sth->rows || 0;
+}
+sub delete_tag_row_by_id ($) {
+ (@_) or return undef;
+ my $sth = C4::Context->dbh->prepare("DELETE FROM tags_all WHERE tag_id = ? LIMIT 1");
+ $sth->execute(shift);
+ return $sth->rows || 0;
+}
+sub delete_tag_rows_by_ids (@) {
+ (@_) or return undef;
+ my $i=0;
+ foreach(@_) {
+ $i += delete_tag_row_by_id($_);
+ }
+ ($i == scalar(@_)) or
+ warn sprintf "delete_tag_rows_by_ids tried %s tag_ids, only succeeded on $i", scalar(@_);
+ return $i;
+}
+
+sub get_tag_rows ($) {
+ my $hash = shift || {};
+ my @ok_fields = @fields;
+ push @ok_fields, 'limit'; # push the limit! :)
+ my $wheres;
+ my $limit = "";
+ my @exe_args = ();
+ foreach my $key (keys %$hash) {
+ $debug and print STDERR "get_tag_rows arg. '$key' = ", $hash->{$key}, "\n";
+ unless (length $key) {
+ carp "Empty argument key to get_tag_rows: ignoring!";
+ next;
+ }
+ unless (1 == scalar grep {/^ $key $/xi} @ok_fields) {
+ carp "get_tag_rows received unreconized argument key '$key'.";
+ next;
+ }
+ if ($key =~ /^limit$/i) {
+ my $val = $hash->{$key};
+ unless ($val =~ /^\d+$/) {
+ carp "Non-nuerical limit value '$val' ignored!";
+ next;
+ }
+ $limit = " LIMIT $val\n";
+ } else {
+ $wheres .= ($wheres) ? " AND $key = ?\n" : " WHERE $key = ?\n";
+ push @exe_args, $hash->{$key};
+ }
+ }
+ my $query = $select_all . ($wheres||'') . $limit;
+ $debug and print STDERR "get_tag_rows query:\n $query\n",
+ "get_tag_rows query args: ", join(',', @exe_args), "\n";
+ my $sth = C4::Context->dbh->prepare($query);
+ if (@exe_args) {
+ $sth->execute(@exe_args);
+ } else {
+ $sth->execute;
+ }
+ return $sth->fetchall_arrayref({});
+}
+
+sub get_tags (;$) { # i.e., from tags_index
+ # my $self = shift;
+ my $hash = shift || {};
+ my @ok_fields = qw(term biblionumber weight limit sort);
+ my $wheres;
+ my $limit = "";
+ my $order = "";
+ my @exe_args = ();
+ foreach my $key (keys %$hash) {
+ $debug and print STDERR "get_tags arg. '$key' = ", $hash->{$key}, "\n";
+ unless (length $key) {
+ carp "Empty argument key to get_tags: ignoring!";
+ next;
+ }
+ unless (1 == scalar grep {/^ $key $/xi} @ok_fields) {
+ carp "get_tags received unreconized argument key '$key'.";
+ next;
+ }
+ if ($key =~ /^limit$/i) {
+ my $val = $hash->{$key};
+ unless ($val =~ /^\d+$/) {
+ carp "Non-nuerical limit value '$val' ignored!";
+ next;
+ }
+ $limit = " LIMIT $val\n";
+ } elsif ($key =~ /^sort$/i) {
+ foreach my $by (split /\,/, $hash->{$key}) {
+ unless (
+ $by =~ /^([-+])?(term)/ or
+ $by =~ /^([-+])?(biblionumber)/ or
+ $by =~ /^([-+])?(weight)/
+ ) {
+ carp "get_tags received illegal sort order '$by'";
+ next;
+ }
+ $order .= " ORDER BY $2 " . ($1 eq '-' ? 'DESC' : $1 eq '+' ? 'ASC' : '') . "\n";
+ }
+
+ } else {
+ my $whereval = $key;
+ ($key =~ /^term$/i) and $whereval = 'tags_index.term';
+ $wheres .= ($wheres) ? " AND $whereval = ?\n" : " WHERE $whereval = ?\n";
+ push @exe_args, $hash->{$key};
+ }
+ }
+ my $query = "
+ SELECT tags_index.term as term,biblionumber,weight,weight_total
+ FROM tags_index
+ LEFT JOIN tags_approval
+ ON tags_index.term = tags_approval.term
+ " . ($wheres||'') . $order . $limit;
+ $debug and print STDERR "get_tags query:\n $query\n",
+ "get_tags query args: ", join(',', @exe_args), "\n";
+ my $sth = C4::Context->dbh->prepare($query);
+ if (@exe_args) {
+ $sth->execute(@exe_args);
+ } else {
+ $sth->execute;
+ }
+ return $sth->fetchall_arrayref({});
+}
+
+sub is_approved ($) {
+ my $term = shift or return undef;
+ if ($ext_dict) {
+ return (spellcheck($term) ? 0 : 1);
+ }
+ my $sth = C4::Context->dbh->prepare("SELECT approved FROM tags_approval WHERE term = ?");
+ $sth->execute($term);
+ $sth->rows or return undef;
+ return $sth->fetch;
+}
+
+sub get_tag_index ($;$) {
+ my $term = shift or return undef;
+ my $sth;
+ if (@_) {
+ $sth = C4::Context->dbh->prepare("SELECT * FROM tags_index WHERE term = ? AND biblionumber = ?");
+ $sth->execute($term,shift);
+ } else {
+ $sth = C4::Context->dbh->prepare("SELECT * FROM tags_index WHERE term = ?");
+ $sth->execute($term);
+ }
+ return $sth->fetchrow_hashref;
+}
+
+sub add_tag_approval ($;$) {
+ my $term = shift or return undef;
+ my $query = "SELECT * FROM tags_approval WHERE term = ?";
+ my $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($term);
+ ($sth->rows) and return increment_weight_total($term);
+ my $ok = (@_ ? shift : 0);
+ if ($ok) {
+ $query = "INSERT INTO tags_approval (term,approved_by,approved,date_approved) VALUES (?,?,1,NOW())";
+ $debug and print STDERR "add_tag_approval query:\n$query\nadd_tag_approval args: ($term,$ok)\n";
+ $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($term,$ok);
+ } else {
+ $query = "INSERT INTO tags_approval (term,date_approved) VALUES (?,NOW())";
+ $debug and print STDERR "add_tag_approval query:\n$query\nadd_tag_approval args: ($term)\n";
+ $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($term);
+ }
+ return $sth->rows;
+}
+
+sub add_tag_index ($$;$) {
+ my $term = shift or return undef;
+ my $biblionumber = shift or return undef;
+ my $query = "SELECT * FROM tags_index WHERE term = ? AND biblionumber = ?";
+ my $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($term,$biblionumber);
+ ($sth->rows) and return increment_weight($term,$biblionumber);
+ $query = "INSERT INTO tags_index (term,biblionumber) VALUES (?,?)";
+ $debug and print "add_tag_index query:\n$query\nadd_tag_index args: ($term,$biblionumber)\n";
+ $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($term,$biblionumber);
+ return $sth->rows;
+}
+
+sub get_tag ($) { # by tag_id
+ (@_) or return undef;
+ my $sth = C4::Context->dbh->prepare("$select_all WHERE tag_id = ?");
+ $sth->execute(shift);
+ return $sth->fetchrow_hashref;
+}
+
+sub rectify_weights (;$) {
+ my $dbh = C4::Context->dbh;
+ my $sth;
+ my $query = "
+ SELECT term,biblionumber,count(*) as count
+ FROM tags_all
+ ";
+ (@_) and $query .= " WHERE term =? ";
+ $query .= " GROUP BY term,biblionumber ";
+ $sth = $dbh->prepare($query);
+ if (@_) {
+ $sth->execute(shift);
+ } else {
+ $sth->execute();
+ }
+ my $results = $sth->fetchall_arrayref({}) or return undef;
+ my %tally = ();
+ foreach (@$results) {
+ _set_weight($_->{count},$_->{term},$_->{biblionumber});
+ $tally{$_->{term}} += $_->{count};
+ }
+ foreach (keys %tally) {
+ _set_weight_total($tally{$_},$_);
+ }
+ return ($results,\%tally);
+}
+
+sub increment_weights ($$) {
+ increment_weight(@_);
+ increment_weight_total(shift);
+}
+sub decrement_weights ($$) {
+ decrement_weight(@_);
+ derement_weight_total(shift);
+}
+sub increment_weight_total ($) {
+ _set_weight_total('weight_total+1',shift);
+}
+sub increment_weight ($$) {
+ _set_weight('weight+1',shift,shift);
+}
+sub decrement_weight_total ($) {
+ _set_weight_total('weight_total-1',shift);
+}
+sub decrement_weight ($$) {
+ _set_weight('weight-1',shift,shift);
+}
+sub _set_weight_total ($$) {
+ my $sth = C4::Context->dbh->prepare("
+ UPDATE tags_approval
+ SET weight_total=" . (shift) . "
+ WHERE term=?
+ ");
+ $sth->execute(shift); # just the term
+}
+sub _set_weight ($$$) {
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("
+ UPDATE tags_index
+ SET weight=" . (shift) . "
+ WHERE term=?
+ AND biblionumber=?
+ ");
+ $sth->execute(@_);
+}
+
+sub add_tag ($$;$$) { # biblionumber,term,[borrowernumber,approvernumber]
+ my $biblionumber = shift or return undef;
+ my $term = shift or return undef;
+ my $borrowernumber = (@_) ? shift : 0; # the user, default to kohaadmin
+
+ # first, add to tags regardless of approaval
+ my $query = "INSERT INTO tags_all
+ (borrowernumber,biblionumber,term,date_created)
+ VALUES (?,?,?,NOW())";
+ $debug and print STDERR "add_tag query:\n $query\n",
+ "add_tag query args: ($borrowernumber,$biblionumber,$term)\n";
+ my $sth = C4::Context->dbh->prepare($query);
+ $sth->execute($borrowernumber,$biblionumber,$term);
+
+ # then
+ if (@_) { # if an arg remains, it is the borrowernumber of the approver: tag is pre-approved.
+ my $approver = shift;
+ add_tag_approval($term,$approver);
+ add_tag_index($term,$biblionumber,$approver);
+ } elsif (is_approved($term)) {
+ add_tag_approval($term,1);
+ add_tag_index($term,$biblionumber,1);
+ } else {
+ add_tag_approval($term);
+ add_tag_index($term,$biblionumber);
+ }
+}
+
+1;
+__END__
+
+=head1 C4::Tags.pm - Support for user tagging of biblios.
+
+More verose debugging messages are sent in the presence of non-zero $ENV{"DEBUG"}.
+
+=head2 add_tag(biblionumber,term[,borrowernumber])
+
+=head3 TO DO: Add real perldoc
+
+=head2 Tricks
+
+If you want to auto-populate some tags for debugging, do something like this:
+
+mysql> select biblionumber from biblio where title LIKE "%Health%";
++--------------+
+| biblionumber |
++--------------+
+| 18 |
+| 22 |
+| 24 |
+| 30 |
+| 44 |
+| 45 |
+| 46 |
+| 49 |
+| 111 |
+| 113 |
+| 128 |
+| 146 |
+| 155 |
+| 518 |
+| 522 |
+| 524 |
+| 530 |
+| 544 |
+| 545 |
+| 546 |
+| 549 |
+| 611 |
+| 613 |
+| 628 |
+| 646 |
+| 655 |
++--------------+
+26 rows in set (0.00 sec)
+
+Then, take those numbers and type them into this perl command line:
+perl -ne 'use C4::Tags qw(get_tags add_tag); use Data::Dumper;chomp; add_tag($_,"health",51,1); print Dumper get_tags({limit=>5,term=>"health",});'
+
+=cut
+
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-tags.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-tags.tmpl
new file mode 100644
index 0000000..0637aa4
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-tags.tmpl
@@ -0,0 +1,76 @@
+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" --><!-- TMPL_IF NAME="LibraryNameTitle" --><!-- TMPL_VAR NAME="LibraryNameTitle" --><!-- TMPL_ELSE -->Koha Online<!-- /TMPL_IF --> Catalog › Tags
+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
+</head>
+<body>
+<!-- TMPL_INCLUDE NAME="masthead.inc" -->
+
+<div id="doc3" class="yui-t1">
+<div id="bd">
+<div id="yui-main">
+ <div class="yui-b"><div class="yui-g">
+
+ <!-- TMPL_IF NAME="ERRORS" -->
+ <!-- TMPL_LOOP NAME="ERRORS" -->
+ <div class="error">There was a problem with this operation:
+ <!-- TMPL_IF NAME="tagsdisabled" -->Sorry, tags are not enabled on this system.<!-- /TMPL_IF -->
+ <!-- TMPL_IF NAME="badparam" -->ERROR: illegal paramter <!-- TMPL_VAR NAME="badparam" --><!-- /TMPL_IF -->
+ </div>
+ <!-- /TMPL_LOOP -->
+ <!-- /TMPL_IF -->
+
+ <!-- TMPL_IF NAME="add_op" -->
+ <h3><!-- TMPL_VAR NAME="added_count" --> tags successfully added.</h3>
+ <!-- /TMPL_IF -->
+ <!-- TMPL_IF NAME="deleted_count" -->
+ <h3><!-- TMPL_VAR NAME="deleted_count" --> tags successfully deleted.</h3>
+ <!-- /TMPL_IF -->
+
+ <!-- TMPL_IF NAME="MY_TAGS" -->
+ <form method="post" action="opac-tags.pl">
+ <h2>My Tags</h2>
+ <table>
+ <tr><th>Term</th><th>Title</th><th>Date/Time Added</th><th>Delete</th>
+ </tr>
+ <!-- TMPL_LOOP NAME="MY_TAGS" -->
+ <tr><td><a href="/cgi-bin/koha/opac-search.pl?tag=<!-- TMPL_VAR NAME="term" ESCAPE="URL" -->&q=<!-- TMPL_VAR NAME="term" ESCAPE="URL" -->">
+ <!-- TMPL_VAR NAME="term" ESCAPE="HTML" --></a>
+ </td>
+ <td><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->">
+ <!-- TMPL_VAR NAME="bib_summary" ESCAPE="HTML" --></a></td>
+ <td><!-- TMPL_VAR NAME="date_created_display" -->
+ <span class="time" style="background-color:lightgray;"><!-- TMPL_VAR NAME="time_created_display" --></span></td>
+ <td><input type="submit" name="del<!-- TMPL_VAR NAME="tag_id" -->" value="Delete" /></td>
+ </tr>
+ <!-- /TMPL_LOOP -->
+ </table>
+ </form>
+ <!-- TMPL_ELSE -->
+ <div class="msg">To see any of your own saved tags, first log in.</div>
+ <!-- /TMPL_IF -->
+
+ <h1>All Tags</h1>
+ <div id="action">
+ <form method="post" action="opac-tags.pl">
+ <p>Show up to <input name="limit" maxlength="4" size="4" value="100" />
+ tags from other users.
+ <input type="submit" value="OK" />
+ </p>
+ </form>
+ </div>
+ <!-- TMPL_IF NAME="TAGLOOP" --> Results:<ul>
+ <!-- TMPL_LOOP NAME="TAGLOOP" -->
+ <li><a href="/cgi-bin/koha/opac-search.pl?tag=<!-- TMPL_VAR NAME="term" ESCAPE="URL" -->&q=<!-- TMPL_VAR NAME="term" ESCAPE="URL" -->">
+ <!-- TMPL_VAR NAME="term" ESCAPE="HTML" --></a> (<!-- TMPL_VAR NAME="weight_total" -->)</li>
+ <!-- /TMPL_LOOP -->
+ </ul>
+ <!-- /TMPL_IF -->
+
+</div>
+</div>
+</div>
+ <div class="yui-b">
+<!-- TMPL_INCLUDE NAME="navigation.inc" -->
+<!-- TMPL_INCLUDE NAME="usermenu.inc" -->
+ </div>
+</div>
+<!-- TMPL_INCLUDE NAME="opac-bottom.inc" -->
diff --git a/opac/opac-tags.pl b/opac/opac-tags.pl
new file mode 100755
index 0000000..0a613d9
--- /dev/null
+++ b/opac/opac-tags.pl
@@ -0,0 +1,154 @@
+#!/usr/bin/perl
+
+# Copyright 2000-2002 Katipo Communications
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA 02111-1307 USA
+
+
+=head1
+
+TODO :: Description here
+
+=cut
+
+use strict;
+use warnings;
+use C4::Auth;
+use C4::Context;
+use C4::Debug;
+use C4::Output;
+use C4::Dates qw(format_date);
+use CGI;
+use C4::Biblio;
+use C4::Tags qw(add_tag get_tags get_tag_rows remove_tag);
+
+my $query = new CGI;
+my %newtags = ();
+my @deltags = ();
+my %counts = ();
+my @errors = ();
+
+# The trick here is to support multiple tags added to multiple bilbios in one POST.
+# So the name of param has to have biblionumber built in.
+# For lack of anything more compelling, we just use "newtag[biblionumber]"
+# We split the value into tags at comma and semicolon
+
+my $openadds = C4::Context->preference('TagsModeration') ? 0 : 1;
+
+unless (C4::Context->preference('TagsEnabled')) {
+ push @errors, {+ tagsdisabled=>1 };
+} else {
+ foreach ($query->param) {
+ if (/^newtag(.*)/) {
+ my $biblionumber = $1;
+ unless ($biblionumber =~ /^\d+$/) {
+ $debug and warn "$_ references non numerical biblionumber '$biblionumber'";
+ push @errors, {+'badparam' => $_ };
+ next;
+ }
+ $newtags{$biblionumber} = $query->param($_);
+ } elsif (/^del(\d+)$/) {
+ push @deltags, $1;
+ }
+ }
+}
+
+my $add_op = (scalar(keys %newtags) + scalar(@deltags)) ? 1 : 0;
+my ($template, $loggedinuser, $cookie) = get_template_and_user({
+ template_name => "opac-tags.tmpl",
+ query => $query,
+ type => "opac",
+ authnotrequired => ($add_op ? 0 : 1), # auth required to add tags
+ debug => 1,
+});
+
+if ($add_op) {
+ unless ($loggedinuser) {
+ push @errors, {+'login' => $_ };
+ %newtags=(); # zero out any attempted additions
+ @deltags=(); # zero out any attempted deletions
+ }
+}
+foreach my $biblionumber (keys %newtags) {
+ my @values = split /[;,]/, $newtags{$biblionumber};
+ foreach (@values) {
+ s/^\s*(.+)\s*$/$1/;
+ my $result;
+ if ($openadds) {
+ $result = add_tag($biblionumber,$_,$loggedinuser,0); # pre-approved
+ } else {
+ $result = add_tag($biblionumber,$_,$loggedinuser);
+ }
+ if ($result) {
+ $counts{$biblionumber}++;
+ } else {
+ warn "add_tag($biblionumber,$_,$loggedinuser...) returned $result";
+ }
+ }
+}
+my $dels = 0;
+foreach (@deltags) {
+ remove_tag($_) and $dels++;
+}
+
+my $results = [];
+my $my_tags = [];
+
+if ($loggedinuser) {
+ $my_tags = get_tag_rows({borrowernumber=>$loggedinuser});
+ foreach (@$my_tags) {
+ my $biblio = GetBiblioData($_->{biblionumber});
+ $_->{bib_summary} = $biblio->{title};
+ ($biblio->{author}) and $_->{bib_summary} .= " by " . $biblio->{author};
+ my $date = $_->{date_created} || '';
+ $date =~ /\s+(\d{2}\:\d{2}\:\d{2})/;
+ $_->{time_created_display} = $1;
+ $_->{date_created_display} = format_date($_->{date_created});
+ }
+}
+
+if ($add_op) {
+ my $adds = 0;
+ for (values %counts) {$adds += $_;}
+ $template->param(
+ add_op => 1,
+ added_count => $adds,
+ deleted_count => $dels,
+ );
+} else {
+ my ($arg,$limit,$tmpresults);
+ my $hardmax = 100; # you might disagree what this value should be, but there definitely should be a max
+ $limit = $query->param('limit') || $hardmax;
+ ($limit =~ /^\d+$/ and $limit <= $hardmax) or $limit = $hardmax;
+ if ($arg = $query->param('tag')) {
+ $tmpresults = get_tags({term => $arg, limit=>$limit, 'sort'=>'-weight'});
+ } elsif ($arg = $query->param('biblionumber')) {
+ $tmpresults = get_tags({biblionumber => $arg, limit=>$limit, 'sort'=>'-weight'});
+ } else {
+ $tmpresults = get_tags({limit=>$limit, 'sort'=>'-weight'});
+ }
+ my %uniq;
+ foreach (@$tmpresults) {
+ $uniq{$_->{term}}++ and next;
+ push @$results, $_;
+ }
+}
+(scalar @errors ) and $template->param(ERRORS => \@errors);
+(scalar @$results) and $template->param(TAGLOOP => $results);
+(scalar @$my_tags) and $template->param(MY_TAGS => $my_tags);
+
+output_html_with_http_headers $query, $cookie, $template->output;
+
--
1.5.2.1
More information about the Koha-patches
mailing list