📄 babelkit.pm
字号:
package DBIx::BabelKit;use strict;use warnings;use Carp;use vars qw( $VERSION );$VERSION = '1.05';=head1 NAMEDBIx::BabelKit - Universal Multilingual Code Table Interface=head1 SYNOPSIS use DBIx::BabelKit; my $bk = new DBIx::BabelKit($dbh, table => 'bk_code', getparam => sub { $cgi->param(shift) }, getparams => sub { $cgi->param(shift.'[]') } );=cut### See the rest of the pod documentation at the end of this file. ###sub new { my $class = shift; my $dbh = shift; my $args = ref($_[0]) ? shift : { @_ }; my $self = {}; bless $self, $class; croak 'DBIx::BabelKit->new($dbh): $dbh is not an object' unless ref $dbh; $self->{dbh} = $dbh; $self->{table} = $args->{table} || 'bk_code'; $self->{getparam} = $args->{getparam}; $self->{getparams} = $args->{getparams}; $self->{native} = $self->_find_native; croak "DBIx::BabelKit::new: unable to determine native language" . " Check table '$self->{table}' for code_admin/code_admin record." unless $self->{native}; return $self;}# # # HTML display methods.sub desc { my $self = shift; return &htmlspecialchars( $self->render(@_) );}sub ucfirst { my $self = shift; return CORE::ucfirst( $self->desc(@_) );}sub ucwords { my $self = shift; my $str = $self->desc(@_); $str =~ s/(^|\s)([a-z])/$1\u$2/g; return $str;}# # # Data methods.sub render { my $self = shift; my $code_desc = $self->data(@_); if ($code_desc eq '') { $code_desc = $self->data($_[0], $self->{native}, $_[2]); if ($code_desc eq '') { $code_desc = $_[2] || ''; } } return $code_desc;}sub data { my $self = shift; my $code_set = shift; my $code_lang = shift; my $code_code = shift; $code_code .= ''; # DBI needs strings here. $self->{data_sth} = $self->{dbh}->prepare(" select code_desc from $self->{table} where code_set = ? and code_lang = ? and code_code = ? ") unless $self->{data_sth}; $self->{data_sth}->execute($code_set, $code_lang, $code_code); my $code_desc = $self->{data_sth}->fetchrow; $code_desc = '' unless defined $code_desc; # Avoid warnings. return $code_desc;}sub param { my $self = shift; return $self->data($_[0], $self->{native}, $_[1]);}# # # HTML select single value methods:sub select { my $self = shift; my $code_set = shift; my $code_lang = shift; my $args = ref($_[0]) ? shift : { @_ }; my $var_name = $args->{var_name} || $code_set; my $value = $args->{value}; my $default = $args->{default}; my $subset = $args->{subset}; my $options = $args->{options}; my $select_prompt = $args->{select_prompt}; my $blank_prompt = $args->{blank_prompt}; # Variable setup. $value = $self->_getparam($var_name, $value, $default); my $Subset = &keyme($subset); $options = $options ? " $options" : ''; $select_prompt = '' unless defined $select_prompt; $blank_prompt = '' unless defined $blank_prompt; # Drop down box. my $select = "<select name=\"$var_name\"$options>\n"; # Blank options. my $selected = ''; if ($value eq '') { if ($select_prompt eq '') { $select_prompt = $self->ucwords('code_set', $code_lang, $code_set) . '?'; } $select .= "<option value=\"\" selected>$select_prompt\n"; $selected = 1; } elsif ($blank_prompt ne '') { $select .= "<option value=\"\">$blank_prompt\n"; } # Show code set options. my $set_list = $self->full_set($code_set, $code_lang); for my $row ( @$set_list ) { my ($code_code, $code_desc) = @$row; next if ($Subset && !$Subset->{$code_code} && $code_code ne $value); $code_desc = htmlspecialchars(CORE::ucfirst($code_desc)); if ($code_code eq $value) { $selected = 1; $select .= "<option value=\"$code_code\" selected>$code_desc\n"; } elsif ($row->[3] ne 'd') { $select .= "<option value=\"$code_code\">$code_desc\n"; } } # Show a missing value. if (!$selected) { $select .= "<option value=\"$value\" selected>$value\n"; } $select .= "</select>\n"; return $select;}sub radio { my $self = shift; my $code_set = shift; my $code_lang = shift; my $args = ref($_[0]) ? shift : { @_ }; my $var_name = $args->{var_name} || $code_set; my $value = $args->{value}; my $default = $args->{default}; my $subset = $args->{subset}; my $options = $args->{options}; my $blank_prompt = $args->{blank_prompt}; my $sep = $args->{sep}; # Variable setup. $value = $self->_getparam($var_name, $value, $default); my $Subset = &keyme($subset); $options = $options ? " $options" : ''; $blank_prompt = '' unless defined $blank_prompt; $sep = "<br>\n" unless defined $sep; # Blank options. my $select = ''; my $selected = ''; if ($value eq '') { $selected = 1; if ($blank_prompt ne '') { $select .= "<input type=\"radio\" name=\"$var_name\"$options"; $select .= " value=\"\" checked>$blank_prompt"; } } else { if ($blank_prompt ne '') { $select .= "<input type=\"radio\" name=\"$var_name\"$options"; $select .= " value=\"\">$blank_prompt"; } } # Show code set options. my $set_list = $self->full_set($code_set, $code_lang); for my $row ( @$set_list ) { my ($code_code, $code_desc) = @$row; next if ($Subset && !$Subset->{$code_code} && $code_code ne $value); $code_desc = htmlspecialchars(CORE::ucfirst($code_desc)); if ( $code_code eq $value ) { $selected = 1; $select .= $sep if $select; $select .= "<input type=\"radio\" name=\"$var_name\"$options"; $select .= " value=\"$code_code\" checked>$code_desc"; } elsif ($row->[3] ne 'd') { $select .= $sep if $select; $select .= "<input type=\"radio\" name=\"$var_name\"$options"; $select .= " value=\"$code_code\">$code_desc"; } } # Show missing values. if (!$selected) { $select .= $sep if $select; $select .= "<input type=\"radio\" name=\"$var_name\"$options"; $select .= " value=\"$value\" checked>$value"; } return $select;}# # # HTML select multiple value methods:sub multiple { my $self = shift; my $code_set = shift; my $code_lang = shift; my $args = ref($_[0]) ? shift : { @_ }; my $var_name = $args->{var_name} || $code_set; my $value = $args->{value}; my $default = $args->{default}; my $subset = $args->{subset}; my $options = $args->{options}; my $size = $args->{size}; # Variable setup. my $Value = $self->_getparams($var_name, $value, $default); my $Subset = &keyme($subset); $options = $options ? " $options" : ''; # Select multiple box. my $select = "<select multiple name=\"$var_name"."[]\"$options"; $select .= " size=\"$size\"" if ($size); $select .= ">\n"; # Show code set options. my $set_list = $self->full_set($code_set, $code_lang); for my $row ( @$set_list ) { my ($code_code, $code_desc) = @$row; next if ($Subset && !$Subset->{$code_code} && !$Value->{$code_code}); $code_desc = htmlspecialchars(CORE::ucfirst($code_desc)); if ( $Value->{$code_code} ) { $select .= "<option value=\"$code_code\" selected>$code_desc\n"; delete $Value->{$code_code}; } elsif ($row->[3] ne 'd') { $select .= "<option value=\"$code_code\">$code_desc\n"; } } # Show missing values. for my $code_code ( keys %$Value ) { $select .= "<option value=\"$code_code\" selected>$code_code\n"; } $select .= "</select>\n"; return $select;}sub checkbox { my $self = shift; my $code_set = shift; my $code_lang = shift; my $args = ref($_[0]) ? shift : { @_ }; my $var_name = $args->{var_name} || $code_set; my $value = $args->{value}; my $default = $args->{default}; my $subset = $args->{subset}; my $options = $args->{options}; my $sep = $args->{sep}; # Variable setup. my $Value = $self->_getparams($var_name, $value, $default); my $Subset = &keyme($subset); $options = $options ? " $options" : ''; $sep = "<br>\n" unless defined $sep; # Show code set options. my $select; my $set_list = $self->full_set($code_set, $code_lang); for my $row ( @$set_list ) { my ($code_code, $code_desc) = @$row; next if ($Subset && !$Subset->{$code_code} && !$Value->{$code_code}); $code_desc = htmlspecialchars(CORE::ucfirst($code_desc)); if ( $Value->{$code_code} ) { $select .= $sep if $select; $select .= "<input type=\"checkbox\" name=\"$var_name"."[]\""; $select .= "$options value=\"$code_code\" checked>$code_desc"; delete $Value->{$code_code}; } elsif ($row->[3] ne 'd') { $select .= $sep if $select; $select .= "<input type=\"checkbox\" name=\"$var_name"."[]\""; $select .= "$options value=\"$code_code\">$code_desc"; } } # Show missing values. for my $code_code ( keys %$Value ) { $select .= $sep if $select; $select .= "<input type=\"checkbox\" name=\"$var_name"."[]\""; $select .= "$options value=\"$code_code\" checked>$code_code"; } return $select;}# # # Code Set Methods.sub lang_set { my $self = shift; my $code_set = shift; my $code_lang = shift; $self->{set_sth} = $self->{dbh}->prepare(" select code_code, code_desc, code_order, code_flag from $self->{table} where code_set = ? and code_lang = ? order by code_order, code_code ") unless $self->{set_sth}; $self->{set_sth}->execute($code_set, $code_lang); return $self->{set_sth}->fetchall_arrayref;}sub full_set { my $self = shift;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -