X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FOutput.pm;h=36b83a2904cc4329f1bd592c8607cc3e9aef2395;hb=8246a7dce86ec220f0c1cabf25a0d815ff439624;hp=5aefe92d4c76a35508f69e3176f0c2cf4448fd82;hpb=17d42eba709cfab7fe389a31e6c53922c4d42183;p=koha.git diff --git a/C4/Output.pm b/C4/Output.pm index 5aefe92d4c..36b83a2904 100644 --- a/C4/Output.pm +++ b/C4/Output.pm @@ -26,16 +26,31 @@ package C4::Output; # templates. use strict; -require Exporter; use C4::Context; -use C4::Languages qw(getTranslatedLanguages); +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 = 3.00; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +BEGIN { + # set the version for version checking + $VERSION = 3.03; + require Exporter; + @ISA = qw(Exporter); + @EXPORT_OK = qw(&output_ajax_with_http_headers &is_ajax); # More stuff should go here instead + %EXPORT_TAGS = ( all =>[qw(&themelanguage &gettemplate setlanguagecookie pagination_bar + &output_ajax_with_http_headers &output_html_with_http_headers)], + ajax =>[qw(&output_ajax_with_http_headers is_ajax)], + html =>[qw(&output_html_with_http_headers)] + ); + push @EXPORT, qw( + &themelanguage &gettemplate setlanguagecookie pagination_bar + ); + push @EXPORT, qw( + &output_html_with_http_headers + ); +} =head1 NAME @@ -47,17 +62,6 @@ C4::Output - Functions for managing templates =cut -@ISA = qw(Exporter); -push @EXPORT, qw( - &themelanguage &gettemplate setlanguagecookie pagination_bar -); - -#Output -push @EXPORT, qw( - &output_html_with_http_headers -); - - #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') . "/prog/en/includes/"; @@ -66,9 +70,7 @@ my $path = C4::Context->config('intrahtdocs') . "/prog/en/includes/"; # FIXME - POD sub gettemplate { my ( $tmplbase, $interface, $query ) = @_; - if ( !$query ) { - warn "no query in gettemplate"; - } + ($query) or warn "no query in gettemplate"; my $htdocs; if ( $interface ne "intranet" ) { $htdocs = C4::Context->config('opachtdocs'); @@ -77,21 +79,28 @@ sub gettemplate { $htdocs = C4::Context->config('intrahtdocs'); } my $path = C4::Context->preference('intranet_includes') || 'includes'; - - # warn "PATH : $path"; 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/modules/$tmplbase"; + } my $template = HTML::Template::Pro->new( - filename => "$htdocs/$theme/$lang/modules/$tmplbase", + filename => $filename, die_on_bad_params => 1, global_vars => 1, case_sensitive => 1, + loop_context_vars => 1, # enable: __first__, __last__, __inner__, __odd__, __counter__ path => ["$htdocs/$theme/$lang/$path"] ); - + my $themelang=( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ) + . "/$theme/$lang"; $template->param( - themelang => ( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ) - . "/$theme/$lang", + themelang => $themelang, + yuipath => (C4::Context->preference("yuipath") eq "local"?"$themelang/lib/yui":C4::Context->preference("yuipath")), interface => ( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ), theme => $theme, opacstylesheet => $opacstylesheet, @@ -99,24 +108,24 @@ sub gettemplate { opacsmallimage => C4::Context->preference('opacsmallimage'), lang => $lang ); - #warn "LANG: $lang"; - # Languages and Locale - my $bidi; - my @template_languages; - my $languages_loop = getTranslatedLanguages($interface,$theme); - for my $language_hashref (@$languages_loop) { - if ($language_hashref->{language_code} eq $lang) { - $language_hashref->{current}++; - if ($language_hashref->{bidi}) { - $bidi = $language_hashref->{bidi}; - } - } - push @template_languages, $language_hashref; - } - # load the languages ( for switching from one template to another ) - $template->param( languages_loop => \@template_languages, - bidi => $bidi - ); + + # Bidirectionality + my $current_lang = regex_lang_subtags($lang); + my $bidi; + $bidi = get_bidi($current_lang->{script}) if $current_lang->{script}; + # Languages + my $languages_loop = getTranslatedLanguages($interface,$theme,$lang); + my $num_languages_enabled = 0; + foreach my $lang (@$languages_loop) { + foreach my $sublang (@{ $lang->{'sublanguages_loop'} }) { + $num_languages_enabled++ if $sublang->{enabled}; + } + } + $template->param( + languages_loop => $languages_loop, + bidi => $bidi, + one_language_enabled => ($num_languages_enabled <= 1) ? 1 : 0, # deal with zero enabled langs as well + ) unless @$languages_loop<2; return $template; } @@ -124,56 +133,60 @@ sub gettemplate { #--------------------------------------------------------------------------------------------------------- # FIXME - POD sub themelanguage { - my ( $htdocs, $tmpl, $section, $query ) = @_; - - # if (!$query) { - # warn "no query"; - # } - - # set some defaults for language and theme - my $lang = $query->cookie('KohaOpacLanguage'); - $lang = 'en' unless $lang; - my $theme = 'prog'; - - my $dbh = C4::Context->dbh; + 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 = $ENV{ HTTP_ACCEPT_LANGUAGE }; + $lang = accept_language( $http_accept_language, + getTranslatedLanguages($interface,'prog') ) + if $http_accept_language; + # But, if there's a cookie set, obey it + $lang = $query->cookie('KohaOpacLanguage') if $query->cookie('KohaOpacLanguage'); + # Fall back to English my @languages; + if ($interface eq 'intranet') { + @languages = split ",", C4::Context->preference("language"); + } else { + @languages = split ",", C4::Context->preference("opaclanguages"); + } + if ($lang){ + @languages=($lang,@languages); + } else { + $lang = $languages[0]; + } + my $theme = 'prog'; # in the event of theme failure default to 'prog' -fbcit + my $dbh = C4::Context->dbh; my @themes; - if ( $section eq "intranet" ) { - @languages = split " ", C4::Context->preference("opaclanguages"); + if ( $interface eq "intranet" ) { @themes = split " ", C4::Context->preference("template"); - pop @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) { - - push @languages, $lang; - @themes = split " ", C4::Context->preference("opacthemes"); - } - else { - @languages = split " ", C4::Context->preference("opaclanguages"); - @themes = split " ", C4::Context->preference("opacthemes"); - } + @themes = split " ", C4::Context->preference("opacthemes"); } # searches through the themes and languages. First template it find it returns. # Priority is for getting the theme right. - THEME: + 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/modules/$tmpl" ) { + #for ( my $pass = 1 ; $pass <= 2 ; $pass += 1 ) { + # warn "$htdocs/$th/$la/modules/$interface-"."tmpl"; + #$la =~ s/([-_])/ $1 eq '-'? '_': '-' /eg if $pass == 2; + if ( -e "$htdocs/$th/$la/modules/$tmpl") { + #".($interface eq 'intranet'?"modules":"")."/$tmpl" ) { $theme = $th; $lang = $la; last THEME; } last unless $la =~ /[-_]/; - } + #} } } return ( $theme, $lang ); @@ -212,21 +225,28 @@ This function returns HTML, without any language dependency. =cut sub pagination_bar { - my ( $base_url, $nb_pages, $current_page, $startfrom_name ) = @_; + my $base_url = (@_ ? shift : $ENV{SCRIPT_NAME} . $ENV{QUERY_STRING}) or return undef; + my $nb_pages = (@_) ? shift : 1; + my $current_page = (@_) ? shift : undef; # delay default until later + my $startfrom_name = (@_) ? shift : 'page'; # 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 $delim = qr/\&(?:amp;)?|;/; # "non memory" cluster: no backreference + $base_url =~ s/$delim*\b$startfrom_name=(\d+)//g; # remove previous pagination var + unless (defined $current_page and $current_page > 0 and $current_page <= $nb_pages) { + $current_page = ($1) ? $1 : 1; # pull current page from param in URL, else default to 1 + # $debug and # FIXME: use C4::Debug; + # warn "with QUERY_STRING:" .$ENV{QUERY_STRING}. "\ncurrent_page:$current_page\n1:$1 2:$2 3:$3"; + } + $base_url =~ s/($delim)+/$1/g; # compress duplicate delims + $base_url =~ s/$delim;//g; # remove empties + $base_url =~ s/$delim$//; # remove trailing delim + my $url = $base_url . (($base_url =~ m/$delim/ or $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 ) { @@ -333,25 +353,48 @@ sub pagination_bar { =item output_html_with_http_headers - &output_html_with_http_headers($query, $cookie, $html) + &output_html_with_http_headers($query, $cookie, $html[, $content_type]) 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. +If the optional C<$content_type> parameter is called, set the +response's Content-Type to that value instead of "text/html". + =cut -sub output_html_with_http_headers ($$$) { - my($query, $cookie, $html) = @_; +sub output_html_with_http_headers ($$$;$) { + my $query = shift; + my $cookie = shift; + my $html = shift; + my $content_type = @_ ? shift : "text/html"; + $content_type = "text/html" unless $content_type =~ m!/!; # very basic sanity check print $query->header( - -type => 'text/html', + -type => $content_type, -charset => 'UTF-8', -cookie => $cookie, - -Pragma => 'no-cache', - -'Cache-Control' => 'no-cache', + -Pragma => 'no-cache', + -'Cache-Control' => 'no-cache', ), $html; } +sub output_ajax_with_http_headers ($$) { + my ($query, $js) = @_; + print $query->header( + -type => 'text/javascript', + -charset => 'UTF-8', + -Pragma => 'no-cache', + -'Cache-Control' => 'no-cache', + -expires =>'-1d', + ), $js; +} + +sub is_ajax () { + my $x_req = $ENV{HTTP_X_REQUESTED_WITH}; + return ($x_req and $x_req =~ /XMLHttpRequest/i) ? 1 : 0; +} + END { } # module clean-up code here (global destructor) 1;