X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FOutput.pm;h=324cf6993c06eaed88a7c7ce05eed99817788dfd;hb=2b8b5ae225af6119e41e2112f9a8573b4170b927;hp=344a45fe29d3e19da9a2b834c661022e0c025842;hpb=fdd82e8054d132c7da889dada5b538a7bf20951a;p=koha_fer diff --git a/C4/Output.pm b/C4/Output.pm index 344a45fe29..324cf6993c 100644 --- a/C4/Output.pm +++ b/C4/Output.pm @@ -17,193 +17,94 @@ package C4::Output; # 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 +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # NOTE: I'm pretty sure this module is deprecated in favor of # templates. use strict; -use warnings; +#use warnings; FIXME - Bug 2505 + +use URI::Escape; use C4::Context; -use C4::Languages qw(getTranslatedLanguages get_bidi regex_lang_subtags language_get_description accept_language ); +use C4::Dates qw(format_date); +use C4::Budgets qw(GetCurrency); +use C4::Templates; -use HTML::Template::Pro; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); BEGIN { # set the version for version checking - $VERSION = 3.03; + $VERSION = 3.07.00.049; require Exporter; - @ISA = qw(Exporter); - @EXPORT_OK = qw(&is_ajax ajax_fail); # More stuff should go here instead - %EXPORT_TAGS = ( all =>[qw(&themelanguage &gettemplate setlanguagecookie pagination_bar - &output_with_http_headers &output_html_with_http_headers)], - ajax =>[qw(&output_with_http_headers is_ajax)], - html =>[qw(&output_with_http_headers &output_html_with_http_headers)] - ); + + @ISA = qw(Exporter); + @EXPORT_OK = qw(&is_ajax ajax_fail); # More stuff should go here instead + %EXPORT_TAGS = ( all =>[qw(setlanguagecookie pagination_bar parametrized_url + &output_with_http_headers &output_ajax_with_http_headers &output_html_with_http_headers)], + ajax =>[qw(&output_with_http_headers &output_ajax_with_http_headers is_ajax)], + html =>[qw(&output_with_http_headers &output_html_with_http_headers)] + ); push @EXPORT, qw( - &themelanguage &gettemplate setlanguagecookie pagination_bar + setlanguagecookie getlanguagecookie pagination_bar parametrized_url ); push @EXPORT, qw( - &output_html_with_http_headers &output_with_http_headers + &output_html_with_http_headers &output_ajax_with_http_headers &output_with_http_headers FormatData FormatNumber ); + } =head1 NAME -C4::Output - Functions for managing templates +C4::Output - Functions for managing output, is slowly being deprecated =head1 FUNCTIONS =over 2 - =cut -#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/"; - -#--------------------------------------------------------------------------------------------------------- -# FIXME - POD - -sub _get_template_file { - my ( $tmplbase, $interface, $query ) = @_; - my $htdocs = C4::Context->config( $interface ne 'intranet' ? 'opachtdocs' : 'intrahtdocs' ); - my ( $theme, $lang ) = themelanguage( $htdocs, $tmplbase, $interface, $query ); - - # 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"; - } - - return ( $htdocs, $theme, $lang, $filename ); -} - -sub gettemplate { - my ( $tmplbase, $interface, $query ) = @_; - ($query) or warn "no query in gettemplate"; - my $path = C4::Context->preference('intranet_includes') || 'includes'; - my $opacstylesheet = C4::Context->preference('opacstylesheet'); - my ( $htdocs, $theme, $lang, $filename ) = _get_template_file( $tmplbase, $interface, $query ); - - my $template = HTML::Template::Pro->new( - 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"] +=item FormatNumber +=cut +sub FormatNumber{ +my $cur = GetCurrency; +my $cur_format = C4::Context->preference("CurrencyFormat"); +my $num; + +if ( $cur_format eq 'FR' ) { + $num = new Number::Format( + 'decimal_fill' => '2', + 'decimal_point' => ',', + 'int_curr_symbol' => $cur->{symbol}, + 'mon_thousands_sep' => ' ', + 'thousands_sep' => ' ', + 'mon_decimal_point' => ',' ); - my $themelang=( $interface ne 'intranet' ? '/opac-tmpl' : '/intranet-tmpl' ) - . "/$theme/$lang"; - $template->param( - 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, - lang => $lang +} else { # US by default.. + $num = new Number::Format( + 'int_curr_symbol' => '', + 'mon_thousands_sep' => ',', + 'mon_decimal_point' => '.' ); - - # 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; +} +return $num; } -#--------------------------------------------------------------------------------------------------------- -# FIXME - POD -sub themelanguage { - 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 ( $interface eq "intranet" ) { - @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'); - @themes = split " ", C4::Context->preference("opacthemes"); - } +=item FormatData - # 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 ) { - # 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 ); -} +FormatData($data_hashref) +C<$data_hashref> is a ref to data to format -sub setlanguagecookie { - my ( $query, $language, $uri ) = @_; - my $cookie = $query->cookie( - -name => 'KohaOpacLanguage', - -value => $language, - -expires => '' - ); - print $query->redirect( - -uri => $uri, - -cookie => $cookie - ); +Format dates of data those dates are assumed to contain date in their noun +Could be used in order to centralize all the formatting for HTML output +=cut + +sub FormatData{ + my $data_hashref=shift; + $$data_hashref{$_} = format_date( $$data_hashref{$_} ) for grep{/date/} keys (%$data_hashref); } =item pagination_bar @@ -226,7 +127,7 @@ This function returns HTML, without any language dependency. =cut sub pagination_bar { - my $base_url = (@_ ? shift : $ENV{SCRIPT_NAME} . $ENV{QUERY_STRING}) or return undef; + my $base_url = (@_ ? shift : $ENV{SCRIPT_NAME} . $ENV{QUERY_STRING}) or return; my $nb_pages = (@_) ? shift : 1; my $current_page = (@_) ? shift : undef; # delay default until later my $startfrom_name = (@_) ? shift : 'page'; @@ -354,7 +255,7 @@ sub pagination_bar { =item output_with_http_headers - &output_with_http_headers($query, $cookie, $data, $content_type[, $status]) + &output_with_http_headers($query, $cookie, $data, $content_type[, $status[, $extra_options]]) Outputs $data with the appropriate HTTP headers, the authentication cookie $cookie and a Content-Type specified in @@ -366,12 +267,18 @@ $content_type is one of the following: 'html', 'js', 'json', 'xml', 'rss', or 'a $status is an HTTP status message, like '403 Authentication Required'. It defaults to '200 OK'. +$extra_options is hashref. If the key 'force_no_caching' is present and has +a true value, the HTTP headers include directives to force there to be no +caching whatsoever. + =cut -sub output_with_http_headers($$$$;$) { - my ( $query, $cookie, $data, $content_type, $status ) = @_; +sub output_with_http_headers { + my ( $query, $cookie, $data, $content_type, $status, $extra_options ) = @_; $status ||= '200 OK'; + $extra_options //= {}; + my %content_type_map = ( 'html' => 'text/html', 'js' => 'text/javascript', @@ -384,31 +291,66 @@ sub output_with_http_headers($$$$;$) { ); die "Unknown content type '$content_type'" if ( !defined( $content_type_map{$content_type} ) ); + my $cache_policy = 'no-cache'; + $cache_policy .= ', no-store, max-age=0' if $extra_options->{force_no_caching}; my $options = { type => $content_type_map{$content_type}, status => $status, charset => 'UTF-8', Pragma => 'no-cache', - 'Cache-Control' => 'no-cache', + 'Cache-Control' => $cache_policy, }; + $options->{expires} = 'now' if $extra_options->{force_no_caching}; + $options->{cookie} = $cookie if $cookie; if ($content_type eq 'html') { # guaranteed to be one of the content_type_map keys, else we'd have died $options->{'Content-Style-Type' } = 'text/css'; $options->{'Content-Script-Type'} = 'text/javascript'; } + +# We can't encode here, that will double encode our templates, and xslt +# We need to fix the encoding as it comes out of the database, or when we pass the variables to templates + +# utf8::encode($data) if utf8::is_utf8($data); + + $data =~ s/\&\;amp\; /\&\; /g; print $query->header($options), $data; } -sub output_html_with_http_headers ($$$) { - my ( $query, $cookie, $data ) = @_; - output_with_http_headers( $query, $cookie, $data, 'html' ); +sub output_html_with_http_headers { + my ( $query, $cookie, $data, $status, $extra_options ) = @_; + output_with_http_headers( $query, $cookie, $data, 'html', $status, $extra_options ); } -sub is_ajax () { + +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; } +sub parametrized_url { + my $url = shift || ''; # ie page.pl?ln={LANG} + my $vars = shift || {}; # ie { LANG => en } + my $ret = $url; + while ( my ($key,$val) = each %$vars) { + my $val_url = URI::Escape::uri_escape_utf8($val); + $ret =~ s/\{$key\}/$val_url/g; + } + $ret =~ s/\{[^\{]*\}//g; # remove not defined vars + return $ret; +} + END { } # module clean-up code here (global destructor) 1; @@ -418,6 +360,6 @@ __END__ =head1 AUTHOR -Koha Developement team +Koha Development Team =cut