5 #package to deal with marking up output
6 #You will need to edit parts of this pm
7 #set the value of path to be where your html lives
10 # Copyright 2000-2002 Katipo Communications
12 # This file is part of Koha.
14 # Koha is free software; you can redistribute it and/or modify it under the
15 # terms of the GNU General Public License as published by the Free Software
16 # Foundation; either version 2 of the License, or (at your option) any later
19 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
20 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
21 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License along with
24 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
25 # Suite 330, Boston, MA 02111-1307 USA
27 # NOTE: I'm pretty sure this module is deprecated in favor of
37 use vars qw($VERSION @ISA @EXPORT);
39 # set the version for version checking
44 C4::Output - Functions for generating HTML for the Koha web interface
50 $str = &mklink("http://www.koha.org/", "Koha web page");
55 The functions in this module generate HTML, and return the result as a
65 @EXPORT = qw(&startpage &endpage
66 &mktablehdr &mktableft &mktablerow &mklink
67 &startmenu &endmenu &mkheadr
69 &mkform &mkform2 &bold
70 &gotopage &mkformnotable &mkform3
71 &getkeytableselectoptions
73 &themelanguage &gettemplate
76 my $path = C4::Context->config('includes') ||
77 "/usr/local/www/hdl/htdocs/includes";
79 #---------------------------------------------------------------------------------------------------------
82 my ($tmplbase, $opac) = @_;
85 if ($opac ne "intranet") {
86 $htdocs = C4::Context->config('opachtdocs');
88 $htdocs = C4::Context->config('intrahtdocs');
91 my ($theme, $lang) = themelanguage($htdocs, $tmplbase);
93 my $template = HTML::Template->new(filename => "$htdocs/$theme/$lang/$tmplbase",
94 die_on_bad_params => 0,
96 path => ["$htdocs/$theme/$lang/includes"]);
98 # XXX temporary patch for Bug 182 for themelang
99 $template->param(themelang => ($opac ne 'intranet'? '/opac-tmpl': '/intranet-tmpl') . "/$theme/$lang",
100 interface => ($opac ne 'intranet'? '/opac-tmpl': '/intranet-tmpl'),
106 #---------------------------------------------------------------------------------------------------------
109 my ($htdocs, $tmpl) = @_;
111 my $dbh = C4::Context->dbh;
112 my @languages = split " ", C4::Context->preference("opaclanguages");
113 # language preference
114 my @themes = split " ", C4::Context->preference("opacthemes");
118 # searches through the themes and languages. First template it find it returns.
119 # Priority is for getting the theme right.
121 foreach my $th (@themes) {
122 foreach my $la (@languages) {
123 if (-e "$htdocs/$th/$la/$tmpl") {
130 if ($theme and $lang) {
131 return ($theme, $lang);
133 return ('default', 'en');
140 %values = &pathtotemplate(template => $template,
142 language => $language,
144 path => $includedir);
146 Finds a directory containing the desired template. The C<template>
147 argument specifies the template you're looking for (this should be the
148 name of the script you're using to generate an HTML page, without the
149 C<.pl> extension). Only the C<template> argument is required; the
152 C<theme> specifies the name of the theme to use. This will be used
153 only if it is allowed by the C<allowthemeoverride> system preference
154 option (in the C<systempreferences> table of the Koha database).
156 C<language> specifies the desired language. If not specified,
157 C<&pathtotemplate> will use the list of acceptable languages specified
158 by the browser, then C<all>, and finally C<en> as fallback options.
160 C<type> may be C<intranet>, C<opac>, C<none>, or some other value.
161 C<intranet> and C<opac> specify that you want a template for the
162 internal web site or the public OPAC, respectively. C<none> specifies
163 that the template you're looking for is at the top level of one of the
164 include directories. Any other value is taken as-is, as a subdirectory
165 of one of the include directories.
167 C<path> specifies an include directory.
169 C<&pathtotemplate> searches first in the directory given by the
170 C<path> argument, if any, then in the directories given by the
171 C<templatedirectory> and C<includes> directives in F</etc/koha.conf>,
174 C<&pathtotemplate> returns a hash with the following keys:
180 The full pathname to the desired template.
182 =item C<foundlanguage>
184 The value is set to 1 if a template in the desired language was found,
189 The value is set to 1 if a template of the desired theme was found, or
194 If C<&pathtotemplate> cannot find an acceptable template, it returns 0.
196 Note that if a template of the desired language or theme cannot be
197 found, C<&pathtotemplate> will print a warning message. Unless you've
198 set C<$SIG{__WARN__}>, though, this won't show up in the output HTML
203 # FIXME - Fix POD: it doesn't look in the directory given by the
204 # 'includes' option in /etc/koha.conf.
207 my $template = $params{'template'};
208 my $themeor = $params{'theme'};
209 my $languageor = lc($params{'language'});
210 my $ptype = lc($params{'type'} or 'intranet');
212 # FIXME - Make sure $params{'template'} was given. Or else assume
215 if ($ptype eq 'opac') {$type = 'opac-tmpl/'; }
216 elsif ($ptype eq 'none') {$type = ''; }
217 elsif ($ptype eq 'intranet') {$type = 'intranet-tmpl/'; }
218 else {$type = $ptype . '/'; }
221 my $theme = C4::Context->preference("theme") || "default";
223 C4::Context->preference("allowthemeoverride") =~ qr/$themeor/i)
227 my @languageorder = getlanguageorder();
228 my $language = $languageor || shift(@languageorder);
230 #where to search for templates
231 my @tmpldirs = ("$path/templates", $path);
232 unshift (@tmpldirs, C4::Context->config('templatedirectory')) if C4::Context->config('templatedirectory');
233 unshift (@tmpldirs, $params{'path'}) if $params{'path'};
235 my ($etheme, $elanguage, $epath);
237 CHECK: foreach my $edir (@tmpldirs) {
238 foreach $etheme ($theme, 'all', 'default') {
239 foreach $elanguage ($language, @languageorder, 'all','en') {
240 # 'en' is the fallback-language
241 if (-e "$edir/$type$etheme/$elanguage/$template") {
242 $epath = "$edir/$type$etheme/$elanguage/$template";
250 warn "Could not find $template in @tmpldirs";
254 if ($language eq $elanguage) {
255 $returns{'foundlanguage'} = 1;
257 $returns{'foundlanguage'} = 0;
258 warn "The language $language could not be found for $template of $theme.\nServing $elanguage instead.\n";
260 if ($theme eq $etheme) {
261 $returns{'foundtheme'} = 1;
263 $returns{'foundtheme'} = 0;
264 warn "The template $template could not be found for theme $theme.\nServing $template of $etheme instead.\n";
267 $returns{'path'} = $epath;
272 =item getlanguageorder
274 @languages = &getlanguageorder();
276 Returns the list of languages that the user will accept, and returns
277 them in order of decreasing preference. This is retrieved from the
278 browser's headers, if possible; otherwise, C<&getlanguageorder> uses
279 the C<languageorder> setting from the C<systempreferences> table in
280 the Koha database. If neither is set, it defaults to C<en> (English).
284 sub getlanguageorder () {
287 if ($ENV{'HTTP_ACCEPT_LANGUAGE'}) {
288 @languageorder = split (/\s*,\s*/ ,lc($ENV{'HTTP_ACCEPT_LANGUAGE'}));
289 } elsif (my $order = C4::Context->preference("languageorder")) {
290 @languageorder = split (/\s*,\s*/ ,lc($order));
291 } else { # here should be another elsif checking for apache's languageorder
292 @languageorder = ('en');
295 return (@languageorder);
303 Returns a string of HTML, the beginning of a new HTML document.
313 $str = &gotopage("//opac.koha.org/index.html");
316 Generates a snippet of HTML code that will redirect to the given URL
317 (which should not include the initial C<http:>), and returns it.
322 my ($target) = shift;
323 #print "<br>goto target = $target<br>";
324 my $string = "<META HTTP-EQUIV=Refresh CONTENT=\"0;URL=http:$target\">";
330 @lines = &startmenu($type);
331 print join("", @lines);
333 Given a page type, or category, returns a set of lines of HTML which,
334 when concatenated, generate the menu at the top of the web page.
336 C<$type> may be one of C<issue>, C<opac>, C<member>, C<acquisitions>,
337 C<report>, C<circulation>, or something else, in which case the menu
338 will be for the catalog pages.
343 # edit the paths in here
345 if ($type eq 'issue') {
346 open (FILE,"$path/issues-top.inc") || die "could not find : $path/issues-top.inc";
347 } elsif ($type eq 'opac') {
348 open (FILE,"$path/opac-top.inc") || die "could not find : $path/opac-top.inc";
349 } elsif ($type eq 'member') {
350 open (FILE,"$path/members-top.inc") || die "could not find : $path/members-top.inc";
351 } elsif ($type eq 'acquisitions'){
352 open (FILE,"$path/acquisitions-top.inc") || die "could not find : $path/acquisition-top.inc";
353 } elsif ($type eq 'report'){
354 open (FILE,"$path/reports-top.inc") || die "could not find : $path/reports-top.inc";
355 } elsif ($type eq 'circulation') {
356 open (FILE,"$path/circulation-top.inc") || die "could not find : $path/circulation-top.inc";
357 } elsif ($type eq 'admin') {
358 open (FILE,"$path/parameters-top.inc") || die "could not find : $path/parameters-top.inc";
360 open (FILE,"$path/cat-top.inc") || die "could not find : $path/cat-top.inc";
365 # $string[$count]="<BLOCKQUOTE>";
371 @lines = &endmenu($type);
372 print join("", @lines);
374 Given a page type, or category, returns a set of lines of HTML which,
375 when concatenated, generate the menu at the bottom of the web page.
377 C<$type> may be one of C<issue>, C<opac>, C<member>, C<acquisitions>,
378 C<report>, C<circulation>, or something else, in which case the menu
379 will be for the catalog pages.
385 if ( ! defined $type ) { $type=''; }
386 # FIXME - It's bad form to die in a CGI script. It's even worse form
387 # to die without issuing an error message.
388 if ($type eq 'issue') {
389 open (FILE,"<$path/issues-bottom.inc") || die;
390 } elsif ($type eq 'opac') {
391 open (FILE,"<$path/opac-bottom.inc") || die;
392 } elsif ($type eq 'member') {
393 open (FILE,"<$path/members-bottom.inc") || die;
394 } elsif ($type eq 'acquisitions') {
395 open (FILE,"<$path/acquisitions-bottom.inc") || die;
396 } elsif ($type eq 'report') {
397 open (FILE,"<$path/reports-bottom.inc") || die;
398 } elsif ($type eq 'circulation') {
399 open (FILE,"<$path/circulation-bottom.inc") || die;
400 } elsif ($type eq 'admin') {
401 open (FILE,"<$path/parameters-bottom.inc") || die;
403 open (FILE,"<$path/cat-bottom.inc") || die;
412 $str = &mktablehdr();
415 Returns a string of HTML, which generates the beginning of a table
421 return("<table border=0 cellspacing=0 cellpadding=5>\n");
426 $str = &mktablerow($columns, $color, @column_data, $bgimage);
429 Returns a string of HTML, which generates a row of data inside a table
430 (see also C<&mktablehdr>, C<&mktableft>).
432 C<$columns> specifies the number of columns in this row of data.
434 C<$color> specifies the background color for the row, e.g., C<"white">
437 C<@column_data> is an array of C<$columns> elements, each one a string
438 of HTML. These are the contents of the row.
440 The optional C<$bgimage> argument specifies the pathname to an image
441 to use as the background for each cell in the row. This pathname will
442 used as is in the output, so it should be relative to the HTTP
448 #the last item in data may be a backgroundimage
451 # should this be a foreach (1..$cols) loop?
453 my ($cols,$colour,@data)=@_;
455 my $string="<tr valign=top bgcolor=$colour>";
457 if (defined $data[$cols]) { # if there is a background image
458 $string.="<td background=\"$data[$cols]\">";
459 } else { # if there's no background image
462 if (! defined $data[$i]) {$data[$i]="";}
463 if ($data[$i] eq "") {
464 $string.=" </td>";
466 $string.="$data[$i]</td>";
470 $string .= "</tr>\n";
479 Returns a string of HTML, which generates the end of a table
485 return("</table>\n");
488 # FIXME - This is never used.
490 my ($action,%inputs)=@_;
491 my $string="<form action=$action method=post>\n";
492 $string .= mktablehdr();
494 my @keys=sort keys %inputs;
498 while ( $i2<$count) {
499 my $value=$inputs{$keys[$i2]};
500 my @data=split('\t',$value);
501 #my $posn = shift(@data);
502 if ($data[0] eq 'hidden'){
503 $string .= "<input type=hidden name=$keys[$i2] value=\"$data[1]\">\n";
506 if ($data[0] eq 'radio') {
507 $text="<input type=radio name=$keys[$i2] value=$data[1]>$data[1]
508 <input type=radio name=$keys[$i2] value=$data[2]>$data[2]";
510 if ($data[0] eq 'text') {
511 $text="<input type=$data[0] name=$keys[$i2] value=\"$data[1]\">";
513 if ($data[0] eq 'textarea') {
514 $text="<textarea name=$keys[$i2] wrap=physical cols=40 rows=4>$data[1]</textarea>";
516 if ($data[0] eq 'select') {
517 $text="<select name=$keys[$i2]>";
519 while ($data[$i] ne "") {
520 my $val = $data[$i+1];
521 $text .= "<option value=$data[$i]>$val";
524 $text .= "</select>";
526 $string .= mktablerow(2,'white',$keys[$i2],$text);
527 #@order[$posn] =mktablerow(2,'white',$keys[$i2],$text);
531 #$string=$string.join("\n",@order);
532 $string .= mktablerow(2,'white','<input type=submit>','<input type=reset>');
533 $string .= mktableft;
534 $string .= "</form>";
539 $str = &mkform3($action,
540 $fieldname => "$fieldtype\t$fieldvalue\t$fieldpos",
545 Takes a set of arguments that define an input form, generates an HTML
546 string for the form, and returns the string.
548 C<$action> is the action for the form, usually the URL of the script
549 that will process it.
551 The remaining arguments define the fields in the form. C<$fieldname>
552 is the field's name. This is for the script's benefit, and will not be
555 C<$fieldpos> is an integer; fields will be output in order of
556 increasing C<$fieldpos>. This number must be unique: if two fields
557 have the same C<$fieldpos>, one will be picked at random, and the
558 other will be ignored. See below for special considerations, however.
560 C<$fieldtype> specifies the type of the input field. It may be one of
567 Generates a hidden field, used to pass data to the script without
568 showing it to the user. C<$fieldvalue> is the value.
572 Generates a pair of radio buttons, with values C<$fieldvalue> and
573 C<$fieldpos>. In both cases, C<$fieldvalue> and C<$fieldpos> will be
578 Generates a one-line text input field. It initially contains
583 Generates a four-line text input area. The initial text (which, of
584 course, may not contain any tabs) is C<$fieldvalue>.
588 Generates a list of items, from which the user may choose one. This is
589 somewhat different from other input field types, and should be
591 "myselectfield" => "select\t<label0>\t<text0>\t<label1>\t<text1>...",
592 where the C<text>N strings are the choices that will be presented to
593 the user, and C<label>N are the labels that will be passed to the
596 However, C<text0> should be an integer, since it will be used to
597 determine the order in which this field appears in the form. If any of
598 the C<label>Ns are empty, the rest of the list will be ignored.
605 my ($action, %inputs) = @_;
606 my $string = "<form action=\"$action\" method=\"post\">\n";
607 $string .= mktablehdr();
609 my @keys = sort(keys(%inputs)); # FIXME - Why do these need to be
614 while ($i2 < $count) {
615 my $value=$inputs{$keys[$i2]};
616 # FIXME - Why use a tab-separated string? Why not just use an
618 my @data=split('\t',$value);
620 if ($data[0] eq 'hidden'){
621 $order[$posn]="<input type=hidden name=$keys[$i2] value=\"$data[1]\">\n";
624 if ($data[0] eq 'radio') {
625 $text="<input type=radio name=$keys[$i2] value=$data[1]>$data[1]
626 <input type=radio name=$keys[$i2] value=$data[2]>$data[2]";
628 # FIXME - Is 40 the right size in all cases?
629 if ($data[0] eq 'text') {
630 $text="<input type=$data[0] name=$keys[$i2] value=\"$data[1]\" size=40>";
632 # FIXME - Is 40x4 the right size in all cases?
633 if ($data[0] eq 'textarea') {
634 $text="<textarea name=$keys[$i2] cols=40 rows=4>$data[1]</textarea>";
636 if ($data[0] eq 'select') {
637 $text="<select name=$keys[$i2]>";
639 while ($data[$i] ne "") {
640 my $val = $data[$i+1];
641 $text .= "<option value=$data[$i]>$val";
644 $text .= "</select>";
646 # $string=$string.mktablerow(2,'white',$keys[$i2],$text);
647 $order[$posn]=mktablerow(2,'white',$keys[$i2],$text);
651 my $temp=join("\n",@order);
653 $string .= mktablerow(1,'white','<input type=submit>');
654 $string .= mktableft;
655 $string .= "</form>";
656 # FIXME - A return statement, while not strictly necessary, would be nice.
661 $str = &mkformnotable($action, @inputs);
664 Takes a set of arguments that define an input form, generates an HTML
665 string for the form, and returns the string. Unlike C<&mkform2> and
666 C<&mkform3>, it does not put the form inside a table.
668 C<$action> is the action for the form, usually the URL of the script
669 that will process it.
671 The remaining arguments define the fields in the form. Each is an
672 anonymous array, e.g.:
674 &mkformnotable("/cgi-bin/foo",
675 [ "hidden", "hiddenvar", "value" ],
676 [ "text", "username", "" ]);
678 The first element of each argument defines its type. The remaining
679 ones are type-dependent. The supported types are:
683 =item C<[ "hidden", $name, $value]>
685 Generates a hidden field, for passing information to a script without
686 showing it to the user. C<$name> is the name of the field, and
687 C<$value> is the value to pass.
689 =item C<[ "radio", $groupname, $value ]>
691 Generates a radio button. Its name (or button group name) is C<$name>.
692 C<$value> is the value associated with the button; this is both the
693 value that will be shown to the user, and that which will be passed on
694 to the C<$action> script.
696 =item C<[ "text", $name, $inittext ]>
698 Generates a text input field. C<$name> specifies its name, and
699 C<$inittext> specifies the text that the field should initially
702 =item C<[ "textarea", $name ]>
704 Creates a 40x4 text area, named C<$name>.
706 =item C<[ "reset", $name, $label ]>
708 Generates a reset button, with name C<$name>. C<$label> specifies the
711 =item C<[ "submit", $name, $label ]>
713 Generates a submit button, with name C<$name>. C<$label> specifies the
721 my ($action,@inputs)=@_;
722 my $string="<form action=$action method=post>\n";
724 for (my $i=0; $i<$count; $i++){
725 if ($inputs[$i][0] eq 'hidden'){
726 $string .= "<input type=hidden name=$inputs[$i][1] value=\"$inputs[$i][2]\">\n";
728 if ($inputs[$i][0] eq 'radio') {
729 $string .= "<input type=radio name=$inputs[1] value=$inputs[$i][2]>$inputs[$i][2]";
731 if ($inputs[$i][0] eq 'text') {
732 $string .= "<input type=$inputs[$i][0] name=$inputs[$i][1] value=\"$inputs[$i][2]\">";
734 if ($inputs[$i][0] eq 'textarea') {
735 $string .= "<textarea name=$inputs[$i][1] wrap=physical cols=40 rows=4>$inputs[$i][2]</textarea>";
737 if ($inputs[$i][0] eq 'reset'){
738 $string .= "<input type=reset name=$inputs[$i][1] value=\"$inputs[$i][2]\">";
740 if ($inputs[$i][0] eq 'submit'){
741 $string .= "<input type=submit name=$inputs[$i][1] value=\"$inputs[$i][2]\">";
744 $string .= "</form>";
749 $str = &mkform2($action,
751 "$fieldpos\t$required\t$label\t$fieldtype\t$value0\t$value1\t...",
756 Takes a set of arguments that define an input form, generates an HTML
757 string for the form, and returns the string.
759 C<$action> is the action for the form, usually the URL of the script
760 that will process it.
762 The remaining arguments define the fields in the form. C<$fieldname>
763 is the field's name. This is for the script's benefit, and will not be
766 C<$fieldpos> is an integer; fields will be output in order of
767 increasing C<$fieldpos>. This number must be unique: if two fields
768 have the same C<$fieldpos>, one will be picked at random, and the
769 other will be ignored. See below for special considerations, however.
771 If C<$required> is the string C<R>, then the field is required, and
772 the label will have C< (Req.)> appended.
774 C<$label> is a string that will appear next to the input field.
776 C<$fieldtype> specifies the type of the input field. It may be one of
783 Generates a hidden field, used to pass data to the script without
784 showing it to the user. C<$value0> is its value.
788 Generates a pair of radio buttons, with values C<$value0> and
789 C<$value1>. In both cases, C<$value0> and C<$value1> will be shown to
790 the user, next to the radio button.
794 Generates a one-line text input field. Its size may be specified by
795 C<$value0>. The default is 40. The initial text of the field may be
796 specified by C<$value1>.
800 Generates a text input area. C<$value0> may be a string of the form
801 "WWWxHHH", in which case the text input area will be WWW columns wide
802 and HHH rows tall. The size defaults to 40x4.
804 The initial text (which, of course, may not contain any tabs) may be
805 specified by C<$value1>.
809 Generates a list of items, from which the user may choose one. Here,
810 C<$value1>, C<$value2>, etc. are a list of key-value pairs. In each
811 pair, the key specifies an internal label for a choice, and the value
812 specifies the description of the choice that will be shown the user.
814 If C<$value0> is the same as one of the keys that follows, then the
815 corresponding choice will initially be selected.
823 # No tests yet. Once tests are written,
824 # this function can be cleaned up with the following steps:
825 # turn the while loop into a foreach loop
826 # pull the nested if,elsif structure back up to the main level
827 # pull the code for the different kinds of inputs into separate
829 my ($action,%inputs)=@_;
830 my $string="<form action=$action method=post>\n";
831 $string .= mktablehdr();
834 while ( my ($key, $value) = each %inputs) {
835 my @data=split('\t',$value);
836 my $posn = shift(@data);
837 my $reqd = shift(@data);
838 my $ltext = shift(@data);
839 if ($data[0] eq 'hidden'){
840 $string .= "<input type=hidden name=$key value=\"$data[1]\">\n";
843 if ($data[0] eq 'radio') {
844 $text="<input type=radio name=$key value=$data[1]>$data[1]
845 <input type=radio name=$key value=$data[2]>$data[2]";
846 } elsif ($data[0] eq 'text') {
851 $text="<input type=$data[0] name=$key size=$size value=\"$data[2]\">";
852 } elsif ($data[0] eq 'textarea') {
853 my @size=split("x",$data[1]);
854 if ($data[1] eq "") {
858 $text="<textarea name=$key wrap=physical cols=$size[0] rows=$size[1]>$data[2]</textarea>";
859 } elsif ($data[0] eq 'select') {
860 $text="<select name=$key>";
863 while ($data[$i] ne "") {
864 my $val = $data[$i+1];
865 $text .= "<option value=\"$data[$i]\"";
866 if ($data[$i] eq $sel) {
867 $text .= " selected";
872 $text .= "</select>";
877 $order[$posn] =mktablerow(2,'white',$ltext,$text);
880 $string .= join("\n",@order);
881 $string .= mktablerow(2,'white','<input type=submit>','<input type=reset>');
882 $string .= mktableft;
883 $string .= "</form>";
891 Returns a string of HTML, the end of an HTML document.
896 return("</body></html>\n");
901 $str = &mklink($url, $text);
904 Returns an HTML string, where C<$text> is a link to C<$url>.
910 my $string="<a href=\"$url\">$text</a>";
916 $str = &mkheadr($type, $text);
919 Takes a header type and header text, and returns a string of HTML,
920 where C<$text> is rendered with emphasis in a large font size (not an
923 C<$type> may be 1, 2, or 3. A type 1 "header" ends with a line break;
924 Type 2 has no special tag at the end; Type 3 ends with a paragraph
931 # would it be better to make this more generic by accepting an optional
932 # argument with a closing tag instead of a numeric type?
937 $string="<FONT SIZE=6><em>$text</em></FONT><br>";
940 $string="<FONT SIZE=6><em>$text</em></FONT>";
943 $string="<FONT SIZE=6><em>$text</em></FONT><p>";
948 =item center and endcenter
950 print ¢er(), "This is a line of centered text.", &endcenter();
952 C<¢er> and C<&endcenter> take no arguments and return HTML tags
953 <CENTER> and </CENTER> respectively.
958 return ("<CENTER>\n");
962 return ("</CENTER>\n");
970 Returns a string of HTML that renders C<$text> in bold.
976 return("<b>$text</b>");
979 =item getkeytableselectoptions
981 $str = &getkeytableselectoptions($dbh, $tablename,
982 $keyfieldname, $descfieldname,
986 Builds an HTML selection box from a database table. Returns a string
987 of HTML that implements this.
989 C<$dbh> is a DBI::db database handle.
991 C<$tablename> is the database table in which to look up the possible
992 values for the selection box.
994 C<$keyfieldname> is field in C<$tablename>. It will be used as the
995 internal label for the selection.
997 C<$descfieldname> is a field in C<$tablename>. It will be used as the
998 option shown to the user.
1000 If C<$showkey> is true, then both the key and value will be shown to
1003 If the C<$default> argument is given, then if a value (from
1004 C<$keyfieldname>) matches C<$default>, it will be selected by default.
1008 #---------------------------------------------
1009 # Create an HTML option list for a <SELECT> form tag by using
1010 # values from a DB file
1011 sub getkeytableselectoptions {
1016 # FIXME - Obsolete argument
1017 $tablename, # name of table containing list of choices
1018 $keyfieldname, # column name of code to use in option list
1019 $descfieldname, # column name of descriptive field
1020 $showkey, # flag to show key in description
1021 $default, # optional default key
1023 my $selectclause; # return value
1027 $key, $desc, $orderfieldname,
1031 $dbh = C4::Context->dbh;
1034 $orderfieldname=$keyfieldname;
1036 $orderfieldname=$descfieldname;
1038 $query= "select $keyfieldname,$descfieldname
1040 order by $orderfieldname ";
1041 print "<PRE>Query=$query </PRE>\n" if $debug;
1042 $sth=$dbh->prepare($query);
1044 while ( ($key, $desc) = $sth->fetchrow) {
1045 if ($showkey || ! $desc ) { $desc="$key - $desc"; }
1046 $selectclause.="<option";
1047 if (defined $default && $default eq $key) {
1048 $selectclause.=" selected";
1050 $selectclause.=" value='$key'>$desc\n";
1051 print "<PRE>Sel=$selectclause </PRE>\n" if $debug;
1053 return $selectclause;
1054 } # sub getkeytableselectoptions
1056 #---------------------------------
1058 END { } # module clean-up code here (global destructor)
1067 Koha Developement team <info@koha.org>