some fixes & improvements for dictionnary search in librarian interface
authortipaul <tipaul>
Wed, 1 Jun 2005 12:51:02 +0000 (12:51 +0000)
committertipaul <tipaul>
Wed, 1 Jun 2005 12:51:02 +0000 (12:51 +0000)
C4/AuthoritiesMarc.pm
koha-tmpl/intranet-tmpl/default/en/search.marc/dictionary.tmpl
koha-tmpl/intranet-tmpl/default/en/search.marc/search.tmpl
search.marc/dictionary.pl

index 2be1244..c5a9dba 100644 (file)
@@ -64,11 +64,14 @@ sub authoritysearch {
 
        # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
        # the authtypecode. Then, search on $a of this tag_to_report
+       # also store main entry MARC tag, to extract it at end of search
+       my $mainentrytag;
+       my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?");
+       $sth->execute($authtypecode);
+       my ($tag_to_report) = $sth->fetchrow;
+       $mainentrytag = $tag_to_report;
        for (my $i=0;$i<$#{$tags};$i++) {
                if (@$tags[$i] eq "mainentry") {
-                       my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?");
-                       $sth->execute($authtypecode);
-                       my ($tag_to_report) = $sth->fetchrow;
                        @$tags[$i] = $tag_to_report."a";
                }
        }
@@ -87,6 +90,11 @@ sub authoritysearch {
        # Extracts the NOT statements from the list of statements
        for(my $i = 0 ; $i <= $#{$value} ; $i++)
        {
+               # replace * by %
+               @$value[$i] =~ s/\*/%/g;
+               # remove % at the beginning
+               @$value[$i] =~ s/^%//g;
+           @$value[$i] =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\}|\/)/ /g if @$operator[$i] eq "contains";
                if(@$operator[$i] eq "contains") # if operator is contains, splits the words in separate requests
                {
                        foreach my $word (split(/ /, @$value[$i]))
@@ -174,6 +182,8 @@ sub authoritysearch {
                $newline{authid} = $result[$counter];
                $newline{used} = &AUTHcount_usage($result[$counter]);
                $newline{biblio_fields} = $tags_using_authtype;
+               $newline{even} = $counter % 2;
+               $newline{mainentry} = $record->field($mainentrytag)->subfield('a') if $record->field($mainentrytag);
                $counter++;
                push @finalresult, \%newline;
        }
@@ -911,6 +921,9 @@ Paul POULAIN paul.poulain@free.fr
 
 # $Id$
 # $Log$
+# Revision 1.17  2005/06/01 12:51:02  tipaul
+# some fixes & improvements for dictionnary search in librarian interface
+#
 # Revision 1.16  2005/05/04 15:43:43  tipaul
 # synch'ing 2.2 and head
 #
@@ -954,985 +967,3 @@ Paul POULAIN paul.poulain@free.fr
 # Revision 1.1  2004/06/07 07:35:01  tipaul
 # MARC authority management package
 #
-package C4::AuthoritiesMarc;
-# 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
-
-use strict;
-require Exporter;
-use C4::Context;
-use C4::Database;
-use C4::Koha;
-use MARC::Record;
-use C4::Biblio;
-
-use vars qw($VERSION @ISA @EXPORT);
-
-# set the version for version checking
-$VERSION = 0.01;
-
-@ISA = qw(Exporter);
-@EXPORT = qw(
-       &AUTHgettagslib
-       &AUTHfindsubfield
-       &AUTHfind_authtypecode
-
-       &AUTHaddauthority
-       &AUTHmodauthority
-       &AUTHdelauthority
-       &AUTHaddsubfield
-       &AUTHgetauthority
-       
-       &AUTHgetauth_type
-       &AUTHcount_usage
-       
-       &authoritysearch
-       
-       &MARCmodsubfield
-       &AUTHhtml2marc
-       &AUTHaddword
-       &MARCaddword &MARCdelword
-       &char_decode
-       &FindDuplicate
- );
-
-sub authoritysearch {
-       my ($dbh, $tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode) = @_;
-       # build the sql request. She will look like :
-       # select m1.bibid
-       #               from auth_subfield_table as m1, auth_subfield_table as m2
-       #               where m1.authid=m2.authid and
-       #               (m1.subfieldvalue like "Des%" and m2.subfieldvalue like "27%")
-
-       # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
-       # the authtypecode. Then, search on $a of this tag_to_report
-       for (my $i=0;$i<$#{$tags};$i++) {
-               if (@$tags[$i] eq "mainentry") {
-                       my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?");
-                       $sth->execute($authtypecode);
-                       my ($tag_to_report) = $sth->fetchrow;
-                       @$tags[$i] = $tag_to_report."a";
-               }
-       }
-
-       # "Normal" statements
-       # quote marc fields/subfields
-       for (my $i=0;$i<=$#{$tags};$i++) {
-#              warn " $i: ".@$tags[$i];
-               if (@$tags[$i]) {
-                       @$tags[$i] = $dbh->quote(@$tags[$i]);
-#                      warn " $i After process: ".@$tags[$i];
-               }
-       }
-       my @normal_tags = ();
-       my @normal_and_or = ();
-       my @normal_operator = ();
-       my @normal_value = ();
-       # Extracts the NOT statements from the list of statements
-       for(my $i = 0 ; $i <= $#{$value} ; $i++)
-       {
-               if(@$operator[$i] eq "contains") # if operator is contains, splits the words in separate requests
-               {
-                       foreach my $word (split(/ /, @$value[$i]))
-                       {
-                               unless (C4::Context->stopwords->{uc($word)}) {  #it's NOT a stopword => use it. Otherwise, ignore
-                                       my $tag = substr(@$tags[$i],0,3);
-                                       my $subf = substr(@$tags[$i],3,1);
-                                       push @normal_tags, @$tags[$i];
-                                       push @normal_and_or, "and";     # assumes "foo" and "bar" if "foo bar" is entered
-                                       push @normal_operator, @$operator[$i];
-                                       push @normal_value, $word;
-                               }
-                       }
-               }
-               else
-               {
-                       push @normal_tags, @$tags[$i];
-                       push @normal_and_or, @$and_or[$i];
-                       push @normal_operator, @$operator[$i];
-                       push @normal_value, @$value[$i];
-               }
-       }
-
-       # Finds the basic results without the NOT requests
-       my ($sql_tables, $sql_where1, $sql_where2) = create_request($dbh,\@normal_tags, \@normal_and_or, \@normal_operator, \@normal_value);
-
-       my $sth;
-
-       if ($sql_where2) {
-               $sth = $dbh->prepare("select distinct m1.authid from auth_header,$sql_tables where  m1.authid=auth_header.authid and auth_header.authtypecode=? and $sql_where2 and ($sql_where1)");
-               warn "Q2 : select distinct m1.authid from auth_header,$sql_tables where  m1.authid=auth_header.authid and auth_header.authtypecode=? and $sql_where2 and ($sql_where1)";
-       } else {
-               $sth = $dbh->prepare("select distinct m1.authid from auth_header,$sql_tables where  m1.authid=auth_header.authid and auth_header.authtypecode=? and $sql_where1");
-               warn "Q : select distinct m1.authid from auth_header,$sql_tables where  m1.authid=auth_header.authid and auth_header.authtypecode=? and $sql_where1";
-       }
-       $sth->execute($authtypecode);
-       my @result = ();
-       while (my ($authid) = $sth->fetchrow) {
-                       push @result,$authid;
-               }
-
-       # we have authid list. Now, loads summary from [offset] to [offset]+[length]
-       my $counter = $offset;
-       my @finalresult = ();
-       my $oldline;
-       while (($counter <= $#result) && ($counter <= ($offset + $length))) {
-#              warn " HERE : $counter, $#result, $offset, $length";
-               # get MARC::Record of the authority
-               my $record = AUTHgetauthority($dbh,$result[$counter]);
-               # then build the summary
-               my $authtypecode = AUTHfind_authtypecode($dbh,$result[$counter]);
-               my $authref = getauthtype($authtypecode);
-               my $summary = $authref->{summary};
-               my @fields = $record->fields();
-               foreach my $field (@fields) {
-                       my $tag = $field->tag();
-                       if ($tag<10) {
-                       } else {
-                               my @subf = $field->subfields;
-                               for my $i (0..$#subf) {
-                                       my $subfieldcode = $subf[$i][0];
-                                       my $subfieldvalue = $subf[$i][1];
-                                       my $tagsubf = $tag.$subfieldcode;
-                                       $summary =~ s/\[(.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g;
-                               }
-                       }
-               }
-               $summary =~ s/\[(.*?)]//g;
-               $summary =~ s/\n/<br>/g;
-
-               # find biblio MARC field using this authtypecode (to jump to biblio)
-               my $authtypecode = AUTHfind_authtypecode($dbh,$result[$counter]);
-               my $sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?");
-               $sth->execute($authtypecode);
-               my $tags_using_authtype;
-               while (my ($tagfield) = $sth->fetchrow) {
-#                      warn "TAG : $tagfield";
-                       $tags_using_authtype.= $tagfield."9,";
-               }
-               chop $tags_using_authtype;
-               
-               # then add a line for the template loop
-               my %newline;
-               $newline{summary} = $summary;
-               $newline{authid} = $result[$counter];
-               $newline{used} = &AUTHcount_usage($result[$counter]);
-               $newline{biblio_fields} = $tags_using_authtype;
-               $newline{marcrecord} = $record;
-               $counter++;
-               push @finalresult, \%newline;
-       }
-       my $nbresults = $#result + 1;
-       return (\@finalresult, $nbresults);
-}
-
-# Creates the SQL Request
-
-sub create_request {
-       my ($dbh,$tags, $and_or, $operator, $value) = @_;
-
-       my $sql_tables; # will contain marc_subfield_table as m1,...
-       my $sql_where1; # will contain the "true" where
-       my $sql_where2 = "("; # will contain m1.authid=m2.authid
-       my $nb_active=0; # will contain the number of "active" entries. and entry is active is a value is provided.
-       my $nb_table=1; # will contain the number of table. ++ on each entry EXCEPT when an OR  is provided.
-
-
-       for(my $i=0; $i<=@$value;$i++) {
-               if (@$value[$i]) {
-                       $nb_active++;
-#                      warn " @$tags[$i]";
-                       if ($nb_active==1) {
-                               if (@$operator[$i] eq "start") {
-                                       $sql_tables .= "auth_subfield_table as m$nb_table,";
-                                       $sql_where1 .= "(m1.subfieldvalue like ".$dbh->quote("@$value[$i]%");
-                                       if (@$tags[$i]) {
-                                               $sql_where1 .=" and m1.tag+m1.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                               } elsif (@$operator[$i] eq "contains") {        
-                               $sql_tables .= "auth_word as m$nb_table,";
-                                       $sql_where1 .= "(m1.word  like ".$dbh->quote("@$value[$i]%");
-                                       if (@$tags[$i]) {
-                                                $sql_where1 .=" and m1.tagsubfield in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                               } else {
-
-                                       $sql_tables .= "auth_subfield_table as m$nb_table,";
-                                       $sql_where1 .= "(m1.subfieldvalue @$operator[$i] ".$dbh->quote("@$value[$i]");
-                                       if (@$tags[$i]) {
-                                                $sql_where1 .=" and m1.tag+m1.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                               }
-                       } else {
-                               if (@$operator[$i] eq "start") {
-                                       $nb_table++;
-                                       $sql_tables .= "auth_subfield_table as m$nb_table,";
-                                       $sql_where1 .= "@$and_or[$i] (m$nb_table.subfieldvalue like ".$dbh->quote("@$value[$i]%");
-                                       if (@$tags[$i]) {
-                                               $sql_where1 .=" and m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                                       $sql_where2 .= "m1.authid=m$nb_table.authid and ";
-                               } elsif (@$operator[$i] eq "contains") {
-                                       if (@$and_or[$i] eq 'and') {
-                                               $nb_table++;
-                                               $sql_tables .= "auth_word as m$nb_table,";
-                                               $sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
-                                               if (@$tags[$i]) {
-                                                       $sql_where1 .=" and m$nb_table.tagsubfield in(@$tags[$i])";
-                                               }
-                                               $sql_where1.=")";
-                                               $sql_where2 .= "m1.authid=m$nb_table.authid and ";
-                                       } else {
-                                               $sql_where1 .= "@$and_or[$i] (m$nb_table.word like ".$dbh->quote("@$value[$i]%");
-                                               if (@$tags[$i]) {
-                                                       $sql_where1 .="  and m$nb_table.tag+m$nb_table.subfieldid in (@$tags[$i])";
-                                               }
-                                               $sql_where1.=")";
-                                               $sql_where2 .= "m1.authid=m$nb_table.authid and ";
-                                       }
-                               } else {
-                                       $nb_table++;
-                                       $sql_tables .= "auth_subfield_table as m$nb_table,";
-                                       $sql_where1 .= "@$and_or[$i] (m$nb_table.subfieldvalue @$operator[$i] ".$dbh->quote(@$value[$i]);
-                                       if (@$tags[$i]) {
-                                               $sql_where1 .="  and m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where2 .= "m1.authid=m$nb_table.authid and ";
-                                       $sql_where1.=")";
-                               }
-                       }
-               }
-       }
-
-       if($sql_where2 ne "(")  # some datas added to sql_where2, processing
-       {
-               $sql_where2 = substr($sql_where2, 0, (length($sql_where2)-5)); # deletes the trailing ' and '
-               $sql_where2 .= ")";
-       }
-       else    # no sql_where2 statement, deleting '('
-       {
-               $sql_where2 = "";
-       }
-       chop $sql_tables;       # deletes the trailing ','
-       
-       return ($sql_tables, $sql_where1, $sql_where2);
-}
-
-
-sub AUTHcount_usage {
-       my ($authid) = @_;
-       my $dbh = C4::Context->dbh;
-       # find MARC fields using this authtype
-       my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
-       my $sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?");
-       $sth->execute($authtypecode);
-       my $tags_using_authtype;
-       while (my ($tagfield) = $sth->fetchrow) {
-#              warn "TAG : $tagfield";
-               $tags_using_authtype.= "'".$tagfield."9',";
-       }
-       chop $tags_using_authtype;
-       if ($tags_using_authtype) {
-               $sth = $dbh->prepare("select count(*) from marc_subfield_table where concat(tag,subfieldcode) in ($tags_using_authtype) and subfieldvalue=?");
-       } else {
-               $sth = $dbh->prepare("select count(*) from marc_subfield_table where subfieldvalue=?");
-       }
-#      warn "Q : select count(*) from marc_subfield_table where concat(tag,subfieldcode) in ($tags_using_authtype) and subfieldvalue=$authid";
-       $sth->execute($authid);
-       my ($result) = $sth->fetchrow;
-#      warn "Authority $authid TOTAL USED : $result";
-       return $result;
-}
-
-# merging 2 authority entries. After a merge, the "from" can be deleted.
-# sub AUTHmerge {
-#      my ($auth_merge_from,$auth_merge_to) = @_;
-#      my $dbh = C4::Context->dbh;
-#      # find MARC fields using this authtype
-#      my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
-#      # retrieve records
-#      my $record_from = AUTHgetauthority($dbh,$auth_merge_from);
-#      my $record_to = AUTHgetauthority($dbh,$auth_merge_to);
-#      my $sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?");
-#      $sth->execute($authtypecode);
-#      my $tags_using_authtype;
-#      while (my ($tagfield) = $sth->fetchrow) {
-#              warn "TAG : $tagfield";
-#              $tags_using_authtype.= "'".$tagfield."9',";
-#      }
-#      chop $tags_using_authtype;
-#      # now, find every biblio using this authority
-#      $sth = $dbh->prepare("select bibid,tag,tag_indicator,tagorder from marc_subfield_table where tag+subfieldid in ($tags_using_authtype) and subfieldvalue=?");
-#      $sth->execute($authid);
-#      # and delete entries before recreating them
-#      while (my ($bibid,$tag,$tag_indicator,$tagorder) = $sth->fetchrow) {
-#              &MARCdelsubfield($dbh,$bibid,$tag);
-#              
-#      }
-# 
-# }
-
-sub AUTHfind_authtypecode {
-       my ($dbh,$authid) = @_;
-       my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?");
-       $sth->execute($authid);
-       my ($authtypecode) = $sth->fetchrow;
-       return $authtypecode;
-}
-
-sub AUTHgettagslib {
-       my ($dbh,$forlibrarian,$authtypecode)= @_;
-       $authtypecode="" unless $authtypecode;
-       my $sth;
-       my $libfield = ($forlibrarian eq 1)? 'liblibrarian' : 'libopac';
-       # check that framework exists
-       $sth=$dbh->prepare("select count(*) from auth_tag_structure where authtypecode=?");
-       $sth->execute($authtypecode);
-       my ($total) = $sth->fetchrow;
-       $authtypecode="" unless ($total >0);
-       $sth=$dbh->prepare("select tagfield,$libfield as lib,mandatory,repeatable from auth_tag_structure where authtypecode=? order by tagfield");
-       $sth->execute($authtypecode);
-       my ($lib,$tag,$res,$tab,$mandatory,$repeatable);
-       while ( ($tag,$lib,$mandatory,$repeatable) = $sth->fetchrow) {
-               $res->{$tag}->{lib}=$lib;
-               $res->{$tab}->{tab}=""; # XXX
-               $res->{$tag}->{mandatory}=$mandatory;
-               $res->{$tag}->{repeatable}=$repeatable;
-       }
-
-       $sth=$dbh->prepare("select tagfield,tagsubfield,$libfield as lib,tab, mandatory, repeatable,authorised_value,value_builder,seealso from auth_subfield_structure where authtypecode=? order by tagfield,tagsubfield");
-       $sth->execute($authtypecode);
-
-       my $subfield;
-       my $authorised_value;
-       my $thesaurus_category;
-       my $value_builder;
-       my $kohafield;
-       my $seealso;
-       my $hidden;
-       my $isurl;
-       while ( ($tag, $subfield, $lib, $tab, $mandatory, $repeatable,$authorised_value,$value_builder,$seealso) = $sth->fetchrow) {
-               $res->{$tag}->{$subfield}->{lib}=$lib;
-               $res->{$tag}->{$subfield}->{tab}=$tab;
-               $res->{$tag}->{$subfield}->{mandatory}=$mandatory;
-               $res->{$tag}->{$subfield}->{repeatable}=$repeatable;
-               $res->{$tag}->{$subfield}->{authorised_value}=$authorised_value;
-               $res->{$tag}->{$subfield}->{thesaurus_category}=$thesaurus_category;
-               $res->{$tag}->{$subfield}->{value_builder}=$value_builder;
-               $res->{$tag}->{$subfield}->{seealso}=$seealso;
-               $res->{$tag}->{$subfield}->{hidden}=$hidden;
-               $res->{$tag}->{$subfield}->{isurl}=$isurl;
-       }
-       return $res;
-}
-
-sub AUTHaddauthority {
-# pass the MARC::Record to this function, and it will create the records in the marc tables
-       my ($dbh,$record,$authid,$authtypecode) = @_;
-       my @fields=$record->fields();
-#      warn "IN AUTHaddauthority $authid => ".$record->as_formatted;
-# adding main table, and retrieving authid
-# if authid is sent, then it's not a true add, it's only a re-add, after a delete (ie, a mod)
-# if authid empty => true add, find a new authid number
-       unless ($authid) {
-               $dbh->do("lock tables auth_header WRITE,auth_subfield_table WRITE, auth_word WRITE, stopwords READ");
-               my $sth=$dbh->prepare("insert into auth_header (datecreated,authtypecode) values (now(),?)");
-               $sth->execute($authtypecode);
-               $sth=$dbh->prepare("select max(authid) from auth_header");
-               $sth->execute;
-               ($authid)=$sth->fetchrow;
-               $sth->finish;
-       }
-       my $fieldcount=0;
-       # now, add subfields...
-       foreach my $field (@fields) {
-               $fieldcount++;
-               if ($field->tag() <10) {
-                               &AUTHaddsubfield($dbh,$authid,
-                                               $field->tag(),
-                                               '',
-                                               $fieldcount,
-                                               '',
-                                               1,
-                                               $field->data()
-                                               );
-               } else {
-                       my @subfields=$field->subfields();
-                       foreach my $subfieldcount (0..$#subfields) {
-                               &AUTHaddsubfield($dbh,$authid,
-                                               $field->tag(),
-                                               $field->indicator(1).$field->indicator(2),
-                                               $fieldcount,
-                                               $subfields[$subfieldcount][0],
-                                               $subfieldcount+1,
-                                               $subfields[$subfieldcount][1]
-                                               );
-                       }
-               }
-       }
-       $dbh->do("unlock tables");
-       return $authid;
-}
-
-
-sub AUTHaddsubfield {
-# Add a new subfield to a tag into the DB.
-       my ($dbh,$authid,$tagid,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalues) = @_;
-       # if not value, end of job, we do nothing
-       if (length($subfieldvalues) ==0) {
-               return;
-       }
-       if (not($subfieldcode)) {
-               $subfieldcode=' ';
-       }
-       my @subfieldvalues = split /\|/,$subfieldvalues;
-       foreach my $subfieldvalue (@subfieldvalues) {
-               my $sth=$dbh->prepare("insert into auth_subfield_table (authid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)");
-               $sth->execute($authid,(sprintf "%03s",$tagid),$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue);
-               if ($sth->errstr) {
-                       warn "ERROR ==> insert into auth_subfield_table (authid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($authid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
-               }
-               &AUTHaddword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
-       }
-}
-
-sub AUTHgetauthority {
-# Returns MARC::Record of the biblio passed in parameter.
-    my ($dbh,$authid)=@_;
-    my $record = MARC::Record->new();
-#---- TODO : the leader is missing
-       $record->leader('                        ');
-    my $sth=$dbh->prepare("select authid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue
-                                from auth_subfield_table
-                                where authid=? order by tag,tagorder,subfieldcode
-                        ");
-       $sth->execute($authid);
-       my $prevtagorder=1;
-       my $prevtag='XXX';
-       my $previndicator;
-       my $field; # for >=10 tags
-       my $prevvalue; # for <10 tags
-       while (my $row=$sth->fetchrow_hashref) {
-               if ($row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag) {
-                       $previndicator.="  ";
-                       if ($prevtag <10) {
-                       $record->add_fields((sprintf "%03s",$prevtag),$prevvalue) unless $prevtag eq "XXX"; # ignore the 1st loop
-                       } else {
-                               $record->add_fields($field) unless $prevtag eq "XXX";
-                       }
-                       undef $field;
-                       $prevtagorder=$row->{tagorder};
-                       $prevtag = $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-                       if ($row->{tag}<10) {
-                               $prevvalue = $row->{subfieldvalue};
-                       } else {
-                               $field = MARC::Field->new((sprintf "%03s",$prevtag), substr($row->{tag_indicator}.'  ',0,1), substr($row->{tag_indicator}.'  ',1,1), $row->{'subfieldcode'}, $row->{'subfieldvalue'} );
-                       }
-               } else {
-                       if ($row->{tag} <10) {
-                               $record->add_fields((sprintf "%03s",$row->{tag}), $row->{'subfieldvalue'});
-                       } else {
-                               $field->add_subfields($row->{'subfieldcode'}, $row->{'subfieldvalue'} );
-                       }
-                       $prevtag= $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-               }
-       }
-       # the last has not been included inside the loop... do it now !
-       if ($prevtag ne "XXX") { # check that we have found something. Otherwise, prevtag is still XXX and we
-                                               # must return an empty record, not make MARC::Record fail because we try to
-                                               # create a record with XXX as field :-(
-               if ($prevtag <10) {
-                       $record->add_fields($prevtag,$prevvalue);
-               } else {
-       #               my $field = MARC::Field->new( $prevtag, "", "", %subfieldlist);
-                       $record->add_fields($field);
-               }
-       }
-       return $record;
-}
-
-sub AUTHgetauth_type {
-       my ($authtypecode) = @_;
-       my $dbh=C4::Context->dbh;
-       my $sth=$dbh->prepare("select * from auth_types where authtypecode=?");
-       $sth->execute($authtypecode);
-       return $sth->fetchrow_hashref;
-}
-sub AUTHmodauthority {
-       my ($dbh,$authid,$record,$delete)=@_;
-       my $oldrecord=&AUTHgetauthority($dbh,$authid);
-       if ($oldrecord eq $record) {
-               return;
-       }
-# 1st delete the authority,
-# 2nd recreate it
-       &AUTHdelauthority($dbh,$authid,1);
-       &AUTHaddauthority($dbh,$record,$authid,AUTHfind_authtypecode($dbh,$authid));
-       # save the file in localfile/modified_authorities
-       my $filename = C4::Context->config("intranetdir")."/localfile/modified_authorities/$authid.authid";
-       open AUTH, "> $filename";
-       print AUTH $authid;
-       close AUTH;
-}
-
-sub AUTHdelauthority {
-       my ($dbh,$authid,$keep_biblio) = @_;
-# if the keep_biblio is set to 1, then authority entries in biblio are preserved.
-# This flag is set when the delauthority is called by modauthority
-# due to a too complex structure of MARC (repeatable fields and subfields),
-# the best solution for a modif is to delete / recreate the record.
-
-       my $record = AUTHgetauthority($dbh,$authid);
-       $dbh->do("delete from auth_header where authid=$authid") unless $keep_biblio;
-       $dbh->do("delete from auth_subfield_table where authid=$authid");
-       $dbh->do("delete from auth_word where authid=$authid");
-# FIXME : delete or not in biblio tables (depending on $keep_biblio flag)
-}
-
-sub AUTHmodsubfield {
-# Subroutine changes a subfield value given a subfieldid.
-       my ($dbh, $subfieldid, $subfieldvalue )=@_;
-       $dbh->do("lock tables auth_subfield_table WRITE");
-       my $sth=$dbh->prepare("update auth_subfield_table set subfieldvalue=? where subfieldid=?");
-       $sth->execute($subfieldvalue, $subfieldid);
-       $dbh->do("unlock tables");
-       $sth->finish;
-       $sth=$dbh->prepare("select authid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from auth_subfield_table where subfieldid=?");
-       $sth->execute($subfieldid);
-       my ($authid,$tagid,$tagorder,$subfieldcode,$x,$subfieldorder) = $sth->fetchrow;
-       $subfieldid=$x;
-       &AUTHdelword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder);
-       &AUTHaddword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
-       return($subfieldid, $subfieldvalue);
-}
-
-sub AUTHfindsubfield {
-    my ($dbh,$authid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
-    my $resultcounter=0;
-    my $subfieldid;
-    my $lastsubfieldid;
-    my $query="select subfieldid from auth_subfield_table where authid=? and tag=? and subfieldcode=?";
-    my @bind_values = ($authid,$tag, $subfieldcode);
-    if ($subfieldvalue) {
-       $query .= " and subfieldvalue=?";
-       push(@bind_values,$subfieldvalue);
-    } else {
-       if ($subfieldorder<1) {
-           $subfieldorder=1;
-       }
-       $query .= " and subfieldorder=?";
-       push(@bind_values,$subfieldorder);
-    }
-    my $sti=$dbh->prepare($query);
-    $sti->execute(@bind_values);
-    while (($subfieldid) = $sti->fetchrow) {
-       $resultcounter++;
-       $lastsubfieldid=$subfieldid;
-    }
-    if ($resultcounter>1) {
-               # Error condition.  Values given did not resolve into a unique record.  Don't know what to edit
-               # should rarely occur (only if we use subfieldvalue with a value that exists twice, which is strange)
-               return -1;
-    } else {
-               return $lastsubfieldid;
-    }
-}
-
-sub AUTHfindsubfieldid {
-       my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-       my $sth=$dbh->prepare("select subfieldid from auth_subfield_table
-                               where authid=? and tag=? and tagorder=?
-                                       and subfieldcode=? and subfieldorder=?");
-       $sth->execute($authid,$tag,$tagorder,$subfield,$subfieldorder);
-       my ($res) = $sth->fetchrow;
-       unless ($res) {
-               $sth=$dbh->prepare("select subfieldid from auth_subfield_table
-                               where authid=? and tag=? and tagorder=?
-                                       and subfieldcode=?");
-               $sth->execute($authid,$tag,$tagorder,$subfield);
-               ($res) = $sth->fetchrow;
-       }
-    return $res;
-}
-
-sub AUTHfind_authtypecode {
-       my ($dbh,$authid) = @_;
-       my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?");
-       $sth->execute($authid);
-       my ($authtypecode) = $sth->fetchrow;
-       return $authtypecode;
-}
-
-sub AUTHdelsubfield {
-# delete a subfield for $authid / tag / tagorder / subfield / subfieldorder
-    my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    $dbh->do("delete from auth_subfield_table where authid='$authid' and
-                       tag='$tag' and tagorder='$tagorder'
-                       and subfieldcode='$subfield' and subfieldorder='$subfieldorder'
-                       ");
-}
-
-sub AUTHhtml2marc {
-       my ($dbh,$rtags,$rsubfields,$rvalues,%indicators) = @_;
-       my $prevtag = -1;
-       my $record = MARC::Record->new();
-#      my %subfieldlist=();
-       my $prevvalue; # if tag <10
-       my $field; # if tag >=10
-       for (my $i=0; $i< @$rtags; $i++) {
-               # rebuild MARC::Record
-               if (@$rtags[$i] ne $prevtag) {
-                       if ($prevtag < 10) {
-                               if ($prevvalue) {
-                                       $record->add_fields((sprintf "%03s",$prevtag),$prevvalue);
-                               }
-                       } else {
-                               if ($field) {
-                                       $record->add_fields($field);
-                               }
-                       }
-                       $indicators{@$rtags[$i]}.='  ';
-                       if (@$rtags[$i] <10) {
-                               $prevvalue= @$rvalues[$i];
-                       } else {
-                               $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]), substr($indicators{@$rtags[$i]},0,1),substr($indicators{@$rtags[$i]},1,1), @$rsubfields[$i] => @$rvalues[$i]);
-                       }
-                       $prevtag = @$rtags[$i];
-               } else {
-                       if (@$rtags[$i] <10) {
-                               $prevvalue=@$rvalues[$i];
-                       } else {
-                               if (@$rvalues[$i]) {
-                                       $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]);
-                               }
-                       }
-                       $prevtag= @$rtags[$i];
-               }
-       }
-       # the last has not been included inside the loop... do it now !
-       $record->add_fields($field);
-#      warn $record->as_formatted;
-       return $record;
-}
-
-sub AUTHaddword {
-# split a subfield string and adds it into the word table.
-# removes stopwords
-    my ($dbh,$authid,$tag,$tagorder,$subfieldid,$subfieldorder,$sentence) =@_;
-    $sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\})/ /g;
-    my @words = split / /,$sentence;
-    my $stopwords= C4::Context->stopwords;
-    my $sth=$dbh->prepare("insert into auth_word (authid, tagsubfield, tagorder, subfieldorder, word, sndx_word)
-                       values (?,concat(?,?),?,?,?,soundex(?))");
-    foreach my $word (@words) {
-# we record only words longer than 2 car and not in stopwords hash
-       if (length($word)>2 and !($stopwords->{uc($word)})) {
-           $sth->execute($authid,$tag,$subfieldid,$tagorder,$subfieldorder,$word,$word);
-           if ($sth->err()) {
-               warn "ERROR ==> insert into auth_word (authid, tagsubfield, tagorder, subfieldorder, word, sndx_word) values ($authid,concat($tag,$subfieldid),$tagorder,$subfieldorder,$word,soundex($word))\n";
-           }
-       }
-    }
-}
-
-sub AUTHdelword {
-# delete words. this sub deletes all the words from a sentence. a subfield modif is done by a delete then a add
-    my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    my $sth=$dbh->prepare("delete from auth_word where authid=? and tagsubfield=concat(?,?) and tagorder=? and subfieldorder=?");
-    $sth->execute($authid,$tag,$subfield,$tagorder,$subfieldorder);
-}
-
-sub char_decode {
-       # converts ISO 5426 coded string to ISO 8859-1
-       # sloppy code : should be improved in next issue
-       my ($string,$encoding) = @_ ;
-       $_ = $string ;
-#      $encoding = C4::Context->preference("marcflavour") unless $encoding;
-       if ($encoding eq "UNIMARC") {
-               s/\xe1/Æ/gm ;
-               s/\xe2/Ð/gm ;
-               s/\xe9/Ø/gm ;
-               s/\xec/þ/gm ;
-               s/\xf1/æ/gm ;
-               s/\xf3/ð/gm ;
-               s/\xf9/ø/gm ;
-               s/\xfb/ß/gm ;
-               s/\xc1\x61/à/gm ;
-               s/\xc1\x65/è/gm ;
-               s/\xc1\x69/ì/gm ;
-               s/\xc1\x6f/ò/gm ;
-               s/\xc1\x75/ù/gm ;
-               s/\xc1\x41/À/gm ;
-               s/\xc1\x45/È/gm ;
-               s/\xc1\x49/Ì/gm ;
-               s/\xc1\x4f/Ò/gm ;
-               s/\xc1\x55/Ù/gm ;
-               s/\xc2\x41/Á/gm ;
-               s/\xc2\x45/É/gm ;
-               s/\xc2\x49/Í/gm ;
-               s/\xc2\x4f/Ó/gm ;
-               s/\xc2\x55/Ú/gm ;
-               s/\xc2\x59/Ý/gm ;
-               s/\xc2\x61/á/gm ;
-               s/\xc2\x65/é/gm ;
-               s/\xc2\x69/í/gm ;
-               s/\xc2\x6f/ó/gm ;
-               s/\xc2\x75/ú/gm ;
-               s/\xc2\x79/ý/gm ;
-               s/\xc3\x41/Â/gm ;
-               s/\xc3\x45/Ê/gm ;
-               s/\xc3\x49/Î/gm ;
-               s/\xc3\x4f/Ô/gm ;
-               s/\xc3\x55/Û/gm ;
-               s/\xc3\x61/â/gm ;
-               s/\xc3\x65/ê/gm ;
-               s/\xc3\x69/î/gm ;
-               s/\xc3\x6f/ô/gm ;
-               s/\xc3\x75/û/gm ;
-               s/\xc4\x41/Ã/gm ;
-               s/\xc4\x4e/Ñ/gm ;
-               s/\xc4\x4f/Õ/gm ;
-               s/\xc4\x61/ã/gm ;
-               s/\xc4\x6e/ñ/gm ;
-               s/\xc4\x6f/õ/gm ;
-               s/\xc8\x45/Ë/gm ;
-               s/\xc8\x49/Ï/gm ;
-               s/\xc8\x65/ë/gm ;
-               s/\xc8\x69/ï/gm ;
-               s/\xc8\x76/ÿ/gm ;
-               s/\xc9\x41/Ä/gm ;
-               s/\xc9\x4f/Ö/gm ;
-               s/\xc9\x55/Ü/gm ;
-               s/\xc9\x61/ä/gm ;
-               s/\xc9\x6f/ö/gm ;
-               s/\xc9\x75/ü/gm ;
-               s/\xca\x41/Å/gm ;
-               s/\xca\x61/å/gm ;
-               s/\xd0\x43/Ç/gm ;
-               s/\xd0\x63/ç/gm ;
-               # this handles non-sorting blocks (if implementation requires this)
-               $string = nsb_clean($_) ;
-       } elsif ($encoding eq "USMARC" || $encoding eq "MARC21") {
-               if(/[\xc1-\xff]/) {
-                       s/\xe1\x61/à/gm ;
-                       s/\xe1\x65/è/gm ;
-                       s/\xe1\x69/ì/gm ;
-                       s/\xe1\x6f/ò/gm ;
-                       s/\xe1\x75/ù/gm ;
-                       s/\xe1\x41/À/gm ;
-                       s/\xe1\x45/È/gm ;
-                       s/\xe1\x49/Ì/gm ;
-                       s/\xe1\x4f/Ò/gm ;
-                       s/\xe1\x55/Ù/gm ;
-                       s/\xe2\x41/Á/gm ;
-                       s/\xe2\x45/É/gm ;
-                       s/\xe2\x49/Í/gm ;
-                       s/\xe2\x4f/Ó/gm ;
-                       s/\xe2\x55/Ú/gm ;
-                       s/\xe2\x59/Ý/gm ;
-                       s/\xe2\x61/á/gm ;
-                       s/\xe2\x65/é/gm ;
-                       s/\xe2\x69/í/gm ;
-                       s/\xe2\x6f/ó/gm ;
-                       s/\xe2\x75/ú/gm ;
-                       s/\xe2\x79/ý/gm ;
-                       s/\xe3\x41/Â/gm ;
-                       s/\xe3\x45/Ê/gm ;
-                       s/\xe3\x49/Î/gm ;
-                       s/\xe3\x4f/Ô/gm ;
-                       s/\xe3\x55/Û/gm ;
-                       s/\xe3\x61/â/gm ;
-                       s/\xe3\x65/ê/gm ;
-                       s/\xe3\x69/î/gm ;
-                       s/\xe3\x6f/ô/gm ;
-                       s/\xe3\x75/û/gm ;
-                       s/\xe4\x41/Ã/gm ;
-                       s/\xe4\x4e/Ñ/gm ;
-                       s/\xe4\x4f/Õ/gm ;
-                       s/\xe4\x61/ã/gm ;
-                       s/\xe4\x6e/ñ/gm ;
-                       s/\xe4\x6f/õ/gm ;
-                       s/\xe8\x45/Ë/gm ;
-                       s/\xe8\x49/Ï/gm ;
-                       s/\xe8\x65/ë/gm ;
-                       s/\xe8\x69/ï/gm ;
-                       s/\xe8\x76/ÿ/gm ;
-                       s/\xe9\x41/Ä/gm ;
-                       s/\xe9\x4f/Ö/gm ;
-                       s/\xe9\x55/Ü/gm ;
-                       s/\xe9\x61/ä/gm ;
-                       s/\xe9\x6f/ö/gm ;
-                       s/\xe9\x75/ü/gm ;
-                       s/\xea\x41/Å/gm ;
-                       s/\xea\x61/å/gm ;
-                       # this handles non-sorting blocks (if implementation requires this)
-                       $string = nsb_clean($_) ;
-               }
-       }
-       return($string) ;
-}
-
-sub nsb_clean {
-       my $NSB = '\x88' ;              # NSB : begin Non Sorting Block
-       my $NSE = '\x89' ;              # NSE : Non Sorting Block end
-       # handles non sorting blocks
-       my ($string) = @_ ;
-       $_ = $string ;
-       s/$NSB/(/gm ;
-       s/[ ]{0,1}$NSE/) /gm ;
-       $string = $_ ;
-       return($string) ;
-}
-
-sub FindDuplicate {
-       my ($record,$authtypecode)=@_;
-       my $dbh = C4::Context->dbh;
-       
-#      warn "".$record->as_formatted;
-       # search duplicate on ISBN, easy and fast...
-       my $sth = $dbh->prepare("select auth_tag_to_report,summary from auth_types where authtypecode=?");
-       $sth->execute($authtypecode);
-       my ($auth_tag_to_report,$taglist) = $sth->fetchrow;
-       $sth->finish;
-       # a more complex search : build a request for authoritysearch
-       my (@tags, @and_or, @excluding, @operator, @value, $offset, $length);
-       # search on biblio.title
-#      warn " tag a reporter : $auth_tag_to_report";
-       warn "taglist ".$taglist;
-       my @subfield = split /\[/,  $taglist;
-       my $max = @subfield;
-       for (my $i=1; $i<$max;$i++){
-               warn " ".$subfield[$i];
-               $subfield[$i]=substr($subfield[$i],3,1);
-               warn " ".$subfield[$i];
-       }
-       
-       if ($record->fields($auth_tag_to_report)) {
-#              foreach my $subfieldcount (1..$#subfield){
-#                      if ($record->field($auth_tag_to_report)->subfields($subfield[$subfieldcount])) {
-# #                            warn "tag :".$tag." subfield: $subfield value : ".$record->field($tag)->subfield($subfield);
-#                              push @tags, $auth_tag_to_report.$subfield[$subfieldcount];
-# #                            warn "'".$tag.$subfield."' value :". $record->field($tag)->subfield($subfield);
-#                              push @and_or, "and";
-#                              push @excluding, "";
-#                              push @operator, "contains";
-#                              push @value, $record->field($auth_tag_to_report)->subfield($subfield[$subfieldcount]);
-#                      }
-#              }
-               
-               my $sth = $dbh->prepare("select tagfield,tagsubfield from auth_subfield_structure where tagfield=? and authtypecode=? ");
-               $sth->execute($auth_tag_to_report,$authtypecode);
- #             warn " field $auth_tag_to_report exists";
-               while (my ($tag,$subfield) = $sth->fetchrow){
-                       if ($record->field($tag)->subfield($subfield)) {
- #                             warn "tag :".$tag." subfield: $subfield value : ".$record->field($tag)->subfield($subfield);
-                               push @tags, $tag.$subfield;
- #                             warn "'".$tag.$subfield."' value :". $record->field($tag)->subfield($subfield);
-                               push @and_or, "and";
-                               push @excluding, "";
-                               push @operator, "contains";
-                               push @value, $record->field($tag)->subfield($subfield);
-                       }
-               }
-       }
-       my ($finalresult,$nbresult) = authoritysearch($dbh,\@tags,\@and_or,\@excluding,\@operator,\@value,0,10,$authtypecode);
-       # there is at least 1 result => return the 1st one
-       if ($nbresult) {
-               warn "$nbresult => ".@$finalresult[0]->{authid},$record->field($auth_tag_to_report)->subfield('a');
-               return @$finalresult[0]->{authid},@$finalresult[0]->{authid},$record->field($auth_tag_to_report)->subfield('a');
-       }
-       # no result, returns nothing
-       return;
-}
-
-END { }       # module clean-up code here (global destructor)
-
-=back
-
-=head1 AUTHOR
-
-Koha Developement team <info@koha.org>
-
-Paul POULAIN paul.poulain@free.fr
-
-=cut
-
-# $Id$
-# $Log$
-# Revision 1.16  2005/05/04 15:43:43  tipaul
-# synch'ing 2.2 and head
-#
-# Revision 1.15  2005/05/04 14:18:39  hdl
-# adding Marc Record to authoritysearch report
-#
-# Revision 1.14  2005/04/05 17:07:46  hdl
-# Scanning every the Subfields of auth_tag_to_report for FindDuplicate
-#
-# Revision 1.13  2005/04/05 15:23:41  hdl
-# Searching for double entries when adding a new authority.
-#
-# Revision 1.12  2005/04/05 09:58:48  hdl
-# Adding double authority search before creating a new authority
-#
-# Revision 1.11  2005/03/07 08:55:29  tipaul
-# synch'ing with 2.2
-#
-# Revision 1.9.2.2  2005/02/28 14:03:13  tipaul
-# * adding search on "main entry" (ie $a subfield) on a given authority (the "search everywhere" field is still here).
-# * adding a select box to requet "contain" or "begin with" search.
-# * fixing some bug in authority search (related to "main entry" search)
-#
-# Revision 1.9.2.1  2005/02/24 13:12:13  tipaul
-# saving authority modif in a text file. This will be used soon with another script (in crontab). The script in crontab will retrieve every authorityid in the directory localfile/authorities and modify every biblio using this authority. Those modifs may be long. So they can't be done through http, because we may encounter a webserver timeout, and kill the process before end of the job.
-# So, it will be done through a cron job.
-# (/me agree we need some doc for command line scripts)
-#
-# Revision 1.9  2004/12/23 09:48:11  tipaul
-# Minor changes in summary "exploding" (the 3 digits AFTER the subfield were not on the right place).
-#
-# Revision 1.8  2004/11/05 10:11:39  tipaul
-# export auth_count_usage (bugfix)
-#
-# Revision 1.7  2004/09/23 16:13:00  tipaul
-# Bugfix in modification
-#
-# Revision 1.6  2004/08/18 16:00:24  tipaul
-# fixes for authorities management
-#
-# Revision 1.5  2004/07/05 13:37:22  doxulting
-# First step for working authorities
-#
-# Revision 1.4  2004/06/22 11:35:37  tipaul
-# removing % at the beginning of a string to avoid loooonnnngggg searchs
-#
-# Revision 1.3  2004/06/17 08:02:13  tipaul
-# merging tag & subfield in auth_word for better perfs
-#
-# Revision 1.2  2004/06/10 08:29:01  tipaul
-# MARC authority management (continued)
-#
-# Revision 1.1  2004/06/07 07:35:01  tipaul
-# MARC authority management package
-#
index f089b7e..298523b 100644 (file)
@@ -52,9 +52,9 @@ a.catalogue:hover {
        </form>
 
 <!-- TMPL_IF Name=search -->
-       <div class="bloc100">
-               <h2 class="catalogue">Dictionary Search results</h2>
-               <!-- TMPL_IF NAME="authresult" -->
+       <div class="bloc25">
+       <h2 class="catalogue">Dictionary Search results</h2>
+       <!-- TMPL_IF NAME="authresult" -->
                <div id="resultnumber">
                        <p><!-- TMPL_IF NAME="displayprev" --> 
                                        <a class="resultnumber" href="dictionary.pl?startfrom=<!-- TMPL_VAR NAME="startfromprev" -->&amp;marclist=<!-- TMPL_VAR NAME="marclist" ESCAPE=URL-->&amp;search=<!-- TMPL_VAR NAME="search" ESCAPE=URL-->&amp;resultsperpage=<!-- TMPL_VAR NAME="resultsperpage" -->&amp;type=intranet&amp;op=do_search&amp;index=<!-- TMPL_VAR Name="anindex" -->">&lt;&lt;Previous</a>
@@ -83,16 +83,32 @@ a.catalogue:hover {
                                </tr>
                                <tr>
                                        <th class="catalogue">Summary</th>
-                                       <th class="catalogue">Used</th>
+                                       <th class="catalogue">Used in</th>
                                        <th class="catalogue">Select</th>
                                </tr>
                                <!-- TMPL_LOOP NAME="authresult" -->
                                        <tr>
-                                               <td><!-- TMPL_VAR NAME="summary" --></td>
-                                               <td>
-                                                       <a href="../search.marc/search.pl?type=intranet&amp;op=do_search&amp;marclist=<!-- TMPL_VAR NAME="biblio_fields" -->&amp;operator==&amp;value=<!-- TMPL_VAR NAME="authid" -->&amp;and_or=and&amp;excluding=" class="button catalogue"><!-- TMPL_VAR NAME="used" --> biblio(s)
-                                               <td><img src="/images/arrow.gif" width="32" hspace="0" vspace="0" border="0">
+                                               <!-- TMPL_IF NAME="even" -->
+                                                       <td class="hilighted">
+                                               <!-- TMPL_ELSE -->
+                                                       <td>
+                                               <!-- /TMPL_IF -->
+                                                       <!-- TMPL_VAR NAME="summary" -->
                                                </td>
+                                               <!-- TMPL_IF NAME="even" -->
+                                                       <td class="hilighted">
+                                               <!-- TMPL_ELSE -->
+                                                       <td>
+                                               <!-- /TMPL_IF -->
+                                                       <!-- TMPL_VAR NAME="used" --> biblio(s)
+                                               </td>
+                                               <!-- TMPL_IF NAME="even" -->
+                                                       <td class="hilighted">
+                                               <!-- TMPL_ELSE -->
+                                                       <td>
+                                               <!-- /TMPL_IF -->
+                                                       <a  href="javascript:SelectEntry('<!-- TMPL_VAR NAME="mainentry" ESCAPE="URL" -->',<!-- TMPL_VAR NAME="anindex" ESCAPE="URL"  -->,0)" class="button catalogue">select</a>
+                                                       <a  href="javascript:SelectEntry('<!-- TMPL_VAR NAME="mainentry" ESCAPE="URL" -->',<!-- TMPL_VAR NAME="anindex" ESCAPE="URL"  -->,1)" class="button catalogue">sel&amp;close</a>
                                                </td>
                                        </tr>
                                <!-- /TMPL_LOOP -->
@@ -100,8 +116,10 @@ a.catalogue:hover {
                </div>
                <!-- TMPL_ELSE -->
                        <h3 class="catalogue">No results in Authorities</h3>
-               <!-- /TMPL_IF -->
-               <!-- TMPL_IF Name=catresult --> 
+       <!-- /TMPL_IF -->
+               
+               
+       <!-- TMPL_IF Name=catresult --> 
                <div id="resultnumber">
                        <p class="resultcount">
                        <!-- TMPL_IF NAME="total" -->
@@ -113,22 +131,28 @@ a.catalogue:hover {
                        <table>
                                <tr>
                                        <th class="catalogue">Summary</th>
-                                       <th class="catalogue">Biblio Count</th>
+                                       <th class="catalogue">Used in</th>
                                        <th class="catalogue">Select</th>
                                </tr>
                                <!-- TMPL_LOOP NAME="catresult" -->
                                <tr>
-                                       <td<!-- TMPL_IF NAME="even" --> class="hilighted"<!-- /TMPL_IF -->>
+                                       <!-- TMPL_IF NAME="even" -->
+                                       <td class="hilighted">
+                                       <!-- TMPL_ELSE -->
+                                       <td>
+                                       <!-- /TMPL_IF -->
                                                                <!-- TMPL_IF name="MARC_ON" -->
-                                                                       <a class="transparent resultlist" href="search.pl?type=<!-- TMPL_VAR NAME="type" ESCAPE="URL" -->&amp;marclist=<!-- TMPL_VAR NAME="marclist" ESCAPE="URL" -->&amp;operator=contains&amp;op=do_search&amp;and_or=and&amp;value='<!-- TMPL_VAR Name=value ESCAPE="URL" -->'&amp;excluding="><!-- TMPL_VAR NAME="value" --></a>
+                                                                       <!-- TMPL_VAR NAME="value" -->
                                                                <!-- TMPL_ELSE -->
-                                                                       <a class="transparent resultlist" href="search.pl?bib=<!-- TMPL_VAR NAME="biblionumber" ESCAPE="URL" -->"><!-- TMPL_VAR NAME="value" --></a>                            <!-- /TMPL_IF -->
+                                                                       <!-- TMPL_VAR NAME="value" -->
+                                                               <!-- /TMPL_IF -->
                                        </td>
                                        <td align="center" <!-- TMPL_IF NAME="even" --> class="hilighted"<!-- /TMPL_IF -->>
-                                               <!-- TMPL_VAR NAME="count" -->
+                                               <!-- TMPL_VAR NAME="count" --> biblio(s)
                                        </td>
                                        <td <!-- TMPL_IF NAME="even" -->class="hilighted"<!-- /TMPL_IF -->>
-                                                       <a  href="javascript:SelectEntry('<!-- TMPL_VAR NAME="value" ESCAPE="URL" -->',<!-- TMPL_VAR NAME="anindex" ESCAPE="URL"  -->)" class="button catalogue">Select</a>
+                                                       <a  href="javascript:SelectEntry('<!-- TMPL_VAR NAME="value" ESCAPE="URL" -->',<!-- TMPL_VAR NAME="anindex" ESCAPE="URL"  -->,0)" class="button catalogue">Select</a>
+                                                       <a  href="javascript:SelectEntry('<!-- TMPL_VAR NAME="value" ESCAPE="URL" -->',<!-- TMPL_VAR NAME="anindex" ESCAPE="URL"  -->,1)" class="button catalogue">Sel&amp;close</a>
                                        </td>
                                </tr>
                                <!-- /TMPL_LOOP -->
@@ -155,18 +179,22 @@ a.catalogue:hover {
                        <!-- /TMPL_IF -->
                        </p>
                </div>
-<script language="JavaScript" type="text/javascript">
-function SelectEntry(myentry, myindex){
-       if (opener.document.f.value[myindex].value!=""){ 
-               opener.document.f.value[myindex].value=opener.document.f.value[myindex].value+" "+myentry
-       } else {
-               opener.document.f.value[myindex].value=myentry
+       <!-- /TMPL_IF -->
+       <script language="JavaScript" type="text/javascript">
+       function SelectEntry(myentry, myindex, wclose){
+               if (opener.document.f.value[myindex].value!=""){ 
+                       opener.document.f.value[myindex].value=opener.document.f.value[myindex].value+" "+myentry
+               } else {
+                       opener.document.f.value[myindex].value=myentry
+               }
+               if (wclose == 1) {
+       //      alert("closing")
+                       self.close();
+               }
        }
-}
-</script>
+       </script>
        </div>
 <!-- /TMPL_IF -->
-<!-- /TMPL_IF -->
 </div>
 </body>
 </html>
\ No newline at end of file
index 94385d5..ed39925 100644 (file)
@@ -16,7 +16,7 @@
                <p>
                        <input type="hidden" name="op" value="do_search">
                        <input type="hidden" name="nbstatements" value="<!-- TMPL_VAR NAME="nbstatements" -->">
-                       <label class="label100" for="keyword">Any word</label>
+                       <label for="keyword">Any word</label>
                        <input type="hidden" name="marclist" value="">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
                        <input type="text" name="value" id="keyword" onchange="sql_update()" size="35">
                </p>
                <p>
-                       <label class="label100" for="title">Title</label>
+                       <label for="title">Title</label>
                        <input type="hidden" name="marclist" value="biblio.title">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
                        <input type="hidden" name="operator" value="contains">
                        <input type="text" name="value" id="title" onchange="sql_update()" size="35">
-                       <a href="javascript:Dopop('dictionary.pl?marclist=biblio.title&amp;type=intranet&amp;index=1',1)">
-                               <img src="/intranet-tmpl/default/en/includes/addressbook_section.png" width=12 height=12 alt="dict">
+                       <a href="javascript:Dopop('dictionary.pl?marclist=biblio.title&amp;type=intranet&amp;index=1',1)" class="button catalogue">
+                               ...
                        </a>
                </p>
                <p>
-                       <label class="label100" for="author">Author</label> <input type="hidden" name="marclist" value="biblio.author">
+                       <label for="author">Author</label> <input type="hidden" name="marclist" value="biblio.author">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
                        <input type="hidden" name="operator" value="contains">
                        <input type="text" name="value" id="author" onchange="sql_update()" size="35">
-                       <a href="javascript:Dopop('dictionary.pl?marclist=biblio.author&amp;type=intranet&amp;index=2',2)">
-                               <img src="/intranet-tmpl/default/en/includes/addressbook_section.png" width=12 height=12 alt="dict">
+                       <a href="javascript:Dopop('dictionary.pl?marclist=biblio.author&amp;type=intranet&amp;index=2',2)" class="button catalogue">
+                               ...
                        </a>
                </p>
                <p>
-                       <label class="label100" for="subject">Subject</label>
+                       <label for="subject">Subject</label>
                        <input type="hidden" name="marclist" value="bibliosubject.subject">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
                        <input type="hidden" name="operator" value="contains">  
                        <input type="text" name="value" id="subject" onchange="sql_update()" size="35">
-                       <a href="javascript:Dopop('dictionary.pl?marclist=bibliosubject.subject&amp;type=intranet&amp;index=3',3)">
-                               <img src="/intranet-tmpl/default/en/includes/addressbook_section.png" width=12 height=12 alt="dict">
+                       <a href="javascript:Dopop('dictionary.pl?marclist=bibliosubject.subject&amp;type=intranet&amp;index=3',3)" class="button catalogue">
+                               ...
                        </a>
                </p>
                <p>
-                       <label class="label100" for="itemtype">Item Type</label>
+                       <label for="itemtype">Item Type</label>
                        <input type="hidden" name="marclist" value="biblioitems.itemtype">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
@@ -64,7 +64,7 @@
                        <!-- TMPL_VAR name="CGIitemtype" -->
                </p>
                <p>
-                               <label class="label100" for="branch">Branch</label>
+                               <label for="branch">Branch</label>
                                <input type="hidden" name="marclist" value="items.holdingbranch">
                                <input type="hidden" name="and_or" value="and">
                                <input type="hidden" name="excluding" value="">
@@ -75,7 +75,7 @@
        <div class="bloc25">
                <h2 class="catalogue">Other options</h2>
                <p>
-                               <label class="label100" for="barcode">Item barcode</label>
+                               <label for="barcode">Item barcode</label>
                                <input type="hidden" name="marclist" value="items.barcode">
                                <input type="hidden" name="and_or" value="and">
                                <input type="hidden" name="excluding" value="">
@@ -83,7 +83,7 @@
                                <input type="text" name="value" id="barcode" onchange="sql_update()"> 
                </p>
                <p>
-                       <label class="label100" for="callno">Call Number</label>
+                       <label for="callno">Call Number</label>
                        <input type="hidden" name="marclist" value="items.itemcallnumber">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
@@ -91,7 +91,7 @@
                        <input type="text" name="value" id="callno" onchange="sql_update()">
                </p>
                <p>
-                       <label class="label100" for="isbn">ISBN</label>
+                       <label for="isbn">ISBN</label>
                        <input type="hidden" name="marclist" value="biblioitems.isbn">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
@@ -99,7 +99,7 @@
                        <input type="text" name="value" id="isbn" onchange="sql_update()">
                </p>
                <p>
-                       <label class="label100" for="publisher">Publisher</label>
+                       <label for="publisher">Publisher</label>
                        <input type="hidden" name="marclist" value="biblioitems.publishercode">
                        <input type="hidden" name="and_or" value="and">
                        <input type="hidden" name="excluding" value="">
                </p>
                <p>
                        <input type="submit" value="Start search" class="button catalogue">
-                       <a href="/cgi-bin/koha/search.marc/suggest.pl" onclick="PopupSuggestion(); return false;" class="button catalogue">Suggestions</a>
+                       <a href="/cgi-bin/koha/search.marc/suggest.pl" onclick="PopupSuggestion(); return false;" class="button catalogue">Spelling suggestion</a>
                </p>
        </div>
 </form>
@@ -187,7 +187,7 @@ function AddStatement() {
 
 function Dopop(link,i) {
        var searchstring=document.forms[0].value[i].value;
-       newin=window.open(link+'&amp;search='+searchstring,"popup",'width=550,height=550,toolbar=false,scrollbars=yes');
+       newin=window.open(link+'&amp;search='+searchstring,"popup",'width=700,height=550,toolbar=false,scrollbars=yes');
 }
 
 
index 8bdda22..802518c 100755 (executable)
@@ -30,6 +30,24 @@ use C4::Context;
 use C4::Biblio;
 use HTML::Template;
 
+=head1 NAME
+
+dictionnary.pl : script to search in biblio & authority an existing value
+
+=head1 SYNOPSIS
+
+useful when the user want to search a term before running a query. For example, to see if "computer" is used in the database
+
+The parameter "marclist" tells which field is searched (title, author, subject, but could be anything else)
+
+This script searches in both biblios & authority
+* in biblio, the script search in all marc fields related to what the user is looking for (for example, if the dictionnary is used on "author", the script searches in biblio.author, but also in additional authors & any MARC field related to author (through the "seealso" MARC constraint)
+* in authority, the script search everywhere. Thus, the accepted & rejected forms are found.
+
+The script shows all results & the user can choose what he want, that is copied into search form.
+
+=cut
+
 my $input = new CGI;
 my $field =$input->param('marclist');
 #warn "field :$field";
@@ -38,9 +56,9 @@ my ($tablename, $kohafield)=split /./,$field;
 $tablename="biblio" unless ($tablename);
 #my $kohafield = $input->param('kohafield');
 my @search = $input->param('search');
-warn " ".$search[0];
+warn " ".$search[0];
 my $index = $input->param('index');
-warn " index: ".$index;
+warn " index: ".$index;
 my $op=$input->param('op');
 if (($search[0]) and not ($op eq 'do_search')){
        $op='do_search';
@@ -63,14 +81,9 @@ my $resultsperpage;
 #warn "Starting process";
 
 if ($op eq "do_search") {
-       ($template, $loggedinuser, $cookie)
-                       = get_template_and_user({template_name => "search.marc/dictionary.tmpl",
-                                       query => $input,
-                                       type => $type,
-                                       authnotrequired => 0,
-                                       flagsrequired => {catalogue => 1},
-                                       debug => 1,
-                                       });
+       #
+       # searching in biblio
+       #
        my $sth=$dbh->prepare("Select distinct tagfield,tagsubfield from marc_subfield_structure where kohafield = ?");
        $sth->execute("$field");
        my (@tags, @and_or, @operator, @excluding,@value);
@@ -84,32 +97,27 @@ if ($op eq "do_search") {
        my $orderby = $input->param('orderby');
 
        findseealso($dbh,\@tags);
-#      select distinct m1.bibid from biblio,biblioitems,marc_biblio,marc_word as m1 where biblio.biblionumber=marc_biblio.biblionumber and biblio.biblionumber=biblioitems.biblionumber and m1.bibid=marc_biblio.bibid and (m1.word  like 'Paul' and m1.tagsubfield in ('200f','710a','711a','712a','701a','702a','700a')) order by biblio.title
-
 
        my @results, my $total;
-#      my ($results,$total) = catalogsearch($dbh,\@tags ,\@and_or,
-#                                                                              \@excluding, \@operator,  \@value,
-#                                                                              $startfrom*$resultsperpage, $resultsperpage,$orderby);
-       my $strsth="select distinct subfieldvalue, count(marc_subfield_table.bibid) from marc_subfield_table,marc_word where marc_word.word like ? and marc_subfield_table.bibid=marc_word.bibid and marc_word.tagsubfield in ";
+       my $strsth="select distinct subfieldvalue, count(marc_subfield_table.bibid) from marc_subfield_table,marc_word where marc_word.word like ? and marc_subfield_table.bibid=marc_word.bibid and marc_subfield_table.tagorder=marc_word.tagorder and marc_word.tagsubfield in ";
        my $listtags="(";
        foreach my $tag (@tags){
                $listtags .= $tag .",";
        }
        $listtags =~s/,$/)/;
        $strsth .= $listtags." and marc_word.tagsubfield=marc_subfield_table.tag+marc_subfield_table.subfieldcode group by subfieldvalue ";
-       warn "".$strsth;
+#      warn "search in biblio : ".$strsth;
        my $value = uc($search[0]);
        $value=~s/\*/%/g;
        $value.= "%" if not($value=~m/%/);
-       warn " texte : ".$value;
+#      warn " texte : ".$value;
 
        $sth=$dbh->prepare($strsth);
        $sth->execute($value);
        my $total;
        my @catresults;
        while (my ($value,$ctresults)=$sth->fetchrow) {
-               warn "countresults : ".$ctresults;
+#              warn "countresults : ".$ctresults;
                push @catresults,{value=> $value, 
                                                  even=>($total-$startfrom*$resultsperpage)%2,
                                                  count=>$ctresults
@@ -128,10 +136,13 @@ if ($op eq "do_search") {
        
        $strsth=~s/ OR$/)/;
        my $strsth = $strsth." and authtypecode is not NULL";
-       warn $strsth;
+#      warn $strsth;
        my $sth=$dbh->prepare($strsth);
        $sth->execute;
        
+       #
+       # searching in authorities
+       #
        my @authresults;
        my $authnbresults;
        while ((my $authtypecode) = $sth->fetchrow) {
@@ -141,13 +152,15 @@ if ($op eq "do_search") {
                $authnbresults+=$nbresults;
 #              warn "auth : $authtypecode nbauthresults : $nbresults";
        }
-       
+       
+       # 
+       # OK, filling the template with authorities & biblio entries found.
+       #
        ($template, $loggedinuser, $cookie)
                = get_template_and_user({template_name => "search.marc/dictionary.tmpl",
                                query => $input,
                                type => $type,
                                authnotrequired => 0,
-                               flagsrequired => {borrowers => 1},
                                flagsrequired => {catalogue => 1},
                                debug => 1,
                                });