diff --git a/clientside_validation.admin.inc b/clientside_validation.admin.inc index 43ad2f3..b979e05 100644 --- a/clientside_validation.admin.inc +++ b/clientside_validation.admin.inc @@ -328,6 +328,56 @@ function clientside_validation_admin_settings() { '#title' => t("Enter form IDs below"), '#description' => t('You can specify form IDs (one per line) of forms that should or should not be validated.'), ); + if (module_exists('xregexp_api')) { + $lib = xregexp_api_libraries_detect('xregexp'); + if ($lib && $lib['installed']) { + //XRegExp settings + $form['clientside_validation_xregxp'] = array( + '#type' => 'fieldset', + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#title' => t('XRegExp for Pattern matching'), + '#description' => t("Javascript doesn't support regular expressions for + pattern matching the way PHP does. With the XRegExp library most PHP + expressions(pregex) become also available in Javascript. So you might + want to use that instead of AJAX calls."), + ); + + $form['clientside_validation_xregxp']['clientside_validation_usexregxp'] = array( + '#prefix' => '
', + '#title' => t('Use XRegExp'), + '#description' => t('Check to use XRegExp for PCRE.'), + '#type' => 'checkbox', + '#default_value' => variable_get('clientside_validation_usexregxp', 0), + ); + $options = array('' => t('default')); + foreach ($lib['variants'] as $name => $variant) { + if (!isset($variant['error']) || !$variant['error']) { + $options[$name] = $name; + } + } + $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant'] = array( + '#title' => t('XRegExp variant'), + '#description' => t('Choose which variant of the library you want to use.'), + '#type' => 'select', + '#options' => $options, + '#default_value' => variable_get('clientside_validation_xregxp_variant', ''), + ); + if (version_compare($lib['version'], '2', '>=')) { + $form['clientside_validation_xregxp']['clientside_validation_xregxp_variant']['#description'] .= '
' . + t('!warning: You are using version 2.x or higher of the XRegExp library. + For best compatibility (including some !fapi rules) you should enable + the backcompat.js plugin on the !settingspage', + array( + '!warning' => 'Warning', + '!fapi' => l(t('FAPI Validation'), 'http://drupal.org/project/fapi_validation'), + '!settingspage' => l(t('XRegExp API Settings page'), 'admin/config/system/xregexp'), + ) + ); + } + } + } + return system_settings_form($form); -} \ No newline at end of file +} diff --git a/clientside_validation.js b/clientside_validation.js index c04c95d..126c9c7 100644 --- a/clientside_validation.js +++ b/clientside_validation.js @@ -445,7 +445,7 @@ Drupal.clientsideValidation.prototype.bindRules = function(formid){ } Drupal.clientsideValidation.prototype.addExtraRules = function(){ - + var self = this; jQuery.validator.addMethod("numberDE", function(value, element) { return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); }); @@ -494,15 +494,16 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){ } return true; }); - - jQuery.validator.addMethod("regexMatchPCRE", function(value, element, param) { + + // Default regular expression support + var ajaxPCREfn = function(value, element, param) { var result = false; jQuery.ajax({ 'url': Drupal.settings.basePath + 'clientside_validation/ajax', 'type': "POST", 'data': { 'value': value, - 'param': JSON.stringify(param) + 'param': param }, 'dataType': 'json', 'async': false, @@ -510,15 +511,61 @@ Drupal.clientsideValidation.prototype.addExtraRules = function(){ result = res; } }); - if (result['result'] === false) { - if (result['message'].length) { + if (result.result === false) { + if (result.message.length) { jQuery.extend(jQuery.validator.messages, { - "regexMatchPCRE": result['message'] + "regexMatchPCRE": result.message }); } } - return result['result']; - }, jQuery.format('The value does not match the expected format.')); + return result.result; + }; + + // Regular expression support using XRegExp + var xregexPCREfn = function(value, element, param) { + if (window.XRegExp && XRegExp.version ) { + try { + var result = true; + for (var i = 0; i < param.expressions.length; i++) { + var reg = param.expressions[i]; + var delim = reg.lastIndexOf(reg[0]); + // Only allow supported modifiers + var modraw = reg.substr(delim + 1) || ''; + var mod = ''; + if (mod !== '') { + for (var l = 0; l < 6; l++) { + if (modraw.indexOf('gimnsx'[l]) !== -1) { + mod += 'gimnsx'[l]; + } + } + } + reg = reg.substring(1, delim); + if (!(new XRegExp(reg, mod).test(value))) { + result = false; + if (param.messages[i].length) { + jQuery.extend(jQuery.validator.messages, { + "regexMatchPCRE": param.messages[i] + }); + } + } + } + return result; + } + catch (e) { + return ajaxPCREfn(value, element, param); + } + } + else { + return ajaxPCREfn(value, element, param); + } + }; + // Decide which one to use + if (self.data.general.usexregxp) { + jQuery.validator.addMethod("regexMatchPCRE", xregexPCREfn, jQuery.format('The value does not match the expected format.')); + } + else { + jQuery.validator.addMethod("regexMatchPCRE", ajaxPCREfn, jQuery.format('The value does not match the expected format.')); + } // Unique values jQuery.validator.addMethod("notEqualTo", function(value, element, param) { diff --git a/clientside_validation.module b/clientside_validation.module index adab367..d8e2f9a 100644 --- a/clientside_validation.module +++ b/clientside_validation.module @@ -301,6 +301,7 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) { $form_settings_added[] = str_replace('-', '_', $form_id); } + if (!$general_settings_added) { $settings['clientsideValidation']['general'] = array( "errorClass" => "error", @@ -314,10 +315,36 @@ function _clientside_validation_add_general_settings(&$settings, $form_id) { "validateOnSubmit" => variable_get('clientside_validation_validate_onsubmit', 1), "errorElement" => variable_get('clientside_validation_error_element', 'label'), ); + // add xregxp if choosen and found. + if (variable_get('clientside_validation_usexregxp', 0) != 0 && module_exists('xregexp_api')) { + $settings['clientsideValidation']['general']['usexregxp'] = clientside_validation_add_xregexp(); + } + else { + $settings['clientsideValidation']['general']['usexregxp'] = 0; + } + $general_settings_added = TRUE; } + +} + +/* + * adds xregexp and optional unicode js lib + */ +function clientside_validation_add_xregexp() { + $variant = variable_get('clientside_validation_xregxp_variant', ''); + $lib = FALSE; + if (empty($variant)) { + $lib = xregexp_api_libraries_load('xregexp'); + } + else { + $lib = xregexp_api_libraries_load('xregexp', $variant); + } + return ($lib && (!isset($lib['error']) || !$lib['error'])) ? 1 : 0; } + + /** * Set validation rule for required fields. */