formbuilder toTemplateVars is now complete and tested

This commit is contained in:
Doug Bell 2011-04-12 21:26:20 -05:00
parent 67918361e6
commit 04a420e0bd
7 changed files with 254 additions and 105 deletions

View file

@ -1,6 +1,7 @@
package WebGUI::FormBuilder;
use strict;
use WebGUI::BestPractices;
use Moose;
use MooseX::Storage;
@ -70,6 +71,19 @@ The name of the form. Not required, but recommended.
has 'name' => ( is => 'rw' );
=head2 class
The class name for the element. Defaults to "wg-formbuilder" and pulls in the
style rules from extras/css/wg-formbuilder.css. Multiple class names may be
seperated by a space.
You should probably keep the default class and either add additional classes
or override .wg-formbuilder in your custom CSS files.
=cut
has class => ( is => 'rw', default => 'wg-formbuilder' );
=head2 extras
Any extra things to add to the <form> tag. Optional.
@ -157,7 +171,7 @@ Get the header for this form.
sub getHeader {
my ( $self ) = @_;
my @attrs = qw{ action method name enctype };
my @attrs = qw{ action method name enctype class };
my $attrs = join " ", map { qq{$_="} . $self->$_ . qq{"} } grep { $self->$_ } @attrs;
my $html = sprintf '<form %s %s>', $attrs, $self->extras;
@ -177,10 +191,11 @@ sub toHtml {
my ( $self ) = @_;
my ( $style, $url ) = $self->session->quick(qw{ style url });
$style->setCss( $url->extras('hoverhelp.css'));
$style->setCss( $url->extras('css/wg-formbuilder.css') );
$style->setScript( $url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js') );
$style->setScript( $url->extras('yui/build/container/container-min.js') );
$style->setScript( $url->extras('hoverhelp.js') );
$style->setCss( $url->extras('hoverhelp.css'));
my $html = $self->getHeader;
# Add individual objects
@ -199,97 +214,23 @@ sub toHtml {
#----------------------------------------------------------------------------
=head2 toTemplateVars ( prefix, [var] )
=head2 toTemplateVars ( prefix, var )
Get the template variables for the form's controls with the given prefix.
C<var> is an optional hashref to add the variables to.
Get the template variables for the form's controls with the given prefix. C<prefix>
defaults to "form_". C<var> is an optional hashref to add the variables to.
=cut
sub toTemplateVars {
my ( $self, $prefix, $var ) = @_;
$prefix ||= "form";
$var ||= {};
around toTemplateVars => sub {
my ( $orig, $self, $prefix, $var ) = @_;
$prefix ||= "form_";
$var = $self->$orig($prefix, $var);
# $prefix_header
$var->{ "${prefix}_header" } = $self->getHeader;
# $prefix_footer
$var->{ "${prefix}_footer" } = $self->getFooter;
# $prefix_fieldloop
# name -- for comparisons
# field
# label -- includes hoverhelp
# label_nohover
# pretext
# subtext
# hoverhelp -- The text. For use with label_nohover
# $prefix_field_$fieldName
if ( @{$self->fields} ) {
my $fieldLoop = [];
$var->{ "${prefix}_fieldloop" } = $fieldLoop;
for my $field ( @{$self->fields} ) {
my $name = $field->get('name');
my $props = $field->toTemplateVars;
# Add the whole field to the vars
$props->{ field } = $field->toHtml;
$var->{ "${prefix}_field_${name}" } = $props->{ field };
push @{$fieldLoop}, $props;
# Individual accessor
for my $key ( keys %{$props} ) {
$var->{ "${prefix}_field_${name}_${key}" } = $props->{$key};
}
# Loop accessor
push @{$var->{ "${prefix}_field_${name}_loop" }}, $props;
}
}
# $prefix_fieldsetloop
# name
# legend
# label -- same as legend
# fieldloop
# ...
# fieldsetloop
# ...
# tabloop
# ...
# $prefix_fieldset_$fieldsetName
if ( @{$self->fieldsets} ) {
my $fieldsetLoop = [];
$var->{ "${prefix}_fieldsetloop" } = $fieldsetLoop;
for my $fieldset ( @{$self->fieldsets} ) {
my $name = $fieldset->name;
my $props = $fieldset->toTemplateVars;
for my $key ( keys %{$props} ) {
$var->{ "${prefix}_fieldset_${name}_${key}" } = $props->{key};
}
push @{$fieldsetLoop}, $props;
}
}
# $prefix_tabsetloop
# name
# tabloop
# fieldloop
# ...
# fieldsetloop
# ...
# tabsetloop
# ...
# $prefix_tabset_$tabsetName
if ( @{$self->tabsets} ) {
my $tabsetLoop = [];
$var->{ "${prefix}_tabsetloop" } = $tabsetLoop;
for my $tabset ( @{$self->tabsets} ) {
my $name = $tabset->name;
my $props = $tabset->toTemplateVars;
for my $key ( keys %{$props} ) {
$var->{ "${prefix}_tabset_${name}_${key}" } = $props->{key};
}
push @{$tabsetLoop}, $props;
}
}
$var->{ "${prefix}header" } = $self->getHeader;
$var->{ "${prefix}footer" } = $self->getFooter;
return $var;
}
};
=head1 TEMPLATES

View file

@ -144,8 +144,13 @@ sub toHtml {
=cut
sub toTemplateVars {
}
around toTemplateVars => sub {
my ( $orig, $self ) = @_;
my $var = $self->$orig();
$var->{ name } = $self->name;
$var->{ label } = $self->label;
$var->{ legend } = $self->label;
return $var;
};
1;

View file

@ -91,9 +91,10 @@ sub addFieldAt {
for my $obj ( @{$self->objects} ) {
next unless blessed $obj;
# A field isn't allowed to have child objects
if ( !$obj->can('does') || !$obj->does('WebGUI::FormBuilder::Role::HasObjects') ) {
push @{$self->fields}, $obj;
}
next if ( $obj->can('does') && $obj->does('WebGUI::FormBuilder::Role::HasObjects') );
next if $obj->isa('WebGUI::FormBuilder::Tabset');
push @{$self->fields}, $obj;
}
return $field;
}

View file

@ -14,7 +14,7 @@ package WebGUI::FormBuilder::Role::HasObjects;
=cut
use WebGUI::BestPractices;
use Moose::Role;
has 'objects' => (
@ -80,5 +80,69 @@ sub addObjectAt {
return $object;
}
=head2 toTemplateVars ( prefix, var )
Get all the objects as a set of template vars with the given prefix. $var is
an optional hashref to add the variables to.
=cut
sub toTemplateVars {
my ( $self, $prefix, $var ) = @_;
$prefix ||= "";
$var ||= {};
# Loop over all objects, adding to appropriate template loops
for my $obj ( @{ $self->objects } ) {
# Prepare our object's variables and add to object type loop
my $props = {};
given ( blessed $obj ) {
when ( undef ) {
# Treat as raw template properties
$props = $obj;
}
when ( $_->isa( 'WebGUI::FormBuilder::Tabset' ) ) {
my $name = $obj->name;
$props = $obj->toTemplateVars;
for my $key ( keys %{$props} ) {
$var->{ "${prefix}tabset_${name}_${key}" } = $props->{$key};
}
push @{$var->{ "${prefix}tabsetloop" }}, $props;
}
when ( $_->isa( 'WebGUI::FormBuilder::Fieldset' ) ) {
my $name = $obj->name;
$props = $obj->toTemplateVars;
for my $key ( keys %{$props} ) {
$var->{ "${prefix}fieldset_${name}_${key}" } = $props->{$key};
}
push @{$var->{ "${prefix}fieldsetloop" }}, $props;
}
# Form field objects
when ( $_->isa( 'WebGUI::Form::Control' ) ) {
my $name = $obj->get('name');
$props = $obj->toTemplateVars;
# Add the whole field to the vars
$props->{ field } = $obj->toHtmlWithWrapper;
$props->{ field_input } = $obj->toHtml;
$var->{ "${prefix}field_${name}" } = $props->{ field };
# Add to fieldloop
push @{$var->{"${prefix}fieldloop"}}, $props;
# Individual accessors
for my $key ( keys %{$props} ) {
$var->{ "${prefix}field_${name}_${key}" } = $props->{$key};
}
# Loop accessor
push @{$var->{ "${prefix}field_${name}_loop" }}, $props;
}
}
# Add to the global object loop
push @{ $var->{ "${prefix}objects" } }, $props;
}
return $var;
}
1;

View file

@ -105,4 +105,20 @@ sub toHtml {
return $html;
}
#----------------------------------------------------------------------------
=head2 toTemplateVars ( )
Get the template vars for this tab
=cut
around toTemplateVars => sub {
my ( $orig, $self ) = @_;
my $var = $self->$orig();
$var->{ name } = $self->name;
$var->{ label } = $self->label;
return $var;
};
1;

View file

@ -71,7 +71,6 @@ has 'session' => (
);
with Storage( format => 'JSON' );
with 'WebGUI::FormBuilder::Role::HasObjects';
#----------------------------------------------------------------------------
@ -90,9 +89,15 @@ sub BUILDARGS {
#----------------------------------------------------------------------------
sub addTab {
my ( $self, $tab ) = @_;
my $self = shift;
my $tab;
if ( scalar @_ == 1 ) {
$tab = $_[0];
}
else {
$tab = WebGUI::FormBuilder::Tab->new( $self->session, @_ );
}
push @{$self->tabs}, $tab;
$self->addObject( $tab );
return $tab;
}
@ -151,13 +156,14 @@ sub toTemplateVars {
my ( $self ) = @_;
my $var = {};
$var->{ name } = $self->name;
$var->{ tabs } = [];
for my $tab ( $self->tabs ) {
for my $tab ( @{ $self->tabs } ) {
my $name = $tab->name;
my $props = $tab->toTemplateVars;
$var->{ "tabs_${name}" } = $tab->toHtml;
push @{$var->{tabs}}, $props;
for my $key ( %$props ) {
for my $key ( keys %{$props} ) {
$var->{ "tabs_${name}_${key}" } = $props->{$key};
}
}