X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FOutput.pm;h=1c12a7346401d30953120c14a179bc12b21a95a7;hb=5290ec559679f80fa3abb8845581e9634d26c649;hp=8b6ab14780ff1392ad2780f4a38ed02b807fc20c;hpb=8e5b1d4792e8024dbb410bb929ed0fae92c5ccfc;p=srvgit diff --git a/C4/Output.pm b/C4/Output.pm index 8b6ab14780..1c12a73464 100644 --- a/C4/Output.pm +++ b/C4/Output.pm @@ -1,12 +1,9 @@ package C4::Output; -# $Id$ - #package to deal with marking up output #You will need to edit parts of this pm #set the value of path to be where your html lives - # Copyright 2000-2002 Katipo Communications # # This file is part of Koha. @@ -24,20 +21,30 @@ package C4::Output; # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA + # NOTE: I'm pretty sure this module is deprecated in favor of # templates. use strict; -require Exporter; use C4::Context; -use C4::Database; -use HTML::Template; +use C4::Languages qw(getTranslatedLanguages get_bidi regex_lang_subtags language_get_description accept_language ); +use HTML::Template::Pro; use vars qw($VERSION @ISA @EXPORT); -# set the version for version checking -$VERSION = 0.01; +BEGIN { + # set the version for version checking + $VERSION = 3.01; + require Exporter; + @ISA = qw(Exporter); + push @EXPORT, qw( + &themelanguage &gettemplate setlanguagecookie pagination_bar + ); + push @EXPORT, qw( + &output_html_with_http_headers + ); +} =head1 NAME @@ -49,112 +56,319 @@ C4::Output - Functions for managing templates =cut -@ISA = qw(Exporter); -@EXPORT = qw( - &themelanguage &gettemplate setlanguagecookie - ); - #FIXME: this is a quick fix to stop rc1 installing broken #Still trying to figure out the correct fix. -my $path = C4::Context->config('intrahtdocs')."/default/en/includes/"; +my $path = C4::Context->config('intrahtdocs') . "/prog/en/includes/"; #--------------------------------------------------------------------------------------------------------- # FIXME - POD sub gettemplate { - my ($tmplbase, $opac, $query) = @_; -if (!$query){ - warn "no query in gettemplate"; - } - my $htdocs; - if ($opac ne "intranet") { - $htdocs = C4::Context->config('opachtdocs'); - } else { - $htdocs = C4::Context->config('intrahtdocs'); + my ( $tmplbase, $interface, $query ) = @_; + ($query) or warn "no query in gettemplate"; + my $htdocs; + if ( $interface ne "intranet" ) { + $htdocs = C4::Context->config('opachtdocs'); + } + else { + $htdocs = C4::Context->config('intrahtdocs'); + } + my $path = C4::Context->preference('intranet_includes') || 'includes'; + + my ( $theme, $lang ) = themelanguage( $htdocs, $tmplbase, $interface, $query ); + my $opacstylesheet = C4::Context->preference('opacstylesheet'); + + # if the template doesn't exist, load the English one as a last resort + my $filename = "$htdocs/$theme/$lang/modules/$tmplbase"; + unless (-f $filename) { + $lang = 'en'; + $filename = "$htdocs/$theme/$lang/".($interface eq 'intranet'?"modules":"")."/$tmplbase"; } + my $template = HTML::Template::Pro->new( + filename => $filename, + die_on_bad_params => 1, + global_vars => 1, + case_sensitive => 1, + path => ["$htdocs/$theme/$lang/$path"] + ); + + $template->param( + themelang => ( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ) + . "/$theme/$lang", + interface => ( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ), + theme => $theme, + opacstylesheet => $opacstylesheet, + opaccolorstylesheet => C4::Context->preference('opaccolorstylesheet'), + opacsmallimage => C4::Context->preference('opacsmallimage'), + lang => $lang + ); - my ($theme, $lang) = themelanguage($htdocs, $tmplbase, $opac, $query); + # Bidirectionality + my $current_lang = regex_lang_subtags($lang); + my $bidi; + $bidi = get_bidi($current_lang->{script}) if $current_lang->{script}; - my $template = HTML::Template->new(filename => "$htdocs/$theme/$lang/$tmplbase", - die_on_bad_params => 0, - global_vars => 1, - path => ["$htdocs/$theme/$lang/includes"]); + # Languages + my @template_languages; + my $languages_loop = getTranslatedLanguages($interface,$theme); - $template->param(themelang => ($opac ne 'intranet'? '/opac-tmpl': '/intranet-tmpl') . "/$theme/$lang", - interface => ($opac ne 'intranet'? '/opac-tmpl': '/intranet-tmpl'), - theme => $theme, - lang => $lang); + for my $language_hashref (@$languages_loop) { + $language_hashref->{'current_lang'} = $current_lang->{'language'}; + $language_hashref->{'native_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'language_code'},'language'); + #warn "($language_hashref->{'language_code'},$language_hashref->{'current_lang'},$language_hashref->{'script_code'}"; + $language_hashref->{'locale_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'current_lang'},'language'); + $language_hashref->{'language_description'} = language_get_description($language_hashref->{'language_code'},$language_hashref->{'current_lang'},'language'); + $language_hashref->{'script_description'} = language_get_description($language_hashref->{'script_code'},$language_hashref->{'current_lang'},'script'); + $language_hashref->{'region_description'} = language_get_description($language_hashref->{'region_code'},$language_hashref->{'current_lang'},'region'); + $language_hashref->{'variant_description'} = language_get_description($language_hashref->{'variant_code'},$language_hashref->{'current_lang'},'variant'); - - return $template; + if ($language_hashref->{'language_lang'} eq $lang) { + $language_hashref->{current}++; + } + push @template_languages, $language_hashref; + } + # load the languages ( for switching from one template to another ) + $template->param( languages_loop => \@template_languages, + bidi => $bidi + ); + + return $template; } #--------------------------------------------------------------------------------------------------------- # FIXME - POD sub themelanguage { - my ($htdocs, $tmpl, $section, $query) = @_; -# if (!$query) { -# warn "no query"; -# } - my $dbh = C4::Context->dbh; - my @languages; - my @themes; - if ( $section eq "intranet") - { - @languages = split " ", C4::Context->preference("opaclanguages"); - @themes = split " ", C4::Context->preference("template"); - } - else - { - # we are in the opac here, what im trying to do is let the individual user - # set the theme they want to use. - # and perhaps the them as well. - my $lang=$query->cookie('KohaOpacLanguage'); - if ($lang){ - - push @languages,$lang; - @themes = split " ", C4::Context->preference("opacthemes"); - } - else { - @languages = split " ", C4::Context->preference("opaclanguages"); - @themes = split " ", C4::Context->preference("opacthemes"); + my ( $htdocs, $tmpl, $interface, $query ) = @_; + ($query) or warn "no query in themelanguage"; + + # Set some defaults for language and theme + # First, check the user's preferences + my $lang; + my $http_accept_language = regex_lang_subtags($ENV{HTTP_ACCEPT_LANGUAGE})->{language}; + if ($http_accept_language) { + $lang = accept_language($http_accept_language,getTranslatedLanguages($interface,'prog')); + } + # But, if there's a cookie set, obey it + $lang = $query->cookie('KohaOpacLanguage') if $query->cookie('KohaOpacLanguage'); + + # Fall back to English + $lang = 'en' unless $lang; + my $theme = 'prog'; + + my $dbh = C4::Context->dbh; + my @languages; + my @themes; + if ( $interface eq "intranet" ) { + @languages = split " ", C4::Context->preference("opaclanguages"); + @themes = split " ", C4::Context->preference("template"); + push @languages, $lang if $lang; + } + else { + # we are in the opac here, what im trying to do is let the individual user + # set the theme they want to use. + # and perhaps the them as well. + #my $lang = $query->cookie('KohaOpacLanguage'); + if ($lang) { # FIXME: if $lang always TRUE! + push @languages, $lang; + } + else { + @languages = split " ", C4::Context->preference("opaclanguages"); + } + @themes = split " ", C4::Context->preference("opacthemes"); } - } - my ($theme, $lang); -# searches through the themes and languages. First template it find it returns. -# Priority is for getting the theme right. + # searches through the themes and languages. First template it find it returns. + # Priority is for getting the theme right. THEME: - foreach my $th (@themes) { - foreach my $la (@languages) { - for (my $pass = 1; $pass <= 2; $pass += 1) { - $la =~ s/([-_])/ $1 eq '-'? '_': '-' /eg if $pass == 2; - if (-e "$htdocs/$th/$la/$tmpl") { - $theme = $th; - $lang = $la; - last THEME; - } - last unless $la =~ /[-_]/; - } + foreach my $th (@themes) { + foreach my $la (@languages) { + for ( my $pass = 1 ; $pass <= 2 ; $pass += 1 ) { + $la =~ s/([-_])/ $1 eq '-'? '_': '-' /eg if $pass == 2; + if ( -e "$htdocs/$th/$la/".($interface eq 'intranet'?"modules":"")."/$tmpl" ) { + $theme = $th; + $lang = $la; + last THEME; + } + last unless $la =~ /[-_]/; + } + } } - } - if ($theme and $lang) { - return ($theme, $lang); - } else { - return ('default', 'en'); - } + return ( $theme, $lang ); } sub setlanguagecookie { - my ($query,$language,$uri)=@_; - my $cookie=$query->cookie(-name => 'KohaOpacLanguage', - -value => $language, - -expires => ''); - print $query->redirect(-uri=>$uri, - -cookie=>$cookie); -} + my ( $query, $language, $uri ) = @_; + my $cookie = $query->cookie( + -name => 'KohaOpacLanguage', + -value => $language, + -expires => '' + ); + print $query->redirect( + -uri => $uri, + -cookie => $cookie + ); +} + +=item pagination_bar + + pagination_bar($base_url, $nb_pages, $current_page, $startfrom_name) + +Build an HTML pagination bar based on the number of page to display, the +current page and the url to give to each page link. + +C<$base_url> is the URL for each page link. The +C<$startfrom_name>=page_number is added at the end of the each URL. + +C<$nb_pages> is the total number of pages available. + +C<$current_page> is the current page number. This page number won't become a +link. + +This function returns HTML, without any language dependency. + +=cut + +sub pagination_bar { + my ( $base_url, $nb_pages, $current_page, $startfrom_name ) = @_; + + # how many pages to show before and after the current page? + my $pages_around = 2; + + my $url = + $base_url . ( $base_url =~ m/&/ ? '&' : '?' ) . $startfrom_name . '='; + + my $pagination_bar = ''; + + # current page detection + if ( not defined $current_page ) { + $current_page = 1; + } + + # navigation bar useful only if more than one page to display ! + if ( $nb_pages > 1 ) { + + # link to first page? + if ( $current_page > 1 ) { + $pagination_bar .= + "\n" . ' ' + . '' + . '<<' . ''; + } + else { + $pagination_bar .= + "\n" . ' <<'; + } + + # link on previous page ? + if ( $current_page > 1 ) { + my $previous = $current_page - 1; + + $pagination_bar .= + "\n" . ' ' + . ''; + } + else { + $pagination_bar .= + "\n" . ' <'; + } + + my $min_to_display = $current_page - $pages_around; + my $max_to_display = $current_page + $pages_around; + my $last_displayed_page = undef; + + for my $page_number ( 1 .. $nb_pages ) { + if ( + $page_number == 1 + or $page_number == $nb_pages + or ( $page_number >= $min_to_display + and $page_number <= $max_to_display ) + ) + { + if ( defined $last_displayed_page + and $last_displayed_page != $page_number - 1 ) + { + $pagination_bar .= + "\n" . ' ...'; + } + if ( $page_number == $current_page ) { + $pagination_bar .= + "\n" . ' ' + . '' + . $page_number + . ''; + } + else { + $pagination_bar .= + "\n" . ' ' + . '' + . $page_number . ''; + } + $last_displayed_page = $page_number; + } + } + + # link on next page? + if ( $current_page < $nb_pages ) { + my $next = $current_page + 1; + + $pagination_bar .= "\n" + . ' '; + } + else { + $pagination_bar .= + "\n" . ' >'; + } + + # link to last page? + if ( $current_page != $nb_pages ) { + $pagination_bar .= "\n" + . ' ' + . '>>' . ''; + } + else { + $pagination_bar .= + "\n" . ' >>'; + } + } + + return $pagination_bar; +} + +=item output_html_with_http_headers + + &output_html_with_http_headers($query, $cookie, $html) + +Outputs the HTML page $html with the appropriate HTTP headers, +with the authentication cookie $cookie and a Content-Type that +corresponds to the HTML page $html. + +=cut + +sub output_html_with_http_headers ($$$) { + my($query, $cookie, $html) = @_; + print $query->header( + -type => 'text/html', + -charset => 'UTF-8', + -cookie => $cookie, + -Pragma => 'no-cache', + -'Cache-Control' => 'no-cache', + ), $html; +} -END { } # module clean-up code here (global destructor) +END { } # module clean-up code here (global destructor) 1; __END__