Date: Tuesday June 24, 2003 @ 11:15 Author: matt Update of /home/cvs/AxKit-XSP-PerForm In directory ted.sergeant.org:/home/matt/Perl/AxKit-XSP-PerForm
Modified Files: Changes Makefile.PL PerForm.pm Log Message: Reformat paragraphs Added onchange/onclick support Added disabled support Log: PR: Index: Changes =================================================================== RCS file: /home/cvs/AxKit-XSP-PerForm/Changes,v retrieving revision 1.8 retrieving revision 1.9 diff -b -u -r1.8 -r1.9 --- Changes 2003/06/16 08:16:09 1.8 +++ Changes 2003/06/24 10:15:31 1.9 @@ -1,5 +1,10 @@ Revision history for Perl extension AxKit::XSP::PerForm. +1.8.1 + - Really fix the problem with select boxes not loading contents on + a submit. + - Update WebUtils requirement to 1.5 in Makefile.PL + 1.8 - Change to use can() so we can use XSP inheritance - Added onload and onvalidate attributes to each tag (allow to specify Index: Makefile.PL =================================================================== RCS file: /home/cvs/AxKit-XSP-PerForm/Makefile.PL,v retrieving revision 1.2 retrieving revision 1.3 diff -b -u -r1.2 -r1.3 --- Makefile.PL 2001/06/11 15:21:38 1.2 +++ Makefile.PL 2003/06/24 10:15:31 1.3 @@ -4,5 +4,5 @@ WriteMakefile( 'NAME' => 'AxKit::XSP::PerForm', 'VERSION_FROM' => 'PerForm.pm', # finds $VERSION - 'PREREQ_PM' => { 'AxKit' => 1.4, 'AxKit::XSP::WebUtils' => 1.3 }, + 'PREREQ_PM' => { 'AxKit' => 1.4, 'AxKit::XSP::WebUtils' => 1.5 }, ); Index: PerForm.pm =================================================================== RCS file: /home/cvs/AxKit-XSP-PerForm/PerForm.pm,v retrieving revision 1.21 retrieving revision 1.22 diff -b -u -r1.21 -r1.22 --- PerForm.pm 2003/06/16 16:21:00 1.21 +++ PerForm.pm 2003/06/24 10:15:31 1.22 @@ -1,29 +1,29 @@ -# $Id: PerForm.pm,v 1.21 2003/06/16 16:21:00 matt Exp $ +# $Id: PerForm.pm,v 1.22 2003/06/24 10:15:31 matt Exp $ package AxKit::XSP::PerForm; -$VERSION = "1.8"; +$VERSION = "1.81"; use AxKit 1.4; use Apache; use Apache::AxKit::Language::XSP::TaglibHelper; -use AxKit::XSP::WebUtils; +use AxKit::XSP::WebUtils 1.5; $NS = 'http://axkit.org/NS/xsp/perform/v1'; @ISA = qw(Apache::AxKit::Language::XSP); @EXPORT_TAGLIB = ( - 'textfield($name;$default,$width,$maxlength,$index,$onvalidate,$onload)', - 'password($name;$default,$width,$maxlength,$index,$onvalidate,$onload)', - 'submit($name;$value,$image,$alt,$border,$align,$goto,$index,$onsubmit)', - 'cancel($name;$value,$image,$alt,$border,$align,$goto,$index,$oncancel)', - 'checkbox($name;$value,$checked,$label,$index,$onvalidate,$onload)', - 'file_upload($name;$value,$accept,$onvalidate,$onload)', + 'textfield($name;$default,$width,$maxlength,$index,$onvalidate,$onload,$disabled,$onchange)', + 'password($name;$default,$width,$maxlength,$index,$onvalidate,$onload,$disabled,$onchange)', + 'submit($name;$value,$image,$alt,$border,$align,$goto,$index,$onsubmit,$disabled,$onclick)', + 'cancel($name;$value,$image,$alt,$border,$align,$goto,$index,$oncancel,$disabled,$onclick)', + 'checkbox($name;$value,$checked,$label,$index,$onvalidate,$onload,$disabled,$onclick)', + 'file_upload($name;$value,$accept,$onvalidate,$onload,$disabled,$onclick)', 'hidden($name;$value,$index,$onload)', - 'textarea($name;$cols,$rows,$wrap,$default,$index,$onvalidate,$onload)', - 'single_select($name;$default,$index,$onvalidate,$onload,*options):itemtag=option', - 'multi_select($name;@default,$index,$onvalidate,$onload,*option):itemtag=option', + 'textarea($name;$cols,$rows,$wrap,$default,$index,$onvalidate,$onload,$disabled,$onchange)', + 'single_select($name;$default,$index,$onvalidate,$onload,$disabled,$onchange,*options):itemtag=option', + 'multi_select($name;@default,$index,$onvalidate,$onload,$disabled,$onclick,*option):itemtag=option', ); use strict; @@ -165,8 +165,9 @@ } } -sub textfield ($;$$$$$$) { - my ($name, $default, $width, $maxlength, $index, $onval, $onload) = @_; +sub textfield ($;$$$$$$$$) { + my ($name, $default, $width, $maxlength, $index, $onval, $onload, + $disabled, $onchange) = @_; my ($package) = caller; no strict 'refs'; @@ -206,13 +207,16 @@ name => $name, value => ($params->get($name.$index))[-1], index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onchange ? (onchange => $onchange) : ()), ($error ? (error => $error) : ()), } }; } -sub submit ($;$$$$$$$$) { - my ($name, $value, $image, $alt, $border, $align, $goto, $index, $onsubmit) = @_; +sub submit ($;$$$$$$$$$$) { + my ($name, $value, $image, $alt, $border, $align, $goto, $index, + $onsubmit, $disabled, $onclick) = @_; my ($package) = caller; no strict 'refs'; @@ -236,6 +240,8 @@ alt => $alt, border => $border || 0, align => $align || "bottom", + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), index => $index, } }; @@ -246,13 +252,16 @@ name => $name, value => $value, index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), } }; } } -sub cancel ($;$$$$$$$$) { - my ($name, $value, $image, $alt, $border, $align, $goto, $index, $oncancel) = @_; +sub cancel ($;$$$$$$$$$$) { + my ($name, $value, $image, $alt, $border, $align, $goto, $index, + $oncancel, $disabled, $onclick) = @_; my ($package) = caller; no strict 'refs'; @@ -277,6 +286,8 @@ border => $border || 0, align => $align || "bottom", index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), } }; } @@ -286,6 +297,8 @@ name => $name, value => $value, index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), } }; } @@ -304,8 +317,10 @@ # TODO: What do we want buttons to do? } -sub checkbox ($;$$$$$$) { - my ($name, $value, $checked, $label, $index, $onval, $onload) = @_; +sub checkbox ($;$$$$$$$$) { + my ($name, $value, $checked, $label, $index, $onval, $onload, + $disabled, $onclick) = @_; + my ($package) = caller; $value = 1 unless $value; @@ -355,12 +370,14 @@ label => $label, ( $error ? (error => $error) : () ), index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), } }; } -sub file_upload ($;$$$$) { - my ($name, $value, $accept, $onval, $onload) = @_; +sub file_upload ($;$$$$$$) { + my ($name, $value, $accept, $onval, $onload, $disabled, $onclick) = @_; my ($package) = caller; no strict 'refs'; @@ -415,6 +432,8 @@ name => $name, value => $params->{$name}, accept => $accept, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), ($error ? (error => $error) : ()), } }; @@ -448,8 +467,8 @@ }; } -sub multi_select ($;$$$$$) { - my ($name, $default, $index, $onval, $onload, $option) = @_; +sub multi_select ($;$$$$$$$) { + my ($name, $default, $index, $onval, $onload, $disabled, $onclick, $option) = @_; my ($package) = caller; no strict 'refs'; @@ -496,6 +515,8 @@ name => $name, ($error ? ( error => $error ) : ()), index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onclick ? (onclick => $onclick) : ()), options => [ map { { @@ -509,8 +530,9 @@ }; } -sub password ($;$$$$$$) { - my ($name, $default, $width, $maxlength, $index, $onval, $onload) = @_; +sub password ($;$$$$$$$$) { + my ($name, $default, $width, $maxlength, $index, $onval, $onload, + $disabled, $onchange) = @_; my ($package) = caller; no strict 'refs'; @@ -550,6 +572,8 @@ value => ($params->get($name.$index))[-1], ($error ? (error => $error) : ()), index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onchange ? (onchange => $onchange) : ()), } }; } @@ -569,8 +593,10 @@ }; } -sub single_select ($;$$$$$) { - my ($name, $default, $index, $onval, $onload, $option) = @_; +sub single_select ($;$$$$$$$) { + my ($name, $default, $index, $onval, $onload, + $disabled, $onchange, $option) = @_; + my ($package) = caller; no strict 'refs'; @@ -616,6 +642,8 @@ name => $name, ($error ? ( error => $error ) : ()), index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onchange ? (onchange => $onchange) : ()), options => [ map { { @@ -629,8 +657,9 @@ }; } -sub textarea ($;$$$$$$$) { - my ($name, $cols, $rows, $wrap, $default, $index, $onval, $onload) = @_; +sub textarea ($;$$$$$$$$$) { + my ($name, $cols, $rows, $wrap, $default, $index, $onval, $onload, + $disabled, $onchange) = @_; my ($package) = caller; @@ -681,6 +710,8 @@ value => $params->{$name.$index}, ($error ? (error => $error) : ()), index => $index, + ($disabled ? (disabled => $disabled) : ()), + ($onchange ? (onchange => $onchange) : ()), } }; } @@ -698,19 +729,19 @@ =head1 DESCRIPTION -PerForm is a large and complex taglib for AxKit XSP that facilitates creating -large and complex HTML, WML, or other types of data-entry forms. PerForm tends to -make life easier for you if your form data is coming from different data sources, -such as DBI, or even XML. - -PerForm works as an XSP taglib, meaning you simply add some custom XML tags to -your XSP page, and PerForm does the rest. Well, almost... PerForm works mainly -by callbacks, as you will see below. +PerForm is a large and complex taglib for AxKit XSP that facilitates +creating large and complex HTML, WML, or other types of data-entry forms. +PerForm tends to make life easier for you if your form data is coming from +different data sources, such as DBI, or even XML. + +PerForm works as an XSP taglib, meaning you simply add some custom XML tags +to your XSP page, and PerForm does the rest. Well, almost... PerForm works +mainly by callbacks, as you will see below. =head1 EXAMPLE FORM -Ignoring the outside XSP and namespace declarations, assuming the prefix "f" is -bound to the PerForm namespace: +Ignoring the outside XSP and namespace declarations, assuming the prefix "f" +is bound to the PerForm namespace: <f:form name="add_user"> First name: <f:textfield name="firstname" width="30" maxlength="50"/> @@ -721,15 +752,16 @@ <f:cancel name="cancel" value="Cancel" goto="home.html" /> </f:form> -Now it is important to bear in mind that this is just the form, and alone it is -fairly useless. You also need to add callbacks. You'll notice with each of these -callbacks you recieve a C<$ctxt> object. This is simply an empty hash-ref that -you can use in the callbacks to maintain state. Actually "empty" is an -exhageration - it contains two entries always: C<Form> and C<Apache>. "Form" is -a simply a hashref of the entries in the form (actually it is an Apache::Table -object, which allows for supporting multi-valued parameters). So for example, the firstname -below is in C<$ctxt->{Form}{firstname}>. "Apache" is the C<$r> apache request -object for the current request, which is useful for access to the URI or headers. +Now it is important to bear in mind that this is just the form, and alone it +is fairly useless. You also need to add callbacks. You'll notice with each +of these callbacks you recieve a C<$ctxt> object. This is simply an empty +hash-ref that you can use in the callbacks to maintain state. Actually +"empty" is an exhageration - it contains two entries always: C<Form> and +C<Apache>. "Form" is a simply a hashref of the entries in the form (actually +it is an Apache::Table object, which allows for supporting multi-valued +parameters). So for example, the firstname below is in +C<$ctxt->{Form}{firstname}>. "Apache" is the C<$r> apache request object for +the current request, which is useful for access to the URI or headers. sub validate_firstname { my ($ctxt, $value) = @_; @@ -750,11 +782,12 @@ warn("User: ", $ctxt->{Form}{firstname}, " ", $ctxt->{Form}{lastname}, "\n"); } -Now these methods need to be global to your XSP page, rather than "closures" within -the XSP page's main handler routine. How do you do that? Well it's simple. Just put -them within a <xsp:logic> section before any user defined tags. For example, if your -XSP page happens to use XHTML as it's basic format (something I do a lot), your page -might be constructed as follows (namespace declarations omitted for brevity): +Now these methods need to be global to your XSP page, rather than "closures" +within the XSP page's main handler routine. How do you do that? Well it's +simple. Just put them within a <xsp:logic> section before any user defined +tags. For example, if your XSP page happens to use XHTML as it's basic +format (something I do a lot), your page might be constructed as follows +(namespace declarations omitted for brevity): <xsp:page> <xsp:logic> @@ -772,41 +805,45 @@ </html> </xsp:page> -[Note that the page-global methods is a useful technique in other situations, because -unlike Apache::Registry scripts, this won't create a closure from methods defined there]. +[Note that the page-global methods is a useful technique in other +situations, because unlike Apache::Registry scripts, this won't create a +closure from methods defined there]. =head1 SUBMISSION PROCEDURE -In PerForm, all forms submit back to themselves. This allows us to implement the callback -system. Of course with most forms, you want to go somewhere else once you've processed -the form. So for this, we issue redirects once the form has been processed. This has the -advantage that you can't hit reload by accident and have the form re-submitted. - -To define where you go on hitting submit, you can either return set the I<goto> attribute -on the submit or cancel button, or implement a callback and return a URI to redirect to. +In PerForm, all forms submit back to themselves. This allows us to implement +the callback system. Of course with most forms, you want to go somewhere +else once you've processed the form. So for this, we issue redirects once +the form has been processed. This has the advantage that you can't hit +reload by accident and have the form re-submitted. + +To define where you go on hitting submit, you can either return set the +I<goto> attribute on the submit or cancel button, or implement a callback +and return a URI to redirect to. =head1 THE CONTEXT OBJECT -Each of the form callbacks is passed a context object. This is a hashref you are allowed -to use to maintain state between your callbacks. There is a new context object created -for every form on your XSP page. There are two entries filled in automatically into -the hashref for you: +Each of the form callbacks is passed a context object. This is a hashref you +are allowed to use to maintain state between your callbacks. There is a new +context object created for every form on your XSP page. There are two +entries filled in automatically into the hashref for you: =over 4 =item Form -This is actually an Apache::Table object, so it looks and works just like an ordinary -hashref, and contains the values submitted from the form, or is perhaps empty if the -form hasn't been submitted yet. It may also contain any parameters passed in the -querystring. For multi-value parameters, they can be accessed via Apache::Table's -get, add and set methods. See L<Apache::Table>. +This is actually an Apache::Table object, so it looks and works just like an +ordinary hashref, and contains the values submitted from the form, or is +perhaps empty if the form hasn't been submitted yet. It may also contain any +parameters passed in the querystring. For multi-value parameters, they can +be accessed via Apache::Table's get, add and set methods. See +L<Apache::Table>. =item Apache -The Apache entry is the apache request object for the current request. You can use -this, for example, to get the current URI, or to get something out of dir_config, -or perhaps to send a header. See L<Apache>. +The Apache entry is the apache request object for the current request. You +can use this, for example, to get the current URI, or to get something out +of dir_config, or perhaps to send a header. See L<Apache>. =back @@ -818,11 +855,11 @@ =head1 ARRAYED FORM ELEMENTS -Sometimes you need to display a list of items in your form where the -number of items is not known until runtime. Use arrayed form elements to trigger -the same callback for each item in the list. When setting up each element, use -an index to identify each member of the list. The callbacks will be passed the -index as a parameter. e.g. +Sometimes you need to display a list of items in your form where the number +of items is not known until runtime. Use arrayed form elements to trigger +the same callback for each item in the list. When setting up each element, +use an index to identify each member of the list. The callbacks will be +passed the index as a parameter. e.g. Your form may have a section like this: @@ -844,41 +881,49 @@ return "purchase.xsp?item=$index"; } -This example produces a list of items with a 'Buy me' button next to each one. Each -button has an index that corresponds an array index of an item in the shopping list. -When one of the submit buttons is pressed, the submit_SubmitBuy callback will be -triggered (as part of the submission procedure) and the browser will redirect to a page -that handles the purchase of the associated item. +This example produces a list of items with a 'Buy me' button next to each +one. Each button has an index that corresponds an array index of an item in +the shopping list. When one of the submit buttons is pressed, the +submit_SubmitBuy callback will be triggered (as part of the submission +procedure) and the browser will redirect to a page that handles the purchase +of the associated item. NOTE: arrays not supported for file-upload elements. =head1 XSP INHERITANCE -Starting with AxKit 1.6.1 it is possible to specify a class which your XSP page inherits -from. All the validate, load, submit and cancel functions can be in the class you -inherit from, reducing code duplication, memory usage, and complexity. +Starting with AxKit 1.6.1 it is possible to specify a class which your XSP +page inherits from. All the validate, load, submit and cancel functions can +be in the class you inherit from, reducing code duplication, memory usage, +and complexity. =head1 SPECIFYING CALLBACKS -All of the documentation here uses the default callbacks which are implied by the name -of the form element you give. Unfortunately this makes it difficult to have multiple -elements with the same validation logic without duplicating code. In order to get around -this you can manually specify the callbacks to use. - -Every main tag supports both C<onvalidate> and C<onload> attributes which specify perl -function names to validate and load respectively. Submit buttons support C<onsubmit> -attributes. Cancel buttons support C<oncancel> attributes. Forms themselves support -both C<oncancel> and C<onsubmit> attributes. +All of the documentation here uses the default callbacks which are implied +by the name of the form element you give. Unfortunately this makes it +difficult to have multiple elements with the same validation logic without +duplicating code. In order to get around this you can manually specify the +callbacks to use. + +Every main tag supports both C<onvalidate> and C<onload> attributes which +specify perl function names to validate and load respectively. Submit +buttons support C<onsubmit> attributes. Cancel buttons support C<oncancel> +attributes. Forms themselves support both C<oncancel> and C<onsubmit> +attributes. + +All tags allow a C<disabled> attribute. Set this to a true value (i.e. +C<disabled="1">) to set the control to disabled. This will be interpreted +as a HTML 4.0 feature in the default perform stylesheet. =head1 TAG DOCUMENTATION -The following documentation uses the prefix I<f:> for all PerForm tags. This assumes you -have a namespace declaration C<xmlns:f="http://axkit.org/NS/xsp/perform/v1"> in your -XSP file. - -Please note that for all of the widget tags, PerForm uses TaglibHelper. This has the -advantage that you can define attributes either as XML attributes in the tag, or -as child tags in the PerForm namespace. So: +The following documentation uses the prefix I<f:> for all PerForm tags. This +assumes you have a namespace declaration +C<xmlns:f="http://axkit.org/NS/xsp/perform/v1"> in your XSP file. + +Please note that for all of the widget tags, PerForm uses TaglibHelper. This +has the advantage that you can define attributes either as XML attributes in +the tag, or as child tags in the PerForm namespace. So: <f:textfield name="foo" default="bar"/> @@ -888,13 +933,15 @@ <f:default>bar</f:default> </f:textfield> -The advantage of this is that child tags can get their content from other XSP tags. +The advantage of this is that child tags can get their content from other +XSP tags. =head2 <f:form> -This tag has to be around the main form components. It does not have to have any ACTION -or METHOD attributes, as that is all sorted out internally. Note that you can have as -many f:form tags on a page as you want, but it probably doesn't make sense to nest them. +This tag has to be around the main form components. It does not have to have +any ACTION or METHOD attributes, as that is all sorted out internally. Note +that you can have as many f:form tags on a page as you want, but it probably +doesn't make sense to nest them. B<Attributes:> @@ -902,7 +949,8 @@ =item name -The name of the form. This name is used to call start_form_<name>, and end_form_<name>. +The name of the form. This name is used to call start_form_<name>, and +end_form_<name>. =back @@ -912,23 +960,25 @@ =item start_form_<name> -Passed a single parameter: C<$ctxt>, the context object. This callback is called before -processing the form contents. +Passed a single parameter: C<$ctxt>, the context object. This callback is +called before processing the form contents. =item end_form_<name> -Passed a single parameter: C<$ctxt>, the context object. This callback is called after -processing the form contents, but before processing any submit or cancel buttons. +Passed a single parameter: C<$ctxt>, the context object. This callback is +called after processing the form contents, but before processing any submit +or cancel buttons. =back -Note that <f:form> is the B<only> tag (besides <f:single-select/> and <f:multi-select/>) -in PerForm that has content. All other tags are empty, unless you define the attributes -in child tags, as documented above. +Note that <f:form> is the B<only> tag (besides <f:single-select/> and +<f:multi-select/>) in PerForm that has content. All other tags are empty, +unless you define the attributes in child tags, as documented above. =head2 <f:submit/> -A submit button. Every form should have one, otherwise there is little point in having a form! +A submit button. Every form should have one, otherwise there is little point +in having a form! B<Attributes:> @@ -962,14 +1012,21 @@ If you do not wish to implement the callback below, you can set the goto attribute to a URI to redirect to when the user hits the button. Normally -you won't use this unless you happen to not want to save the form values -in any way. +you won't use this unless you happen to not want to save the form values in +any way. =item index If your button is a member of an array, then set the index attribute to the corresponding array index. +=item onclick + +This attribute is intended to be passed through to the generated +output for client-side onClick routines (usually written in javascript). +Simply specify a string as you would if writing dynamic html +forms in plain HTML. + =back B<Callbacks:> @@ -979,21 +1036,24 @@ =item submit_<name> ( $ctxt , $index ) This callback is used to "do something" with the submitted form values. You -might write them to a database or a file, or change something in your application. +might write them to a database or a file, or change something in your +application. -The $index parameter identifies which button was pressed in an array of buttons. +The $index parameter identifies which button was pressed in an array of +buttons. -The return value from submit_<name> is used to redirect the user to the "next" -page, whatever that might be. +The return value from submit_<name> is used to redirect the user to the +"next" page, whatever that might be. =back =head2 <f:cancel/> -A cancel button. This is similar to the submit button, but instead of being used -to save the form values (or "do something" with them), should be used to cancel -the use of this particular form and go somewhere else. The most common use of this -is to simply set the I<goto> attribute to redirect to another page. +A cancel button. This is similar to the submit button, but instead of being +used to save the form values (or "do something" with them), should be used +to cancel the use of this particular form and go somewhere else. The most +common use of this is to simply set the I<goto> attribute to redirect to +another page. B<Attributes:> @@ -1005,8 +1065,9 @@ =item cancel_<name> ( $ctxt, $index ) -Implement this method to override the goto attribute. Return the URI you want to redirect -to. This can be used to dynamically generate the URI to redirect to. +Implement this method to override the goto attribute. Return the URI you +want to redirect to. This can be used to dynamically generate the URI to +redirect to. =back @@ -1020,9 +1081,9 @@ =item name (mandatory) -The name of the textfield. Should be unique to the entire XSP page, as callbacks only use -the widget name. Can also be used in C<$ctxt-E<gt>{Form}{E<lt>nameE<gt>}> to retrieve the -value. +The name of the textfield. Should be unique to the entire XSP page, as +callbacks only use the widget name. Can also be used in +C<$ctxt-E<gt>{Form}{E<lt>nameE<gt>}> to retrieve the value. =item default @@ -1030,8 +1091,8 @@ =item width -The width of the textfield on the screen. Units are dependant on the final rendering -method - for HTML this would be em characters. +The width of the textfield on the screen. Units are dependant on the final +rendering method - for HTML this would be em characters. =item maxlength @@ -1039,8 +1100,14 @@ =item index -If your text field is a member of an array, then set the index attribute to the -corresponding array index. +If your text field is a member of an array, then set the index attribute to +the corresponding array index. + +=item onchange + +This is a javascript callback implemented on the client side in HTML 4.0 +capable browsers. It simply passes the value through to the generated +HTML. =back @@ -1050,22 +1117,23 @@ =item load_<name> ( $ctxt, $default, $current, $index ) -Used to load a value into the edit box. The default is from the attributes above. The -current value is only set if this form has been submitted once already, and contains -the value submitted. +Used to load a value into the edit box. The default is from the attributes +above. The current value is only set if this form has been submitted once +already, and contains the value submitted. Simply return the value you want to appear in the textfield. -If the text field is a memeber of an array, then $index will be the array index. +If the text field is a memeber of an array, then $index will be the array +index. If you do not implement this method, the value in the textfield defaults to C<$current || $default>. =item validate_<name> ( $ctxt, $value, $index ) -Implement this method to validate the contents of the textfield. If the value is valid, -you don't need to do anything. However if it invalid, throw an exception with the reason -why it is invalid. Example: +Implement this method to validate the contents of the textfield. If the +value is valid, you don't need to do anything. However if it invalid, throw +an exception with the reason why it is invalid. Example: sub validate_username { my ($ctxt, $value) = @_; @@ -1076,14 +1144,15 @@ die "Invalid characters" if $value =~ /\W/; } -If the text field is a memeber of an array, then $index will be the array index. +If the text field is a memeber of an array, then $index will be the array +index. =back =head2 <f:password/> -A password entry field. This works B<exactly> the same way as a textfield, so we don't -duplicate the documentation here +A password entry field. This works B<exactly> the same way as a textfield, +so we don't duplicate the documentation here =head2 <f:checkbox/> @@ -1103,18 +1172,25 @@ =item checked -Set to 1 or yes to have this checkbox checked by default. Set to 0, no, or leave -off altogether to have it unchecked. +Set to 1 or yes to have this checkbox checked by default. Set to 0, no, or +leave off altogether to have it unchecked. =item label -Used in HTML 4.0, the label for the checkbox. Use this with care as most browsers -don't support it. +Used in HTML 4.0, the label for the checkbox. Use this with care as most +browsers don't support it. =item index Use this to identify the array index when using arrayed form elements. +=item onclick + +This attribute is intended to be passed through to the generated +output for client-side onClick routines (usually written in javascript). +Simply specify a string as you would if writing dynamic html +forms in plain HTML. + =back B<Callbacks:> @@ -1123,22 +1199,24 @@ =item load_<name> ( $ctxt, $current, $index ) -If you implement this method, you can change the default checked state of the -checkbox, and the value returned by the checkbox if you need to. +If you implement this method, you can change the default checked state of +the checkbox, and the value returned by the checkbox if you need to. -Return one or two values. The first value is whether the box is checked or not, -and the second optional value is what value is sent to the server when the checkbox -is checked and submitted. +Return one or two values. The first value is whether the box is checked or +not, and the second optional value is what value is sent to the server when +the checkbox is checked and submitted. =item validate_<name> ( $ctxt, $value, $index ) -Validate the value in the checkbox. Throw an exception to indicate validation failure. +Validate the value in the checkbox. Throw an exception to indicate +validation failure. =back =head2 <f:file-upload/> -A file upload field (normally in HTML, a text entry box, and a "Browse..." button). +A file upload field (normally in HTML, a text entry box, and a "Browse..." +button). B<Attributes:> @@ -1150,13 +1228,20 @@ =item value -A default filename to put in the box. Use with care because putting something in here -is not very user friendly! +A default filename to put in the box. Use with care because putting +something in here is not very user friendly! =item accept -A list of MIME types to accept in this dialog box. Some browsers might use this in the -Browse dialog to restrict the list of files to show. +A list of MIME types to accept in this dialog box. Some browsers might use +this in the Browse dialog to restrict the list of files to show. + +=item onclick + +This attribute is intended to be passed through to the generated +output for client-side onClick routines (usually written in javascript). +Simply specify a string as you would if writing dynamic html +forms in plain HTML. =back @@ -1166,16 +1251,18 @@ =item load_<name> ( $ctxt, $default, $current ) -Load a new value into the file upload field. Return the value to go in the field. +Load a new value into the file upload field. Return the value to go in the +field. =item validate_<name> ( $ctxt, $filename, $fh, $size, $type, $info ) -Validate the uploaded file. This is also actually the place where you would save the -file to disk somewhere, by reading from $fh and writing to somewhere else, or using -File::Copy to do that for you. It is much harder to access the file from the submit -callback. +Validate the uploaded file. This is also actually the place where you would +save the file to disk somewhere, by reading from $fh and writing to +somewhere else, or using File::Copy to do that for you. It is much harder to +access the file from the submit callback. -If the file is somehow invalid, throw an exception with the text of why it is invalid. +If the file is somehow invalid, throw an exception with the text of why it +is invalid. =back @@ -1183,10 +1270,10 @@ A hidden form field, for storing persistent information across submits. -PerForm hidden fields are quite useful because they are self validating against -modification between submits, so if a malicious user tries to change the value by -editing the querystring or changing the form value somehow, the execution of your -script will die with an exception. +PerForm hidden fields are quite useful because they are self validating +against modification between submits, so if a malicious user tries to change +the value by editing the querystring or changing the form value somehow, the +execution of your script will die with an exception. B<Attributes:> @@ -1212,8 +1299,8 @@ =item load_<name> ( $ctxt, $default, $index ) -If you wish the value to be dynamic somehow, implement this callback and return a -new value for the hidden field. +If you wish the value to be dynamic somehow, implement this callback and +return a new value for the hidden field. =back @@ -1241,8 +1328,8 @@ =item wrap -Set this to "yes" or "1" to have the textarea wrap the text automatically. Set to -"no" or leave blank to not wrap. Default is to not wrap. +Set this to "yes" or "1" to have the textarea wrap the text automatically. +Set to "no" or leave blank to not wrap. Default is to not wrap. =item default @@ -1252,6 +1339,12 @@ Use this to identify the array index when using arrayed form elements. +=item onchange + +This is a javascript callback implemented on the client side in HTML 4.0 +capable browsers. It simply passes the value through to the generated +HTML. + =back B<Callbacks:> @@ -1260,14 +1353,15 @@ =item load_<name> ( $ctxt, $default, $current, $index ) -Load a new value into the widget. Return the string you want to appear in the box. +Load a new value into the widget. Return the string you want to appear in +the box. =item validate_<name> ( $ctxt, $value, $index ) -Validate the contents of the textarea. If the contents are somehow invalid, throw -an exception in your code with the string of the error. One use for this might be -validating a forums posting edit box against a small DTD of HTML-like elements. You can -use XML::LibXML to do this, like this: +Validate the contents of the textarea. If the contents are somehow invalid, +throw an exception in your code with the string of the error. One use for +this might be validating a forums posting edit box against a small DTD of +HTML-like elements. You can use XML::LibXML to do this, like this: sub validate_body { my ($ctxt, $value) = @_; @@ -1303,8 +1397,8 @@ A drop-down select list of items. -The single-select and multi-select (below) elements can be populated either by callbacks -or through embedded elements. +The single-select and multi-select (below) elements can be populated either +by callbacks or through embedded elements. B<Attributes:> @@ -1322,6 +1416,12 @@ Use this to identify the array index when using arrayed form elements. +=item onchange + +This is a javascript callback implemented on the client side in HTML 4.0 +capable browsers. It simply passes the value through to the generated +HTML. + =back B<Elements:> @@ -1353,12 +1453,13 @@ =item load_<name> ( $ctxt, $currently_selected ) -The return values for this callback both populate the list, and define which value -is selected. +The return values for this callback both populate the list, and define which +value is selected. The return set is a simple list: selected, text, value, text, value, ... -Where selected matches a B<value> from that list. So, for example, it might be: +Where selected matches a B<value> from that list. So, for example, it might +be: sub load_list { my ($ctxt, $current) = @_; @@ -1371,7 +1472,8 @@ =item validate_<name> ( $ctxt, $value ) -Validate the value. Throw an exception with the text of the error if something is wrong. +Validate the value. Throw an exception with the text of the error if +something is wrong. =back @@ -1389,14 +1491,20 @@ =item default -The default value that is to be selected. This can be specified as -a child element (e.g. <f:default>) in order to indicate multiple -default values. +The default value that is to be selected. This can be specified as a child +element (e.g. <f:default>) in order to indicate multiple default values. =item index Use this to identify the array index when using arrayed form elements. +=item onclick + +This attribute is intended to be passed through to the generated +output for client-side onClick routines (usually written in javascript). +Simply specify a string as you would if writing dynamic html +forms in plain HTML. + =back B<Elements:> @@ -1410,13 +1518,14 @@ =item load_<name> ( $ctxt, $currently_selected ) -This works very similarly to the load callback for single selects (above), except that -both the $currently_selected, and the returned selected value are array refs. +This works very similarly to the load callback for single selects (above), +except that both the $currently_selected, and the returned selected value +are array refs. =item validate_<name> ( $ctxt, $values ) -Here $values is an array ref of the selected values. As usual, if one is in error somehow, -throw an exception containing the text of the error. +Here $values is an array ref of the selected values. As usual, if one is in +error somehow, throw an exception containing the text of the error. =back