5 * Add client side validation support for fapi validation
8 function clientside_validation_fapi_clientside_validation_form_alter(&$form, &$form_state, &$js_rules) {
9 clientside_validation_fapi_after_build_recurse($form['#id'], $form, $form_state, $js_rules);
12 function clientside_validation_fapi_after_build_recurse($form_id, &$form, &$form_state, &$js_rules) {
13 if ($children = array_values(element_children($form))) {
14 foreach ($children as
$index => $item) {
15 $element = &$form[$item];
17 'textfield', 'textarea', 'select', 'radio', 'checkbox', 'password', 'file', 'radios', 'checkboxes',
19 if (isset($element['#type']) && in_array($element['#type'], $types)) {
20 clientside_validation_fapi_regular($form_id, $element, $js_rules);
22 clientside_validation_fapi_after_build_recurse($form_id, $element, $form_state, $js_rules);
27 function clientside_validation_fapi_regular($form_id, $element, &$js_rules) {
28 if (isset($element['#name']) && isset($element['#rules'])) {
29 $el_name = $element['#name'];
31 if (isset($element['#title'])) {
32 $el_title = $element['#title'];
34 $data = _fapi_validation_data('rules');
35 foreach ($element['#rules'] as
$rule) {
36 $params = array($element['#value']);
37 $error_message = NULL
;
39 // If $rule is an array, use error message if is set.
40 if (is_array($rule)) {
41 if (isset($rule['error'])) {
42 $error_message = $rule['error'];
45 if (!isset($rule['rule'])) {
46 drupal_set_message(t('Rule array with wrong structure on %field.', array('%field' => $element['#name'])), 'error');
49 $rule = $rule['rule'];
52 preg_match('/^(.*?)(\[(.*)\])?$/', $rule, $rs);
56 if (!isset($data[$rule])) {
57 $error_message = t('Rule %rule not found!', array('%rule' => $rule));
61 // Parsing parameters.
63 $params[] = preg_split('/ *, */', $rs[3]);
65 if (count($params) > 1) {
68 $error = is_null($error_message) ?
$data[$rule]['error_msg'] : $error_message;
69 _clientside_validation_set_fapi_validation($element, $data[$rule], $params, $js_rules, $error);
75 * Set fapi validation.
77 function _clientside_validation_set_fapi_validation($element, $rule, $params, &$js_rules, $message = '') {
78 $callback = $rule['callback'];
79 $name = $element['#name'];
81 if (isset($element['#title'])) {
82 $title = $element['#title'];
85 'fapi_validation_rule_alpha' => '/^[\pL]++$/uD',
86 'fapi_validation_rule_alpha_numeric' => '/^[\pL\pN]++$/uD',
87 'fapi_validation_rule_ipv4' => '/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
88 .
'(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/',
89 'fapi_validation_rule_alpha_dash' => '/^[-\pL\pN_]+$/uD',
90 'fapi_validation_rule_digit' => '/^\d+$/',
93 case
'fapi_validation_rule_alpha':
95 case
'fapi_validation_rule_alpha_numeric':
96 $type = 'alpha numeric';
97 case
'fapi_validation_rule_ipv4':
99 case
'fapi_validation_rule_alpha_dash':
100 $type = 'alpha dash';
101 case
'fapi_validation_rule_digit':
103 case
'fapi_validation_rule_regexp':
104 if ($callback == 'fapi_validation_rule_regexp') {
105 $expressions['fapi_validation_rule_regexp'] = $params[1][0];
108 if (strpos($message, '%field') !== FALSE
) {
109 $message = t($message, array('%field' => variable_get('clientside_validation_prefix', '') .
$title .
variable_get('clientside_validation_suffix', '')));
111 _clientside_validation_set_regex_pcre($name, $title, $js_rules, $expressions[$callback], $message, $type);
114 case
'fapi_validation_rule_numeric':
115 _clientside_validation_set_number_decimal($name, $title, '.', $js_rules);
117 case
'fapi_validation_rule_email':
118 _clientside_validation_set_email($name, $title, $js_rules);
120 case
'fapi_validation_rule_length':
121 if (count($params) == 1) {
122 _clientside_validation_set_minmaxlength($name, $title, '', $params[0], $js_rules);
124 elseif (count($params) == 2) {
125 _clientside_validation_set_minmaxlength($name, $title, $params[0], $params[1], $js_rules);
128 case
'fapi_validation_rule_url':
129 _clientside_validation_set_url($name, $title, $js_rules);
131 case
'fapi_validation_rule_chars':
132 _clientside_validation_set_specific_values($name, $title, $params, $js_rules);
134 case
'fapi_validation_rule_decimal':
135 if (count($params) == 2) {
136 $expression = '/^[0-9]{' .
$params[0] .
'}\.[0-9]{' .
$params[1] .
'}$/';
139 $expression = '/\d+\.\d+/';
141 if (strpos($message, '%field') !== FALSE
) {
142 $message = t($message, array('%field' => variable_get('clientside_validation_prefix', '') .
$title .
variable_get('clientside_validation_suffix', '')));
144 _clientside_validation_set_regex_pcre($name, $title, $js_rules, $expression, $message, 'decimal');
147 $context = array('type' => 'fapi', 'rule' => $rule, 'message' => $message, 'params' => $params);
148 drupal_alter('clientside_validation_rule', $js_rules, $element, $context);