formel — generate HTML form elements
Attribute | Pos. | Req. | Default | Description |
---|---|---|---|---|
label | Yes | Yes | User-visible description of the form element's purpose or intended use. | |
name | Yes | Yes | Name to assign to this form element (appears as name parameter to the appropriate HTML tag). | |
type | Yes | Yes |
Form element type. Supported HTML element types are
text ,
textarea ,
checkbox ,
radio and
select .
Special value of display does not produce any
form element but simply displays the element value in a label.
|
|
size |
Usually the width of an element. For the textarea
type, you can specify width and height in form of "AxB", "A,B" or
"A B".
|
|||
cause | Format string for the error message. If set, the error message
is appended to the label. (%s) is a reasonable
value.
|
|||
checkfor | The element's name value. |
Name to pass to the [error] tag.
|
||
choices |
Comma-separated list of choices for the
checkbox ,
radio or
select elements. To display labels different from
the values, use the
notation.
|
|||
format |
%s %s %s
|
The container format string for the label, form element and help text. | ||
help |
Help text for the element. If the user was to input, say, an username,
you could set the help field to
alphanumeric (5-10 characters)
|
|||
maxlength | The maxlength attribute for the HTML form element. | |||
order | 0 | If not set, the user-visible description comes first (before the form element) in the output. | ||
reset | 0 | Discard any previous element value? | ||
signal |
<span class="mv_contrast">%s</span>
|
Label container in case of errors. If the CSS_CONTRAST variable
is defined, it is used instead of the mv_contrast
class name.
|
||
table |
Database name to pass to the display tag. Of course, this is only used
with the display form "element".
|
This tag creates HTML form elements. [formel]
consults the value namespace
for defaults, thus preserving user input from previous HTML forms. It also keeps track
of input errors (using the [error]
tag).
The error messages will be displayed according to the mv_contrast
CSS class (or the class defined in the CSS_CONTRAST
variable).
Note that you can define values to control this tag's defaults. See the section called “EXAMPLES”.
This tag appears to be affected by, or affects, the following:
Catalog Variables: CSS_CONTRAST
Example: Define tag defaults with form values
[value name="mv_formel_cause" set=" (<I>%s</I>)" hide=1] [value name="mv_formel_format" set="<tr><td>%s</td><td>%s</td></tr>" hide=1] [value name="mv_formel_order" set=1 hide=1] [value name="mv_formel_signal" set="<blink>%s</blink>" hide=1]
Note that the values, once you set them, remain persistent during the user's session.
Example: Displaying the label and form element in two passes
If you had specific requirements, you could, by using a little trickery, display the form element label and the element itself in two passes:
[formel label=Username: name=login format="%s"] [formel name=login order=1 format="%s"]
Interchange 5.9.0:
Source: code/UserTag/formel.tag
Lines: 203
# Copyright 2002-2007 Interchange Development Group and others # Copyright 2002-2005 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. See the LICENSE file for details. # # $Id: formel.tag,v 1.19 2007-08-01 10:52:44 kwalsh Exp $ UserTag formel Order label name type size UserTag formel addAttr UserTag formel Version $Revision: 1.19 $ UserTag formel Routine <<EOF sub { my ($label, $name, $type, $size, $opt) = @_; my ($labelhtml, $elhtml, $fmt); my $checkfor = $opt->{'checkfor'} || $name; my $sizestr = ''; my $labelproc; $labelproc = sub { my ($label, $keep) = @_; my ($error); if ($opt->{cause}) { if ($error = $Tag->error({name => $checkfor, keep => 1})) { $label .= $Tag->error({name => $checkfor, keep => $keep, text => $opt->{cause}}); } } else { $error = $Tag->error({name => $checkfor, keep => $keep}); } if ($error) { if ($opt->{signal}) { sprintf($opt->{signal}, $label); } else { my $contrast = $::Variable->{CSS_CONTRAST} || 'mv_contrast'; qq{<span class="$contrast">$label</span>}; } } else { $label; } }; # set defaults $type = 'text' unless $type; for ('cause', '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 %s'; } if ($opt->{'size'}) { if ($type eq 'textarea') { my ($cols, $rows) = split (/\s*[,x\s]\s*/, $opt->{'size'}); $sizestr = qq{ rows="$rows" cols="$cols"}; } else { $sizestr = qq{ size="$opt->{size}"}; } } if ($opt->{'maxlength'}) { $sizestr .= qq{ maxlength="$opt->{maxlength}"}; } if ($type eq 'radio' || $type eq 'checkbox') { my ($rlabel, $rvalue, $select, @vals); if ($type eq 'checkbox') { @vals = split(/\0/, $::Values->{$name}); } for my $button (split (/\s*,\s*/, $opt->{choices})) { $select = ''; if ($button =~ /^(.*?)=(.*)$/) { $rvalue = $1; $rlabel = $2; } else { $rvalue = $rlabel = $button; } if ($type eq 'checkbox') { # multiple values possible for checkboxes for my $val (@vals) { if ($val eq $rvalue) { $select = 'checked'; last; } } } elsif ($::Values->{$name} eq $rvalue) { $select = ' checked'; } $rlabel = &$labelproc($rlabel, 1); $elhtml .= qq{<input type="$type" name="$name" value="${rvalue}"$select \ $Vend::Xtrailer> $rlabel}; } # delete error implicitly $labelhtml = &$labelproc($label); return sprintf ($fmt, $labelhtml, $elhtml); } $labelhtml = &$labelproc($label) if $label || $type ne 'display'; if ($type eq 'select') { my ($rlabel, $rvalue, $select); for my $option (split (/\s*,\s*/, $opt->{choices})) { $select = ''; if ($option =~ /^(.*?)=(.*)$/) { $rvalue = $1; $rlabel = $2; } else { $rvalue = $rlabel = $option; } if ($::Values->{$name} eq $rvalue) { $select = ' selected="selected"'; } if ($rvalue eq $rlabel) { $elhtml .= qq{<option $select>$rlabel</option>}; } else { $elhtml .= qq{<option value="$rvalue"$select>$rlabel</option>}; } } return sprintf ($fmt, $labelhtml, qq{<select name="$name">$elhtml</select>}); } if ($type eq 'display') { if ($label) { # use provided label $elhtml = $Tag->display($opt->{table} || 'products', $name, '', {value => $Values->{$name}}); } else { # use dummy template to retrieve label from metadata $elhtml = $Tag->display($opt->{table} || 'products', $name, '', {value => $Values->{$name}, template => join(" \0", '$LABEL$', '$WIDGET$')}); ($label, $elhtml) = split(/\s\0/, $elhtml); $labelhtml = &$labelproc($label); } } elsif ($opt->{reset}) { if ($type eq 'textarea') { $elhtml = qq{<textarea name="${name}"$sizestr></textarea>}; } else { $elhtml = qq{<input type="$type" name="${name}"$sizestr $Vend::Xtrailer>}; } } else { if ($type eq 'textarea') { $elhtml = qq{<textarea name="${name}"$sizestr>$::Values->{$name}</textarea>}; } elsif ($type eq 'text' || $type eq 'password' || $type !~ /\S/) { $elhtml = qq{<input type="$type" name="$name" value="$::Values->{$name}"$sizestr \ $Vend::Xtrailer>}; } else { # pass type directly to display tag if ($opt->{order}) { $fmt = sprintf($fmt, '$WIDGET$', '$LABEL$', $opt->{help}); } else { $fmt = sprintf($fmt, '$LABEL$', '$WIDGET$', $opt->{help}); } return $Tag->display({name => $name, type => $type, label => $label, value => $Values->{$name}, template => $fmt}); } } if ($opt->{order}) { # display form element first sprintf ($fmt, $elhtml, $labelhtml, $opt->{help}); } else { # display label first sprintf ($fmt, $labelhtml, $elhtml, $opt->{help}); } } EOF