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);
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
BEGIN {
# set the version for version checking
- $VERSION = 3.01;
+ $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
);
$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');
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 => $themelang,
- yuipath => (C4::Context->preference("yuipath") eq "local"?"$themelang/lib/yui":C4::Context->preference("yuipath")),
+ 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
+ theme => $theme,
+ lang => $lang
);
# Bidirectionality
$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
+ 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;
# 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'));
- }
+ 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 = split " ", C4::Context->preference("opaclanguages");
+ 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 {
=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 ) {
=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',
), $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;