CGI-FormBuilder
view release on metacpan or search on metacpan
lib/CGI/FormBuilder.pm view on Meta::CPAN
###########################################################################
# Note: Documentation has grown so massive it is now in FormBuilder.pod
package CGI::FormBuilder;
use Carp;
use strict;
use warnings;
no warnings 'uninitialized';
use Scalar::Util qw(weaken);
use CGI::FormBuilder::Util;
use CGI::FormBuilder::Field;
use CGI::FormBuilder::Messages;
our $VERSION = '3.20';
our $AUTOLOAD;
# Default options for FormBuilder
lib/CGI/FormBuilder.pm view on Meta::CPAN
for (@{$self->{fields}}) {
my %fprop = %{$self->{fieldopts}{$_} || {}}; # field properties
if (ref $_ =~ /^CGI::FormBuilder::Field/i) {
# is an existing Field object, so update its properties
$_->field(%fprop);
} else {
# init a new one
$fprop{name} = "$_";
$_ = $self->new_field(%fprop);
weaken($_->{_form});
}
debug 2, "push \@(@ftmp), $_";
weaken($self->{fieldrefs}{"$_"} = $_);
push @ftmp, $_;
}
# stringifiable objects (overwrite previous container)
$self->{fields} = \@ftmp;
# setup values
$self->values($self->{values}) if $self->{values};
debug 1, "field creation done, list = (@ftmp)";
lib/CGI/FormBuilder.pm view on Meta::CPAN
delete $args->{name}; # segfault??
return $f->field(%$args); # set args, get value back
}
# non-existent field, and no args, so assume we're checking for it
return unless keys %$args > 1;
# if we're still in here, we need to init a new field
# push it onto our mail fields array, just like initfields()
my $f = $self->new_field(%$args);
weaken($self->{fieldrefs}{"$f"} = $f);
weaken($f->{_form});
weaken($f->{fieldrefs}{"$f"});
push @{$self->{fields}}, $f;
return $f->value;
}
sub new_field {
my $self = shift;
my $args = arghash(@_);
puke "Need a name for \$form->new_field()" unless exists $args->{name};
debug 1, "called \$form->new_field($args->{name})";
lib/CGI/FormBuilder.pm view on Meta::CPAN
# modifying $self object is ok because it's compatible
$self->{template} = {
type => 'HTML',
filename => $self->{template},
};
$ref = 'HASH'; # tricky
debug 2, "rewrote 'template' option since found filename";
}
# Get ourselves ready
$self->{prepare} = $self->prepare;
# weaken($self->{prepare});
my $opt;
if ($ref eq 'HASH') {
# must copy to avoid destroying
$opt = { %{ $self->{template} } };
$mod = ucfirst(delete $opt->{type} || 'HTML');
} elsif ($ref eq 'CODE') {
# subroutine wrapper
return &{$self->{template}}($self);
} elsif (UNIVERSAL::can($self->{template}, 'render')) {
lib/CGI/FormBuilder.pm view on Meta::CPAN
}
# dispatch to engine, prepend header
debug 1, "returning $tmpl->render($self->{prepare})";
my $ret = $self->header . $tmpl->render($self->{prepare});
#we have a circular reference but we need to kill it after setting up return
weaken($self->{prepare});
return $ret;
}
# These routines should be moved to ::Mail or something since they're rarely used
sub mail () {
# This is a very generic mail handler
my $self = shift;
my $args = arghash(@_);
# Where does the mailer live? Must be sendmail-compatible
( run in 0.772 second using v1.01-cache-2.11-cpan-65fba6d93b7 )