adding the new form system

This commit is contained in:
JT Smith 2005-07-26 15:55:15 +00:00
parent fe0d968d87
commit 7d95169b38
26 changed files with 2160 additions and 1073 deletions

View file

@ -39,47 +39,26 @@ Base forms package. Eliminates some of the normal code work that goes along with
use WebGUI::Form;
$html = WebGUI::Form::asset({value=>$assetId});
$html = WebGUI::Form::button({value=>"Click me!", extras=>qq|onclick="alert('Aaaaggggghhh!!!')"|});
$html = WebGUI::Form::checkbox({name=>"whichOne", value=>"red"});
$html = WebGUI::Form::checkList({name=>"dayOfWeek", options=>\%days});
$html = WebGUI::Form::codearea({name=>"stylesheet"});
$html = WebGUI::Form::color({name=>"highlightColor"});
$html = WebGUI::Form::combo({name=>"fruit",options=>\%fruit});
$html = WebGUI::Form::contentType({name=>"contentType");
$html = WebGUI::Form::databaseLink();
$html = WebGUI::Form::date({name=>"endDate", value=>$endDate});
$html = WebGUI::Form::dateTime({name=>"begin", value=>$begin});
$html = WebGUI::Form::email({name=>"emailAddress"});
$html = WebGUI::Form::fieldType({name=>"fieldType");
$html = WebGUI::Form::file({name=>"image"});
$html = WebGUI::Form::formFooter();
$html = WebGUI::Form::formHeader();
$html = WebGUI::Form::filterContent({value=>"javascript"});
$html = WebGUI::Form::float({name=>"distance"});
$html = WebGUI::Form::group({name=>"groupToPost"});
$html = WebGUI::Form::hidden({name=>"wid",value=>"55"});
$html = WebGUI::Form::hiddenList({name=>"wid",value=>"55",options=>\%options});
$html = WebGUI::Form::HTMLArea({name=>"description"});
$html = WebGUI::Form::integer({name=>"size"});
$html = WebGUI::Form::interval({name=>"timeToLive", interval=>12, units=>"hours"});
$html = WebGUI::Form::password({name=>"identifier"});
$html = WebGUI::Form::phone({name=>"cellPhone"});
$html = WebGUI::Form::radio({name=>"whichOne", value=>"red"});
$html = WebGUI::Form::radioList({name="dayOfWeek", options=>\%days});
$html = WebGUI::Form::selectList({name=>"dayOfWeek", options=>\%days, value=>\@array"});
$html = WebGUI::Form::submit();
$html = WebGUI::Form::template({name=>"templateId"});
$html = WebGUI::Form::text({name=>"firstName"});
$html = WebGUI::Form::textarea({name=>"emailMessage"});
$html = WebGUI::Form::timeField({name=>"begin", value=>$begin});
$html = WebGUI::Form::url({name=>"homepage"});
$html = WebGUI::Form::yesNo({name=>"happy"});
$html = WebGUI::Form::zipcode({name=>"workZip"});
$html = WebGUI::Form::anyFieldType(%properties);
Example:
$html = WebGUI::Form::text(%properties);
=head1 METHODS
All of the functions in this package accept the input of a hash reference containing the parameters to populate the form element. These functions are available from this package:
These functions are available from this package:
=cut
#-------------------------------------------------------------------
=head2 AUTOLOAD ()
Dynamically creates functions on the fly for all the different form control types.
=cut
@ -90,7 +69,7 @@ sub AUTOLOAD {
my $cmd = "use WebGUI::Form::".$name;
eval ($cmd);
if ($@) {
WebGUI::ErrorHandler::error("Couldn't compile form field: ".$name.". Root cause: ".$@);
WebGUI::ErrorHandler::error("Couldn't compile form control: ".$name.". Root cause: ".$@);
return undef;
}
my $class = "WebGUI::Form::".$name;
@ -127,480 +106,6 @@ sub _fixTags {
}
#-------------------------------------------------------------------
=head2 asset ( hashref )
Returns an asset picker control.
=head3 value
The asset ID assigned to this control.
=head3 name
The name of this field. Defaults to "asset".
=head3 defaultValue
If no value is specified, use this value.
=head3 class
Limit options to a specific class type such as "WebGUI::Asset::Wobject::Article"
=head3 extras
Assign extra things like javascript events to this form element.
=cut
sub asset {
my $params = shift;
my $value = defined($params->{value}) ? $params->{value} : $params->{defaultValue};
my $name = $params->{name} || "asset";
my $asset = WebGUI::Asset->newByDynamicClass($value) || WebGUI::Asset->getRoot;
return hidden({
name=>$name,
extras=>'id="'.$name.'" '.$params->{extras},
value=>$asset->getId
})
.text({
name=>$name."_display",
extras=>'id="'.$name."_display".'" readonly="1"',
value=>$asset->get("title")
})
.button({
value=>"...",
extras=>'onclick="window.open(\''.$asset->getUrl("op=formAssetTree&classLimiter=".$params->{class}."&formId=".$name).'\',\'assetPicker\',\'toolbar=no, location=no, status=no, directories=no, width=400, height=400\');"'
});
}
#-------------------------------------------------------------------
=head2 button ( hashRef )
Returns a button. Use it in combination with scripting code to make the button perform an action.
=head3 value
The button text for this submit button. Defaults to "save".
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onClick="alert(\'You've just pushed me !\')"'
=head3 defaultValue
This will be used if no value is specified.
=cut
sub button {
my $params = shift;
my $value = $params->{value} || $params->{defaultValue} || WebGUI::International::get(62);
$value = _fixQuotes($value);
return '<input type="button" value="'.$value.'" '.$params->{extras}.' />';
}
#-------------------------------------------------------------------
=head2 checkbox ( hashRef )
Returns a checkbox form element.
=head3 name
The name field for this form element.
=head3 checked
If you'd like this box to be defaultly checked, set this to "1".
=head3 value
The default value for this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 defaultValue
This will be used if no value is specified. Defaults to 1.
=cut
sub checkbox {
my $params = shift;
my $checkedText = ' checked="1"' if ($params->{checked});
my $value = $params->{value} || $params->{defaultValue} || 1;
return '<input type="checkbox" name="'.$params->{name}.'" value="'.$value.'"'.$checkedText.' '.$params->{extras}.' />';
}
#-------------------------------------------------------------------
=head2 checkList ( hashRef )
Returns checkbox list.
=head3 name
The name field for this form element.
=head3 options
The list of options for this list. Should be passed as a hash reference.
=head3 value
The default value(s) for this form element. This should be passed as an array reference.
=head3 vertical
If set to "1" the radio button elements will be laid out horizontally. Defaults to "0".
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 defaultValue
This will be used if no value is specified. Should be passed as an array reference.
=cut
sub checkList {
my $params = shift;
my ($output, $checked, $key, $item);
my $values = $params->{value} || $params->{defaultValue};
foreach $key (keys %{$params->{options}}) {
$checked = 0;
foreach $item (@{$values}) {
if ($item eq $key) {
$checked = 1;
}
}
$output .= checkbox({
name=>$params->{name},
value=>$key,
extras=>$params->{extras},
checked=>$checked
});
$output .= ${$params->{options}}{$key};
if ($params->{vertical}) {
$output .= "<br />\n";
} else {
$output .= " &nbsp; &nbsp;\n";
}
}
return $output;
}
sub codearea {
my $params = shift;
WebGUI::Style::setScript($session{config}{extrasURL}.'/TabFix.js',{type=>"text/javascript"});
$params->{extras} = 'style="width: 99%; min-width: 440px; height: 400px" onkeypress="return TabFix_keyPress(event)" onkeydown="return TabFix_keyDown(event)"';
my $output = textarea($params);
return $output;
}
#-------------------------------------------------------------------
=head2 color ( hashRef )
Returns a color picker field.
=head3 name
The name field for this form element.
=head3 value
The value for this form element. This should be a scalar containing a hex color like "#000000".
=head3 defaultValue
This will be used if no value is specified.
=cut
sub color {
my $params = shift;
WebGUI::Style::setScript($session{config}{extrasURL}.'/colorPicker.js',{ type=>'text/javascript' });
return '<script type="text/javascript">initColorPicker("'.$params->{name}.'","'.($params->{value}||$params->{defaultValue}).'");</script>';
}
#-------------------------------------------------------------------
=head2 combo ( hashRef )
Returns a select list and a text field. If the text box is filled out it will have a value stored in "name"_new.
=head3 name
The name field for this form element.
=head3 options
The list of options for the select list. Should be passed as a hash reference.
=head3 value
The default value(s) for this form element. This should be passed as an array reference.
=head3 size
The number of characters tall this form element should be. Defaults to "1".
=head3 multiple
A boolean value for whether this select list should allow multiple selections. Defaults to "0".
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 defaultValue
This will be used if no value is specified. Should be passed as an array reference.
=cut
sub combo {
my $params = shift;
$params->{options}->{''} = '['.WebGUI::International::get(582).']';
$params->{options}->{_new_} = WebGUI::International::get(581).'-&gt;';
my $output = selectList({
name=>$params->{name},
options=>$params->{options},
value=>$params->{value} || $params->{defaultValue},
multiple=>$params->{multiple},
extras=>$params->{extras}
});
my $size = $session{setting}{textBoxSize}-5;
$output .= text({name=>$params->{name}."_new",size=>$size});
return $output;
}
#-------------------------------------------------------------------
=head2 contentType ( hashRef )
Returns a content type select list field. This is usually used to help tell WebGUI how to treat posted content.
=head3 name
The name field for this form element.
=head3 types
An array reference of field types to be displayed. The types are "mixed", "html", "code", and "text". Defaults to all.
=head3 value
The default value for this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 defaultValue
This will be used if no value is specified. Defaults to "mixed".
=cut
sub contentType {
my $params = shift;
my (%hash, $output, $type);
tie %hash, 'Tie::IxHash';
# NOTE: What you are about to see is bad code. Do not attempt this
# without adult supervision. =) It was done this way because a huge
# if/elsif construct executes much more quickly than a bunch of
# unnecessary database hits.
my @types = qw(mixed html code text);
$params->{types} = \@types unless ($params->{types});
foreach $type (@{$params->{types}}) {
if ($type eq "text") {
$hash{text} = WebGUI::International::get(1010);
} elsif ($type eq "mixed") {
$hash{mixed} = WebGUI::International::get(1008);
} elsif ($type eq "code") {
$hash{code} = WebGUI::International::get(1011);
} elsif ($type eq "html") {
$hash{html} = WebGUI::International::get(1009);
}
}
return selectList({
options=>\%hash,
name=>$params->{name},
value=>[$params->{value}],
extras=>$params->{extras},
defaultValue=>[$params->{defaultValue}]
});
}
#-------------------------------------------------------------------
=head2 databaseLink ( hashRef )
Returns a select list of database links.
=head3 name
The name field for this form element. Defaults to "databaseLinkId".
=head3 value
The unique identifier for the selected template.
=head3 defaultValue
This will be used if no value is specified. Defaults to 0 (the WebGUI database).
=cut
sub databaseLink {
my $params = shift;
my $value = $params->{value} || $params->{defaultValue} || 0;
my $name = $params->{name} || "databaseLinkId";
return selectList({
name=>$name,
options=>WebGUI::DatabaseLink::getList(),
value=>[$value]
});
}
#-------------------------------------------------------------------
=head2 date ( hashRef )
Returns a date field.
=head3 name
The name field for this form element.
=head3 value
The default date. Pass as an epoch value. Defaults to today.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 size
The number of characters wide this form element should be. There should be no reason for anyone to specify this.
=head3 noDate
By default a date is placed in the "value" field. Set this to "1" to turn off the default date.
=head3 defaultValue
This will be used if no value is specified. Defaults to today.
=cut
sub date {
my $params = shift;
my $value = epochToSet($params->{value}||$params->{defaultValue}) unless ($params->{noDate} && $params->{value} eq '');
my $size = $params->{size} || 10;
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/calendar.js',{ type=>'text/javascript' });
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/lang/calendar-en.js',{ type=>'text/javascript' });
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/calendar-setup.js',{ type=>'text/javascript' });
WebGUI::Style::setLink($session{config}{extrasURL}.'/calendar/calendar-win2k-1.css', { rel=>"stylesheet", type=>"text/css", media=>"all" });
return text({
name=>$params->{name},
value=>$value,
size=>$size,
extras=>'id="'.$params->{name}.'Id" '.$params->{extras},
maxlength=>10
}) . '<script type="text/javascript">
Calendar.setup({
inputField : "'.$params->{name}.'Id",
ifFormat : "%Y-%m-%d",
showsTime : false,
timeFormat : "12",
mondayFirst : false
});
</script>';
}
#-------------------------------------------------------------------
=head2 dateTime ( hashRef )
Returns a date/time field.
=head3 name
The the base name for this form element. This form element actually returns two values under different names. They are name_date and name_time.
=head3 value
The date and time. Pass as an epoch value. Defaults to today and now.
=head3 extras
Extra parameters to add to the date/time form element such as javascript or stylesheet information.
=head3 defaultValue
This will be used if no value is specified. Defaults to today and now.
=cut
sub dateTime {
my $params = shift;
my $value = epochToSet($params->{value}||$params->{defaultValue},1);
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/calendar.js',{ type=>'text/javascript' });
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/lang/calendar-en.js',{ type=>'text/javascript' });
WebGUI::Style::setScript($session{config}{extrasURL}.'/calendar/calendar-setup.js',{ type=>'text/javascript' });
WebGUI::Style::setLink($session{config}{extrasURL}.'/calendar/calendar-win2k-1.css', { rel=>"stylesheet", type=>"text/css", media=>"all" });
return text({
name=>$params->{name},
value=>$value,
size=>19,
extras=>'id="'.$params->{name}.'Id" '.$params->{extras},
maxlength=>19
}) . '<script type="text/javascript">
Calendar.setup({
inputField : "'.$params->{name}.'Id",
ifFormat : "%Y-%m-%d %H:%M:%S",
showsTime : true,
timeFormat : "12",
mondayFirst : false
});
</script>';
}
#-------------------------------------------------------------------
@ -652,53 +157,6 @@ sub dynamicField {
}
#-------------------------------------------------------------------
=head2 email ( hashRef )
Returns an email address field.
=head3 name
The name field for this form element.
=head3 value
The default value for this form element.
=head3 maxlength
The maximum number of characters to allow in this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 size
The number of characters wide this form element should be. There should be no reason for anyone to specify this.
=head3 defaultValue
This will be used if no value is specified.
=cut
sub email {
my $params = shift;
WebGUI::Style::setScript($session{config}{extrasURL}.'/emailCheck.js',{ type=>'text/javascript' });
my $output .= text({
name=>$params->{name},
value=>$params->{value},
size=>$params->{size},
extras=>' onChange="emailCheck(this.value)" '.$params->{extras},
defaultValue=>$params->{defaultValue}
});
return $output;
}
#-------------------------------------------------------------------
@ -1072,35 +530,6 @@ sub group {
}
#-------------------------------------------------------------------
=head2 hidden ( hashRef )
Returns a hidden field.
=head3 name
The name field for this form element.
=head3 value
The default value for this form element.
=head3 defaultValue
This will be used if no value is specified.
=head3 extras
Add extra things like ids and javascript event handlers.
=cut
sub hidden {
my $params = shift;
return '<input type="hidden" name="'.$params->{name}.'" value="'._fixQuotes(_fixMacros(_fixSpecialCharacters($params->{value}))).'" '.$params->{extras}.' />'."\n";
}
#-------------------------------------------------------------------
@ -1546,78 +975,6 @@ sub radioList {
return $output;
}
#-------------------------------------------------------------------
=head2 selectList ( hashRef )
Returns a select list field.
=head3 name
The name field for this form element.
=head3 options
The list of options for this select list. Should be passed as a hash reference.
=head3 value
The default value(s) for this form element. This should be passed as an array reference.
=head3 size
The number of characters tall this form element should be. Defaults to "1".
=head3 multiple
A boolean value for whether this select list should allow multiple selections. Defaults to "0".
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 sortByValue
A boolean value for whether or not the values in the options hash should be sorted.
=head3 defaultValue
This will be used if no value is specified. Should be passed as an array reference.
=cut
sub selectList {
my $params = shift;
my ($output, $key, $item, $size, $multiple);
$size = $params->{size} || 1;
$multiple = ' multiple="1"' if ($params->{multiple});
$output = '<select name="'.$params->{name}.'" size="'.$size.'" '.$params->{extras}.$multiple.'>';
my $values = $params->{value} || $params->{defaultValue};
my %options;
tie %options, 'Tie::IxHash';
if ($params->{sortByValue}) {
foreach my $optionKey (sort {"\L${$params->{options}}{$a}" cmp "\L${$params->{options}}{$b}" } keys %{$params->{options}}) {
$options{$optionKey} = ${$params->{options}}{$optionKey};
}
} else {
%options = %{$params->{options}};
}
foreach $key (keys %options) {
$output .= '<option value="'.$key.'"';
foreach $item (@{$values}) {
if ($item eq $key) {
$output .= ' selected="1"';
}
}
$output .= '>'.${$params->{options}}{$key}.'</option>';
}
$output .= '</select>';
return $output;
}
#-------------------------------------------------------------------
=head2 submit ( hashRef )
@ -1703,100 +1060,6 @@ sub template {
});
}
#-------------------------------------------------------------------
=head2 text ( hashRef )
Returns a text input field.
=head3 name
The name field for this form element.
=head3 value
The default value for this form element.
=head3 maxlength
The maximum number of characters to allow in this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 size
The number of characters wide this form element should be. There should be no reason for anyone to specify this.
=head3 defaultValue
This will be used if no value is specified.
=cut
sub text {
my $params = shift;
my $value = _fixSpecialCharacters($params->{value}||$params->{defaultValue});
$value = _fixQuotes($value);
$value = _fixMacros($value);
my $maxLength = $params->{maxlength} || 255;
my $size = $params->{size} || $session{setting}{textBoxSize} || 30;
return '<input type="text" name="'.$params->{name}.'" value="'.$value.'" size="'.
$size.'" maxlength="'.$maxLength.'" '.$params->{extras}.' />';
}
#-------------------------------------------------------------------
=head2 textarea ( hashRef )
Returns a text area field.
=head3 name
The name field for this form element.
=head3 value
The default value for this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 wrap
The method for wrapping text in the text area. Defaults to "virtual". There should be almost no reason to specify this.
=head3 rows
The number of characters tall this form element should be. There should be no reason for anyone to specify this.
=head3 columns
The number of characters wide this form element should be. There should be no reason for anyone to specify this.
=head3 defaultValue
This will be used if no value is specified.
=cut
sub textarea {
my $params = shift;
my $wrap = $params->{wrap} || "virtual";
my $rows = $params->{rows} || $session{setting}{textAreaRows} || 5;
my $columns = $params->{columns} || $session{setting}{textAreaCols} || 50;
my $value = _fixSpecialCharacters($params->{value} || $params->{defaultValue});
$value = _fixTags($value);
$value = _fixMacros($value);
return '<textarea name="'.$params->{name}.'" cols="'.$columns.'" rows="'.$rows.'" wrap="'.
$wrap.'" '.$params->{extras}.'>'.$value.'</textarea>';
}
#-------------------------------------------------------------------
@ -1994,55 +1257,6 @@ sub yesNo {
return $output;
}
#-------------------------------------------------------------------
=head2 zipcode ( hashRef )
Returns a zip code field.
=head3 name
The name field for this form element.
=head3 value
The default value for this form element.
=head3 maxlength
The maximum number of characters to allow in this form element.
=head3 extras
If you want to add anything special to this form element like javascript actions, or stylesheet information, you'd add it in here as follows:
'onChange="this.form.submit()"'
=head3 size
The number of characters wide this form element should be. There should be no reason for anyone to specify this.
=head3 defaultValue
This will be used if no value is specified.
=cut
sub zipcode {
my $params = shift;
WebGUI::Style::setScript($session{config}{extrasURL}.'/inputCheck.js',{ type=>'text/javascript' });
my $maxLength = $params->{maxlength} || 10;
return text({
name=>$params->{name},
maxlength=>$maxLength,
extras=>'onKeyUp="doInputCheck(this.form.'.$params->{name}.',\'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ- \')" '.$params->{extras},
value=>$params->{value},
size=>$params->{size},
defaultValue=>$params->{defaultValue}
});
}
1;