AddressBook
view release on metacpan or search on metacpan
lib/AddressBook/DB/HTML.pm view on Meta::CPAN
=back
=cut
use strict;
use AddressBook;
use Carp;
use File::Basename;
use vars qw($VERSION @ISA);
use CGI qw(:standard);
$VERSION = '0.14';
@ISA = qw(AddressBook);
sub new {
my $class = shift;
my $self = {};
bless ($self,$class);
my %args = @_;
foreach (keys %args) {
$self->{$_} = $args{$_};
}
unless ($self->{write_format}) {$self->{write_format} = 'table(Tr({-valign=>"TOP"},[map{td(["$_:",$attributes{$_}])} keys %attributes]))'}
unless ($self->{form_format}) {$self->{form_format} = 'table(Tr({-valign=>"TOP"},[map{td([$_,$attributes{$_}])} keys %attributes]))'}
unless ($self->{intra_attr_sep}) {$self->{intra_attr_sep} = '<br>'}
return $self;
}
sub write {
my $self = shift;
my $class = ref $self || croak "Not a method call";
my $entry = shift;
my ($format,$ret,%attributes,$key,$url,$desc);
$entry->calculate;
my $attr = $entry->get(db=>$self->{db_name});
foreach $key (keys %{$attr}) {
if ($attr->{$key}->{meta}->{type} =~ /^(text|textblock|boolean|date|phone)$/) {
$attributes{$key} = join ($self->{intra_attr_sep},@{$attr->{$key}->{value}});
} elsif ($attr->{$key}->{meta}->{type} eq "url") {
$attributes{$key} = join ($self->{intra_attr_sep},
map {a({-href=>$_},$_)} @{$attr->{$key}->{value}});
} elsif ($attr->{$key}->{meta}->{type} eq "lurl") {
$attributes{$key} = join ($self->{intra_attr_sep},
map {
($url,$desc) = split (/\s+/, $_, 2);
$desc ||= $url;
a({-href=>$url},$desc)} @{$attr->{$key}->{value}});
} elsif ($attr->{$key}->{meta}->{type} eq "email") {
$attributes{$key} = join ($self->{intra_attr_sep},
map {a({-href=>"mailto:$_"},$_)} @{$attr->{$key}->{value}});
}
}
$format = $self->{write_format};
foreach (values %{$self->{config}->{db2generic}->{$self->{db_name}}}) {
$format =~ s/\$($_)/\$attributes{$1}/g;
}
my @attributes = (sort {$attr->{$a}->{meta}->{order} <=> $attr->{$b}->{meta}->{order}} (keys %attributes));
$format =~ s'keys %attributes'@attributes'g;
eval qq{\$ret = $format}; warn "Syntax error in HTML backend \"write_format\": $@" if $@;
return $ret;
}
sub entry_form {
my $self = shift;
my $class = ref $self || croak "Not a method call";
my $entry = shift;
my $formname = shift;
my ($format,$ret,$key,$option,@options,%selected,$i,%result,$default);
#$entry->calculate;
my $attr = $entry->get(db=>$self->{db_name});
my %attributes = %{$entry->get(db=>$self->{db_name},values_only=>1)};
foreach $key (keys %attributes) {
if ($attr->{$key}->{meta}->{type} =~ /^(text|url|lurl|email|date|phone)$/) {
if ($attr->{$key}->{meta}->{read_only} =~ /yes/i) {
$result{$key} = join ($self->{intra_attr_sep},
@{$attributes{$key}});
} else {
$result{$key} = join ($self->{intra_attr_sep},
map {textfield(-name=>$key,
-size=>30,
-override=>1,
-default=>$_)} @{$attributes{$key}});
}
} elsif ($attr->{$key}->{meta}->{type} eq "textblock") {
if ($attr->{$key}->{meta}->{read_only} =~ /yes/i) {
$result{$key} = join ($self->{intra_attr_sep},
@{$attributes{$key}});
} else {
$result{$key} = join ($self->{intra_attr_sep},
map {textarea(-name=>$key,
-columns=>30,
-rows=>10,
-override=>1,
-default=>$_)} @{$attributes{$key}});
}
} elsif ($attr->{$key}->{meta}->{type} eq "select") {
if ($attr->{$key}->{meta}->{read_only} =~ /yes/i) {
$result{$key} = join ($self->{intra_attr_sep},
@{$attributes{$key}});
} else {
foreach (@{$attributes{$key}}) {
$selected{$_} = 1;
}
@options = split ",",$attr->{$key}->{meta}->{values};
$result{$key} = "<select name=\"$key\" size=";
$result{$key} .= $#options + 1;
if ($attr->{$key}->{meta}->{non_multiple} !~ /yes/i) {
$result{$key} .= " multiple";
}
$result{$key} .= ">";
foreach $option (@options) {
if (exists $selected{$option}) {
$result{$key} .= "<option selected>$option";
} else {
$result{$key} .= "<option>$option";
}
}
$result{$key} .= "</select>";
}
} elsif ($attr->{$key}->{meta}->{type} eq "boolean") {
@options=();
for ($i=0;$i<=$#{$attributes{$key}};$i++) {
if ($attr->{$key}->{meta}->{read_only} =~ /yes/i) {
$options[$i] = $attributes{$key}->[$i];
} else {
if ($attributes{$key}->[$i] =~ /yes/i) {
$options[$i] = "<input type=checkbox name=\"_${key}_$i\" value=\"yes\" checked>";
} else {
$options[$i] = "<input type=checkbox name=\"_${key}_$i\" value=\"yes\">";
}
#$options[$i] = "<table><tr><td>";
#$options[$i] .= radio_group(-name=>"_${key}_$i",
#-values=>['Yes','No'],
#-default=>$attributes{$key}->[$i] || 'empty',
#-override=>1,
#-columns=>1);
#$options[$i] .= "</td>";
#if ($formname) {
#$options[$i] .= "<td><input type=button value=Clear onClick=\"
#document.$formname.elements[\'_${key}_$i\'][0].checked=0;
#document.$formname.elements[\'_${key}_$i\'][1].checked=0;\"></td>";
#}
#$options[$i] .= "</tr></table>";
}
}
$result{$key} = join ($self->{intra_attr_sep},@options);
$result{$key} .= "<input type=hidden name=\"_${key}_count\" value=$#options>";
}
}
%attributes = %result;
$format = $self->{form_format};
foreach (values %{$self->{config}->{db2generic}->{$self->{db_name}}}) {
$format =~ s/\$($_)/\$attributes{$1}/g;
}
my @attributes = (sort {$attr->{$a}->{meta}->{order} <=> $attr->{$b}->{meta}->{order}} (keys %attributes));
$format =~ s'keys %attributes'@attributes'g;
eval qq{\$ret = $format}; warn "Syntax error in HTML backend \"form_format\": $@" if $@;
return $ret;
}
sub read_from_args {
my $self = shift;
my $class = ref $self || croak "Not a method call";
my $query = shift;
my ($key,$canon_field_name,@value,$i,$key_count);
my $entry = AddressBook::Entry->new(config=>$self->{config});
foreach $key (keys %{$self->{config}->{db2generic}->{$self->{db_name}}}) {
$canon_field_name = $self->{config}->{db2generic}->{$self->{db_name}}->{$key};
if ($self->{config}->{meta}->{$canon_field_name}->{type} eq "boolean" ) {
$key_count = $query->param("_${key}_count");
if ((defined $key_count) && ($key_count >= 0)) {
for ($i=0;$i<=$key_count;$i++) {
if ($query->param("_${key}_$i") =~ /yes/i) {
$value[$i] = "Yes";
} else {
$value[$i] = "No";
}
}
}
$entry->add(db=>$self->{db_name},attr=>{$key=>\@value});
} else {
foreach ($query->param($key)) {
$entry->add(db=>$self->{db_name},attr=>{$key=>$_});
}
}
}
$entry->chop;
return $entry;
}
1;
__END__
=head1 AUTHOR
Mark A. Hershberger, <mah@everybody.org>
David L. Leigh, <dleigh@sameasiteverwas.net>
=head1 SEE ALSO
L<AddressBook>,
L<AddressBook::Config>,
L<AddressBook::Entry>.
=cut
( run in 0.946 second using v1.01-cache-2.11-cpan-39bf76dae61 )