# 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; 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(&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)]
- );
+
+ @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_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 gettemplate {
- 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/modules/$tmplbase";
- }
- 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,
- opacstylesheet => $opacstylesheet,
- opaccolorstylesheet => C4::Context->preference('opaccolorstylesheet'),
- opacsmallimage => C4::Context->preference('opacsmallimage'),
- 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);
- $template->param(
- languages_loop => $languages_loop,
- bidi => $bidi
- ) 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_env = $ENV{HTTP_ACCEPT_LANGUAGE};
- $http_env =~ m/(\w+-*\w*),/;
- my $language_preference = $1;
- my $http_accept_language = regex_lang_subtags($language_preference)->{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
- 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
=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';
$base_url =~ s/$delim;//g; # remove empties
$base_url =~ s/$delim$//; # remove trailing delim
- my $url = $base_url . ( $base_url =~ m/$delim/ ? '&' : '?' ) . $startfrom_name . '=';
+ my $url = $base_url . (($base_url =~ m/$delim/ or $base_url =~ m/\?/) ? '&' : '?' ) . $startfrom_name . '=';
my $pagination_bar = '';
# navigation bar useful only if more than one page to display !
return $pagination_bar;
}
-=item output_html_with_http_headers
+=item output_with_http_headers
+
+ &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
+$content_type.
+
+If applicable, $cookie can be undef, and it will not be sent.
- &output_html_with_http_headers($query, $cookie, $html[, $content_type])
+$content_type is one of the following: 'html', 'js', 'json', 'xml', 'rss', or 'atom'.
-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.
+$status is an HTTP status message, like '403 Authentication Required'. It defaults to '200 OK'.
-If the optional C<$content_type> parameter is called, set the
-response's Content-Type to that value instead of "text/html".
+$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_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 => $content_type,
- -charset => 'UTF-8',
- -cookie => $cookie,
- -Pragma => 'no-cache',
- -'Cache-Control' => 'no-cache',
- ), $html;
+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',
+ 'json' => 'application/json',
+ 'xml' => 'text/xml',
+ # NOTE: not using application/atom+xml or application/rss+xml because of
+ # Internet Explorer 6; see bug 2078.
+ 'rss' => 'text/xml',
+ 'atom' => 'text/xml'
+ );
+
+ 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' => $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, $status, $extra_options ) = @_;
+ output_with_http_headers( $query, $cookie, $data, 'html', $status, $extra_options );
}
-sub output_ajax_with_http_headers ($$) {
- my ($query, $js) = @_;
+
+sub output_ajax_with_http_headers {
+ my ( $query, $js ) = @_;
print $query->header(
- -type => 'text/javascript',
- -charset => 'UTF-8',
- -Pragma => 'no-cache',
+ -type => 'text/javascript',
+ -charset => 'UTF-8',
+ -Pragma => 'no-cache',
-'Cache-Control' => 'no-cache',
- -expires =>'-1d',
+ -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 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)
=head1 AUTHOR
-Koha Developement team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
=cut