quickform - client side validation problem

From: Date: Tue, 28 Oct 2003 11:23:45 +0000
Subject: quickform - client side validation problem
Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-23079@lists.php.net to get a copy of this message
Hi! I tried to use the QuickForm class. It is great, but I found a little bug in the client side validation. The required rule doesn't work on radio button, because you check the value property on validation instead of checked, and this property always have value if it was given. And another problem was: if you use rule on a select with the force possibility it doesn't work on client side. I made a little change on the getValidationScript function, you should try it. Greats, Felho p.s.: I sent this mail to the authors of the class earlier, but I didn't get any answer.

function getValidationScript() { if (empty($this->_rules) || $this->_freezeAll) { return ''; } $html = ''; $tabs = $this->_getTabs(); $test = array(); $js_escape = array( "\r" => '\r', "\n" => '\n', "\t" => '\t', "'" => "\\'", '"' => '\"', '\\' => '\\\\' ); for (reset($this->_rules); $elementName = key($this->_rules); next($this->_rules)) { $rules = pos($this->_rules); foreach ($rules as $rule) { $type = $rule['type']; $validation = $rule['validation']; $message = $rule['message']; $format = $rule['format']; $reset = (isset($rule['reset'])) ? $rule['reset'] : false; $ruleData = $GLOBALS['_HTML_QuickForm_registered_rules'][$type]; if ($validation == 'client') { $index = $this->_elementIndex[$elementName]; if ($this->_elements[$index]->getType() == 'group') { $value = "$tabs\t\tvar value = '';\n" . "$tabs\t\tfor (var i = 0; i < frm.elements.length; i++) {\n" . "$tabs\t\t\tvar _element = frm.elements[i]\n" . "$tabs\t\t\tif (_element.name.indexOf('$elementName') == 0) {\n" . "$tabs\t\t\t\tswitch (_element.type) {\n" . "$tabs\t\t\t\tcase 'checkbox':\n" . "$tabs\t\t\t\tcase 'radio':\n" . "$tabs\t\t\t\t\t_value = _element.checked ? '1' : '';\n" . "$tabs\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\tcase 'select':\n" . "$tabs\t\t\t\t\t_value = _element.selectedIndex != -1 ? '1' : '';\n" . "$tabs\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\tdefault:\n" . "$tabs\t\t\t\t\t_value = _element.value;\n" . "$tabs\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\t}\n" . "$tabs\t\t\t\tvalue += _value;\n" . "$tabs\t\t\t}\n" . "$tabs\t\t}"; if ($reset) { $tmp_reset = "$tabs\t\t\tfor (var i = 0; i < frm.elements.length; i++) {\n" . "$tabs\t\t\t\tif (frm.elements[i].name.indexOf('$elementName') == 0) {\n" . "$tabs\t\t\t\t\tvar _element = frm.elements[i]\n" . "$tabs\t\t\t\t\tswitch (_element.type) {\n" . "$tabs\t\t\t\t\tcase 'checkbox':\n" . "$tabs\t\t\t\t\tcase 'radio':\n" . "$tabs\t\t\t\t\t\t_element.checked = _element.defaultChecked;\n" . "$tabs\t\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\t\tcase 'select':\n" . "$tabs\t\t\t\t\t\tfor (var i = 0; i < _element.options.length; i++) {\n" . "$tabs\t\t\t\t\t\t\t_element.options[i].selected = _element.options[i].defaultSelected;\n" . "$tabs\t\t\t\t\t\t}\n" . "$tabs\t\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\t\tdefault:\n" . "$tabs\t\t\t\t\t\t_element.value = _element.defaultValue;\n" . "$tabs\t\t\t\t\t\tbreak;\n" . "$tabs\t\t\t\t\t}\n" . "$tabs\t\t\t\t}\n" . "$tabs\t\t\t}\n"; } else { $tmp_reset = ''; } } elseif ($this->_elements[$index]->getType() == 'select') { $bracket = $this->_elements[$index]->getMultiple() ? '[]' : ''; $value = "$tabs\t\tif (frm.elements['$elementName$bracket'].selectedIndex != -1) {\n" . "$tabs\t\t\tvar value = 1;\n" . "$tabs\t\t} else {\n" . "$tabs\t\t\tvar value = '';\n" . "$tabs\t\t}"; if ($reset) { $tmp_reset = "$tabs\t\t\tvar _select = frm.elements['$elementName$bracket'];\n" . "$tabs\t\t\tfor (var i = 0; i < _select.options.length; i++) {\n" . "$tabs\t\t\t\t_select.options[i].selected = _select.options[i].defaultSelected;\n" . "$tabs\t\t\t}\n"; } else { $tmp_reset = ''; } } elseif ($this->_elements[$index]->getType() == 'checkbox') { $value = "$tabs\t\tif (frm.elements['$elementName'].checked) {\n" . "$tabs\t\t\tvar value = 1;\n" . "$tabs\t\t} else {\n" . "$tabs\t\t\tvar value = '';\n" . "$tabs\t\t}"; $tmp_reset = ($reset) ? "$tabs\t\tfield.checked = field.defaultChecked;\n" : ''; } else { $value = "$tabs\t\tvar value = frm.elements['$elementName'].value;"; $tmp_reset = ($reset) ? "$tabs\t\tfield.value = field.defaultValue;\n" : ''; } switch ($ruleData[0]) { case 'regex': $regex = str_replace('%data%', $format, $ruleData[1]); if (!$this->isElementRequired($elementName)) { // This regex will make the rule optional and preserve your delimiters $regex = preg_replace('/^(\/|.*[^\^])(.*)\1$/', '$1^$|$2$1', $regex); } $test[] = "$value\n" . "$tabs\t\tvar field = frm.elements['$elementName'];\n" . "$tabs\t\tvar regex = $regex;\n" . "$tabs\t\tif (!regex.test(value) && !errFlag['$elementName']) {\n" . "$tabs\t\t\terrFlag['$elementName'] = true;\n" . "$tabs\t\t\t_qfMsg = _qfMsg + '\\n - ".strtr($message, $js_escape)."';\n". $tmp_reset. "$tabs\t\t}"; break; case 'function': $test[] = "$value\n" . "$tabs\t\tvar field = frm.elements['$elementName'];\n" . "$tabs\t\tif (!" . $ruleData[1] . "('$elementName', value) && !errFlag['$elementName']) {\n" . "$tabs\t\t\terrFlag['$elementName'] = true;\n" . "$tabs\t\t\t_qfMsg = _qfMsg + '\\n - ".strtr($message, $js_escape)."';\n" . "$tabs\t\t}"; break; } } } } if (is_array($test) && count($test) > 0) { $html .= "$tabs\tfunction validate_" . $this->_attributes['name'] .. "() {\n" . "$tabs\t\tvar errFlag = new Array();\n" . "$tabs\t\t_qfMsg = '';\n" . "$tabs\t\tvar frm = document.forms['" . $this->_attributes['name'] . "'];\n"; $html .= join("\n", $test); $html .= "$tabs\n\t\tif (_qfMsg != '') {\n" . "$tabs\t\t\t_qfMsg = '$this->_jsPrefix' + _qfMsg;\n" . "$tabs\t\t\t_qfMsg = _qfMsg + '\\n$this->_jsPostfix';\n" . "$tabs\t\t\talert(_qfMsg);\n" . "$tabs\t\t\treturn false;\n" . "$tabs\t\t}\n" . "$tabs\t\treturn true;\n" . "$tabs }\n"; $html = "$tabs\n<script type=\"text/javascript\">\n" . "$tabs<!-- \n" . $html . "$tabs//-->\n" . "$tabs</script>"; } return $html; } // end func getValidationScript
« previous php.pear.dev (#23079) next »