DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=30872>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=30872

Struts Validation - Client Side required field validation fails for SELECT lists and 
checkboxes





------- Additional Comments From [EMAIL PROTECTED]  2004-09-06 11:13 -------
NOTE: I have seen this issue has been solved in cvs head (for required 
validation). I am posting this anyway as I think it is a more general solution 
(it grabs all values for an element so you don't have to care what type of 
element it is, just its values). Please read on.

The problem with this is the way html handles different input types. Some input 
types (text, textarea, hidden, password, select-one and file) can only return 
single values. Checkboxes, radio buttons (surprising enough) and select-
multiple return multiple values. When performing required validation (this also 
happens with other validations, some of them even check less types) it is not 
validating checkboxes and select-multiple and it isn't correctly handling radio 
buttons. I propose a different way of doing things:

1. First fill the object we use for validation with all the values is currently 
holding. Textarea, text... will have a single element array and checkbox and 
select-multiple may have multiple values.
2. Loop through the validatable elements and then through all their values to 
perform the actual validation.

We could have textareas, text... to set only a value (not an array), but IMO 
this may lead to confusion and possible inconsistencies.

I beleive that all validations should check all the possible scenarios. I don't 
see why select-one elements should not be checked for maxlength or minlength. 
They are all form-elements regardless of how they are displayed and they will 
eventually pass as request parameters.

I am sending a patch with a new javascript function that sets all values on 
their respective elements.

validateRequired and validateMinLength is using this new approach as well (so 
you can se it work).

It is quite difficult to provide tests for this. Solex could probably do the 
job for this. It records http activity (as a tunnel) and then can be used as 
tests. I haven't used it but it sounds good to me. Anyway, this has been tested 
on IE6 and Mozilla 1.72

Should the javascript functions try to guess correct validation definition (for 
example: is the field "textField" present before checking if its value is not 
empty?) 

The new function would be:

  function fillValidateValues(form, oObject) {
    //we'll set a fourth element in the array containing an array of values
    for (fillx in oObject) {
        //variable must be set to something different than x or it gets 
confused with caller's x var
        var fillfield = form[oObject[fillx][0]];
        var values = new Array();
        var count = 0;
        if (fillfield.type) {
            if (fillfield.type == 'text' ||
                fillfield.type == 'textarea' ||
                fillfield.type == 'hidden' ||
                fillfield.type == 'file' ||
                fillfield.type == 'select-one' ||
                fillfield.type == 'select-multiple' ||
                fillfield.type == 'password') {
                // get field's value
                if (fillfield.type == "select-one") {
                    var si = fillfield.selectedIndex;
                    //we shouldn't check if si >=0 since select-ones will 
always be there when submitting
                    values[count++] = fillfield.options[si].value;
                } else if (fillfield.type == "select-multiple") {
                    //we get all the selected values of this select-multiple
                    //looping through its options array
                    for (i=0; i<fillfield.options.length; i++) {
                        if (fillfield.options[i].selected) {
                            values[count++] = fillfield.options[i].value;
                        }
                    }
                } else {
                    values[count++] = fillfield.value;
                }
            } else if (fillfield.checked) {
                //it's a single checkbox or single radio
                values[count++] = fillfield.value;
            }
        } else {//it's a nodeList (radio group or checkbox group)
            for (i=0; i<fillfield.length; i++) {
                if (fillfield[i].checked) {
                    values[count++] = fillfield[i].value;
                }
            }
        }
        oObject[fillx][3] = values;
    }
    return oObject;
  }


PD: I am posting again since it didn't get all the message

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

Reply via email to