quickform - client side validation problem
| From: | Hodicska Gergely | 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
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