I've done a first cut at modifying CGI::FormBuilder to use ASP's $Response->Include() 
as a templating mechanism.

In an ASP file your form is created:

<<<

<html>
<head>
<title>Try Formbuilder with ASP</title>
</head>
<body>
<h2>A really simple CGI::FormBuilder example using ASP</h2>
<!-- before ASP/CGI::FormBuilder stuff -->
<%

require CGI::FormBuilder;

my $form = CGI::FormBuilder->new
(
    header => 0,
    method => 'GET',
    fields => [qw/email /],
    javascript => 0,
    reset => 0,
    required => [qw/email /],
    validate => { email => 'EMAIL' },
    sticky => 1,  # 0 or 1
);

$form->field ( name => 'email', validate => 'EMAIL', size => 25 );

if ( $form->submitted( ) && $form->validate( ) )
{
    print $form->confirm( );
}
else
{
    print $form->render
    (
        submit =>  'Submit',
        template => {
            type => 'ASPInclude',
            template => 'inc_show_params.asp',
            response => $Response,
        }
    );

}
%>

>>>



Note, in particular, the $form->render() method at the bottom. I pass $Response as a 
parameter as its a simple and effective way to ensure 
that CGI::FormBuilder gets the appropriate $Response object (which may be in some odd 
namespace).

The file inc_show_params.asp is a demo that just dumps the parameters:

<<<
<p>This is my asp file

<p>Below is a dump of all arguments:
<p><hr>
<p><pre>
<%

use Data::Dumper;
$Data::Dumper::Indent = 1;

my ( @args ) = @_;
print $Server->HTMLEncode( Data::Dumper->Dump([@args], [qw(*args)]));

%>
</pre></p><hr>
>>>


The code below is a more-or-less replacement using ASP for the default 
CGI::FormBuilder style:

<<<
<p>This is a demo form - this content is in a separate ASP file included by 
CGI::FormBuilder.
<p>Fields marked with "*" must be supplied.

<%

my ( $formRef ) = @_;

my ( $fieldsArrayRef ) = $formRef->{ 'fields' };

if ( $formRef->{'invalid'}) { %>

<p><b>There were <%= $formRef->{'invalid'} %> error<%= ( $formRef->{'invalid'} > 1 ? 
's' : '' ) %> in your submission.</b></p>

<%
}
%>

<p>
<%= $formRef->{ 'start' } %>
<table border="1" cellpadding="5">

<%

foreach my $fieldRef ( @{$fieldsArrayRef}) {

%>

<tr>
 <td>
  <%= ( $fieldRef->{ 'invalid' } ? '<font color="red">' : '' ) %>
  <%= $fieldRef->{ 'label' } %>
  <%= ( $fieldRef->{ 'required' } ? '*' : '' ) %>
  <%= ( $fieldRef->{ 'invalid' } ? '</font>' : '' ) %>
 </td>
 <td><%= $fieldRef->{ 'field' } %>
 </td>
</tr>

<% } %>

<tr>
 <td colspan="2" align="center">
  <%= $formRef->{ 'reset' } %>
  <%= $formRef->{ 'submit' } %>
 </td>
</tr>
</table>
<%= $formRef->{ 'end' } %>
>>>



Phew... hope this post isn't too long! 


To achieve all this was surprisingly easy:

> diff /usr/local/lib/site_perl/CGI/FormBuilder.pm 
>/my/dodgy/CGI/Customised_FormBuilder.pm 

953c955
<         if (ref $args{template} eq 'HASH' && $args{template}{type} eq 'TT2') {
---
>         if (ref $args{template} eq 'HASH' && $args{template}{type} =~ 
>m/^(TT2|ASPInclude)$/ ) { # added by Ellers
1178a1183,1207
> 
>         } elsif ($tmpltype eq 'ASPInclude') { # Added by Ellers
> 
>             eval { require Apache::ASP };
>             puke "Can't use templates because the Apache::ASP is not installed!" if 
>$@; 
> 
>                       my ( $aspFile, $aspResponse, $aspContentRef, $aspArgRef );
>                       $aspFile = $tmplopt{template} 
>                               || puke "ASP Include not specified";
>                       $aspResponse = $tmplopt{response} 
>                               || puke "ASP Response not specified";
> 
>             # special fields
>             $tmplvar{'start'}  = $formtag;
>             $tmplvar{'submit'} = $submit;
>             $tmplvar{'reset'}  = $reset;
>             $tmplvar{'end'}    = '</form>';
>             $tmplvar{'jshead'} = $jsfunc;
>             $tmplvar{'invalid'} = $self->{state}{invalid};
>             $tmplvar{'fields'} = [ map $tmplvar{field}{$_},
>                    @{ $self->{field_names} } ];
>                       $aspArgRef = \%tmplvar;
> 
>                       $aspContentRef = $aspResponse->TrapInclude( $aspFile, 
>$aspArgRef );
>                       $outhtml = $header . $$aspContentRef;


If that's a bit cumbersome, I've uploaded various files including my dodgy modified 
FormBuilder.pm: 

        http://members.iinet.net.au/~ellers/cgi-formbuilder/

PLEASE NOTE: 
 1. I've done a few other changes to the above, such as spaces between multiple submit 
buttons etc, but it should be ok...
 2. The server above doesn't run Apache::ASP so best to save the files and run on your 
own server

TODO: 
 - check templating work for $form->confirm()
 - add overall doco, etc


It'd be great if anyone who is interested in this work could give it a go and send 
comments through.  If/when its reliable enough I can 
submit it as a patch to the 'real' thing.

Ellers



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to