[ic] [formel] UserTag: more information, example usage?

Dan B db@cyclonehq.dnsalias.net
Fri, 09 Feb 2001 21:38:45 -0800

-*- Where can I find out more information about the [formel] UserTag?
-*- Does it work with 4.6.1 or is it just 4.7.x?
-*- What benefit does it bring over manually entering form elements?  (Does 
it automatically remember values?)
-*- Where can I find examples of its usage?


-Dan Browning


# UserTag formel - see POD documentation for more information
# Copyright 2000 by Stefan Hornburg <racke@linuxia.de>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA  02111-1307  USA.

UserTag formel Order label name type size
# may be should place version information on user-defined tags
# UserTag formel Version 0.03
UserTag formel addAttr
UserTag formel Routine <<EOF
sub {
     my ($label, $name, $type, $size, $opt) = @_;
     my ($labelhtml, $elhtml, $fmt);
     my $contrast = $::Variable->{CONTRAST} || 'red';
         my $checkfor = $opt->{'checkfor'} || $name;
     my $sizestr = '';
         my $labelproc;

         $labelproc = sub {
                 my ($label, $keep) = @_;
             if ($Tag->error({name => $checkfor, keep => $keep})) {
                         if ($opt->{signal}) {
                                 sprintf($opt->{signal}, $label);
                         } else {
                         qq{<font color="$contrast">$label</font>};
             } else {

     # set defaults
     $type = 'text' unless $type;

     for ('format', 'order', 'reset', 'signal', 'size') {
         next if $opt->{$_};
         if ($::Values->{"mv_formel_$_"}) {
             $opt->{$_} = $::Values->{"mv_formel_$_"};

     if ($opt->{'format'}) {
         $fmt = $opt->{'format'};
     } else {
         $fmt = '%s %s';

     if ($opt->{'size'}) {
                 if ($type eq 'textarea') {
                         my ($cols, $rows) = split (/\s*[,x\s]\s*/, 
                         $sizestr = " rows=$rows cols=$cols";
                 } else {
                 $sizestr = " size=$opt->{size}";

         if ($type eq 'radio') {
                 my ($rlabel, $rvalue, $select);

                 for my $button (split (/\s*,\s*/, $opt->{choices})) {
                         $select = '';
                         if ($button =~ /^(.*?)=(.*)$/) {
                                 $rvalue = $1;
                                 $rlabel = $2;
                         } else {
                                 $rvalue = $rlabel = $button;

                         if ($::Values->{$name} eq $rvalue) {
                                 $select = ' checked';

                         $rlabel = &$labelproc($rlabel, 1);

                         $elhtml .= qq{<input type=radio name=$name 
value="${rvalue}"$select> $rlabel};
                 # delete error implicitly
                 return sprintf ($fmt, $labelhtml, $elhtml);

         $labelhtml = &$labelproc($label);

     if ($opt->{reset}) {
                 if ($type eq 'textarea') {
                 $elhtml = qq{<textarea name="${name}"$sizestr></textarea>};
                 } else {
                 $elhtml = qq{<input type=$type name="${name}"$sizestr>};
     } else {
                 if ($type eq 'textarea') {
                 $elhtml = qq{<textarea 
                 } else {
                 $elhtml = qq{<input type=$type name=$name 

     if ($opt->{order}) {
         # display form element first
         sprintf ($fmt, $elhtml, $labelhtml);
     } else {
         # display label first
         sprintf ($fmt, $labelhtml, $elhtml);
UserTag formel Documentation <<EOD
=head2 formel

This tag generates a HTML form element. It preserves the user input from
the last display of the current page and looks for
input value errors (using the C<error> tag).
The user-visible description will be displayed
in the color defined by the variable C<CONTRAST> or in red if the
variable is not set.

Parameters for this tag are:

=over 4

=item label

The user-visible description of the form element's purpose.

=item name

The name of the form element which appears in the C<NAME>
attribute of the HTML tag.

=item type

The type of the form element (supported are text, textarea
and radio).

=item size

The width of the form element. For textarea elements you can
specify width and height (e.g. 70x10 or 20,4).


Other options are:

=item checkfor

The name which get passed to the Error tag. The default
is the name of the form element.

=item format

The container format string for the label and the form element.
The default is C<%s %s>.

=item order

Whether the user-visible description or the form element
comes first. Default is the first (order=0).

=item reset

Discards the user input if set to 1.

=item signal

Label container in case of errors. The default is
<font color="__CONTRAST__">%s</font>. If the variable
CONTRAST doesn't exist, the color red is used instead.


You can set defaults for format, order, reset, signal and size with the
corresponding mv_formel_... form variable values, e.g.:

     [value name="mv_formel_format" set="<TR><TD>%s</TD><TD>%s</TD></TR>" 
     [value name="mv_formel_order" set=1 hide=1]

         [value name="mv_formel_signal" set="<BLINK>%s</BLINK>" hide=1]

To display the label and the form element seperately call C<formel> twice:

         [formel label=Username: name=login format="%s"]
         [formel name=login order=1 format="%s"]


Dan Browning, Cyclone Computer Systems, danb@cyclonecomputers.com