Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
/**
3
 * DHTML replacement for the standard JavaScript alert window for client-side
4
 * validation
5
 *
6
 * PHP versions 4 and 5
7
 *
8
 * LICENSE: This source file is subject to version 3.01 of the PHP license
9
 * that is available through the world-wide-web at the following URI:
10
 * http://www.php.net/license/3_01.txt.  If you did not receive a copy of
11
 * the PHP License and are unable to obtain it through the web, please
12
 * send a note to license@php.net so we can mail you a copy immediately.
13
 *
14
 * @category   HTML
15
 * @package    HTML_QuickForm_DHTMLRulesTableless
16
 * @author     Alexey Borzov <borz_off@cs.msu.su>
17
 * @author     Adam Daniel <adaniel1@eesus.jnj.com>
18
 * @author     Bertrand Mansion <bmansion@mamasam.com>
19
 * @author     Justin Patrin <papercrane@gmail.com>
20
 * @author     Mark Wiesemann <wiesemann@php.net>
21
 * @copyright  2005-2006 The PHP Group
22
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
23
 * @version    CVS: $Id$
24
 * @link       http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless
25
 */
26
 
27
require_once 'HTML/QuickForm.php';
28
 
29
/**
30
 * This is a DHTML replacement for the standard JavaScript alert window for
31
 * client-side validation of forms built with HTML_QuickForm
32
 *
33
 * @category   HTML
34
 * @package    HTML_QuickForm_DHTMLRulesTableless
35
 * @author     Alexey Borzov <borz_off@cs.msu.su>
36
 * @author     Adam Daniel <adaniel1@eesus.jnj.com>
37
 * @author     Bertrand Mansion <bmansion@mamasam.com>
38
 * @author     Justin Patrin <papercrane@gmail.com>
39
 * @author     Mark Wiesemann <wiesemann@php.net>
40
 * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
41
 * @version    Release: 0.1.3
42
 * @link       http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless
43
 */
44
class HTML_QuickForm_DHTMLRulesTableless extends HTML_QuickForm {
45
    // {{{ getValidationScript()
46
 
47
    /**
48
     * Returns the client side validation script
49
     *
50
     * The code here was copied from HTML_QuickForm and slightly modified to run rules per-element
51
     *
52
     * @access    public
53
     * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
54
     */
55
    function getValidationScript()
56
    {
57
        if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
58
            return '';
59
        }
60
 
61
        include_once('HTML/QuickForm/RuleRegistry.php');
62
        $registry =& HTML_QuickForm_RuleRegistry::singleton();
63
        $test = array();
64
        $js_escape = array(
65
            "\r"    => '\r',
66
            "\n"    => '\n',
67
            "\t"    => '\t',
68
            "'"     => "\\'",
69
            '"'     => '\"',
70
            '\\'    => '\\\\'
71
        );
72
 
73
        foreach ($this->_rules as $elementName => $rules) {
74
            foreach ($rules as $rule) {
75
                if ('client' == $rule['validation']) {
76
                    unset($element);
77
 
78
                    $dependent  = isset($rule['dependent']) && is_array($rule['dependent']);
79
                    $rule['message'] = strtr($rule['message'], $js_escape);
80
 
81
                    if (isset($rule['group'])) {
82
                        $group    =& $this->getElement($rule['group']);
83
                        // No JavaScript validation for frozen elements
84
                        if ($group->isFrozen()) {
85
                            continue 2;
86
                        }
87
                        $elements =& $group->getElements();
88
                        foreach (array_keys($elements) as $key) {
89
                            if ($elementName == $group->getElementName($key)) {
90
                                $element =& $elements[$key];
91
                                break;
92
                            }
93
                        }
94
                    } elseif ($dependent) {
95
                        $element   =  array();
96
                        $element[] =& $this->getElement($elementName);
97
                        foreach ($rule['dependent'] as $idx => $elName) {
98
                            $element[] =& $this->getElement($elName);
99
                        }
100
                    } else {
101
                        $element =& $this->getElement($elementName);
102
                    }
103
                    // No JavaScript validation for frozen elements
104
                    if (is_object($element) && $element->isFrozen()) {
105
                        continue 2;
106
                    } elseif (is_array($element)) {
107
                        foreach (array_keys($element) as $key) {
108
                            if ($element[$key]->isFrozen()) {
109
                                continue 3;
110
                            }
111
                        }
112
                    }
113
 
114
                    $test[$elementName][] = $registry->getValidationScript($element, $elementName, $rule);
115
                }
116
            }
117
        }
118
        $js = '
119
<script type="text/javascript">
120
//<![CDATA[
121
function qf_errorHandler(element, _qfMsg) {
122
  div = element.parentNode;
123
  if (_qfMsg != \'\') {
124
    span = document.createElement("span");
125
    span.className = "error";
126
    span.appendChild(document.createTextNode(_qfMsg.substring(3)));
127
    br = document.createElement("br");
128
 
129
    var errorDiv = document.getElementById(element.name + \'_errorDiv\');
130
    if (!errorDiv) {
131
      errorDiv = document.createElement("div");
132
      errorDiv.id = element.name + \'_errorDiv\';
133
    }
134
    while (errorDiv.firstChild) {
135
      errorDiv.removeChild(errorDiv.firstChild);
136
    }
137
 
138
    errorDiv.insertBefore(br, errorDiv.firstChild);
139
    errorDiv.insertBefore(span, errorDiv.firstChild);
140
    element.parentNode.insertBefore(errorDiv, element.parentNode.firstChild);
141
 
142
    if (div.className.substr(div.className.length - 6, 6) != " error"
143
        && div.className != "error") {
144
      div.className += " error";
145
    }
146
 
147
    return false;
148
  } else {
149
    var errorDiv = document.getElementById(element.name + \'_errorDiv\');
150
    if (errorDiv) {
151
      errorDiv.parentNode.removeChild(errorDiv);
152
    }
153
 
154
    if (div.className.substr(div.className.length - 6, 6) == " error") {
155
      div.className = div.className.substr(0, div.className.length - 6);
156
    } else if (div.className == "error") {
157
      div.className = "";
158
    }
159
 
160
    return true;
161
  }
162
}';
163
        $validateJS = '';
164
        foreach ($test as $elementName => $jsArr) {
165
            $js .= '
166
function validate_' . $this->_attributes['id'] . '_' . $elementName . '(element) {
167
  var value = \'\';
168
  var errFlag = new Array();
169
  var _qfGroups = {};
170
  var _qfMsg = \'\';
171
  var frm = element.parentNode;
172
  while (frm && frm.nodeName != "FORM") {
173
    frm = frm.parentNode;
174
  }
175
' . join("\n", $jsArr) . '
176
  return qf_errorHandler(element, _qfMsg);
177
}
178
';
179
            $validateJS .= '
180
  ret = validate_' . $this->_attributes['id'] . '_' . $elementName.'(frm.elements[\''.$elementName.'\']) && ret;';
181
            unset($element);
182
            $element =& $this->getElement($elementName);
183
            $valFunc = 'validate_' . $this->_attributes['id'] . '_' . $elementName . '(this)';
184
            $onBlur = $element->getAttribute('onBlur');
185
            $onChange = $element->getAttribute('onChange');
186
            $element->updateAttributes(array('onBlur' => $onBlur . $valFunc,
187
                                             'onChange' => $onChange . $valFunc));
188
        }
189
        $js .= '
190
function validate_' . $this->_attributes['id'] . '(frm) {
191
  var ret = true;
192
' . $validateJS . ';
193
  return ret;
194
}
195
//]]>
196
</script>';
197
        return $js;
198
    } // end func getValidationScript
199
 
200
    // }}}
201
}
202
 
203
?>