available = $this->get_all_validators(); } public function setInput($input) { $this->input = $input; return true; } public function getInput() { if (isset($this->input)) { return $this->input; } else { return false; } } public function validateInput($validator, $parameter = '', $message = '') { include_once('lib/validators/validator_' . $validator . '.php'); if (! function_exists("validator_$validator") || ! isset($this->input)) { return false; } $func_name = "validator_$validator"; $result = $func_name($this->input, $parameter, $message); return $result; } private function get_all_validators() { $validators = []; foreach (glob('lib/validators/validator_*.php') as $file) { $base = basename($file); $validator = substr($base, 10, -4); $validators[] = $validator; } return $validators; } public function generateTrackerValidateJS($fields_data, $prefix = 'ins_', $custom_rules = '', $custom_messages = '', $custom_handlers = '') { global $prefs; $validationjs = 'rules: { '; foreach ($fields_data as $field_value) { if ($field_value['type'] == 'b') { $validationjs .= $prefix . $field_value['fieldId'] . '_currency: {required: function(element){ return $("#' . $prefix . $field_value['fieldId'] . '").val()!=""; },},'; } if ($field_value['validation'] || $field_value['isMandatory'] == 'y') { if ($field_value['type'] == 'e' || $field_value['type'] == 'M') { $validationjs .= '"' . $prefix . $field_value['fieldId'] . '[]": { '; } else { if ($field_value['isMultilingual'] == 'y') { $validationjs .= "\"ins_" . $field_value['fieldId'] . "[" . end($prefs["available_languages"]) . "]\"" . " : { "; } else { $validationjs .= $prefix . $field_value['fieldId'] . ': { '; } } if ($field_value['isMandatory'] == 'y') { if ($field_value['type'] == 'D') { $validationjs .= 'required_in_group: [1, ".group_' . $prefix . $field_value['fieldId'] . '", "other"], '; } elseif ($field_value['type'] == 'A') { $validationjs .= 'required_tracker_file: [1, ".file_' . $prefix . $field_value['fieldId'] . '"], '; } elseif ($field_value['type'] == 'f') { // old style date picker - jq validator rules have to apply to an element name or id // so we have to add a required_in_group for each of the date selects in turn $validationjs .= 'required: false },'; // dummy for the "group" $date_ins_num = $field_value['options_array'][0] === 'dt' ? 5 : 3; $validationjs .= $prefix . $field_value['fieldId'] . 'Month: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' . $prefix . $field_value['fieldId'] . 'Day: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' . $prefix . $field_value['fieldId'] . 'Year: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"], '; if ($field_value['options_array'][0] === 'dt') { $validationjs = rtrim($validationjs, ', '); $validationjs .= '},'; $validationjs .= $prefix . $field_value['fieldId'] . 'Hour: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' . $prefix . $field_value['fieldId'] . 'Minute: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"], '; } } else { if ($field_value['isMultilingual'] == 'y') { $required_script = "required: function(e) { "; $condition = ""; foreach ($prefs["available_languages"] as $index => $lang) { if ($index == 0) { $condition .= "\"\" == $(\"[name=" . "'ins_" . $field_value['fieldId'] . "[" . $lang . "]'" . "]\").val()"; } else { $condition .= " && \"\" == $(\"[name=" . "'ins_" . $field_value['fieldId'] . "[" . $lang . "]'" . "]\").val()"; } } $required_script .= "return " . $condition . " }"; $validationjs .= $required_script; } else { $validationjs .= 'required: true, '; } } } if ($field_value['validation']) { $validationjs .= 'remote: { '; $validationjs .= 'url: "validate-ajax.php", '; $validationjs .= 'type: "post", '; $validationjs .= 'data: { '; $validationjs .= 'validator: "' . $field_value['validation'] . '", '; global $jitRequest; if ($jitRequest->itemId->int()) { $current_id = $jitRequest->itemId->int(); } else { $current_id = 0; } if ($field_value['validation'] == 'distinct' && empty($field_value['validationParam'])) { $validationjs .= 'parameter: "trackerId=' . $field_value['trackerId'] . '&fieldId=' . $field_value['fieldId'] . '&itemId=' . $current_id . '", '; } elseif ($field_value['validation'] == 'remotelock') { $validationjs .= 'parameter: "trackerId=' . $field_value['trackerId'] . '&itemId=' . $current_id . '", '; } else { $validationjs .= 'parameter: "' . addslashes($field_value['validationParam']) . '", '; } $validationjs .= 'message: "' . tra($field_value['validationMessage']) . '", '; $validationjs .= 'input: function() { '; if ($prefix == 'ins_' && $field_value['type'] == 'a') { $validationjs .= 'return $("textarea[name=\'' . $prefix . $field_value['fieldId'] . '\']").val(); '; } elseif ($prefix == 'ins_' && $field_value['type'] == 'k') { $validationjs .= 'return $("#page_selector_' . $field_value['fieldId'] . '").val(); '; } elseif ($prefix == 'ins_' && $field_value['type'] == 'u') { $validationjs .= 'return $("#user_selector_' . $field_value['fieldId'] . '").val(); '; } else { if ($field_value['type'] == 'g' or $field_value['type'] == 'e' or $field_value['type'] == 'y' or $field_value['type'] == 'd' or $field_value['type'] == 'D') { // Let's handle drop-down style fields $validationjs .= 'return $(\'select[name="' . $prefix . $field_value['fieldId'] . '"] option:selected\').text(); '; } else { // Let's handle text style fields $validationjs .= 'return $("#' . $prefix . $field_value['fieldId'] . '").val(); '; } } $validationjs .= '} } } '; } else { // remove last comma (not supported in IE7) $validationjs = rtrim($validationjs, ' ,'); } $validationjs .= '}, '; } } $validationjs .= $custom_rules; // remove last comma (not supported in IE7) $validationjs = rtrim($validationjs, ' ,'); $validationjs .= '}, '; $validationjs .= 'messages: { '; foreach ($fields_data as $field_value) { if ($field_value['type'] == 'b') { if ($field_value['validationMessage']) { $validationjs .= $prefix . $field_value['fieldId'] . '_currency: "' . tra($field_value['validationMessage']) . '",'; } else { $validationjs .= $prefix . $field_value['fieldId'] . '_currency: "' . tra('This field is required') . '",'; } } if ($field_value['validationMessage'] && $field_value['isMandatory'] == 'y') { if ($field_value['type'] == 'e' || $field_value['type'] == 'M') { $validationjs .= '"' . $prefix . $field_value['fieldId'] . '[]": { '; } else { $validationjs .= $prefix . $field_value['fieldId'] . ': { '; } $validationjs .= 'required: "' . tra($field_value['validationMessage']) . '" '; $validationjs .= '}, '; } elseif ($field_value['isMandatory'] == 'y') { if ($field_value['isMultilingual'] == 'y') { $validationjs .= "\"ins_" . $field_value['fieldId'] . "[" . end($prefs["available_languages"]) . "]\"" . " : { "; $validationjs .= 'required: "' . tra('The mandatory field ' . $field_value['name'] . ' must contain at least one language value') . '" '; } else { $validationjs .= $prefix . $field_value['fieldId'] . ': { '; $validationjs .= 'required: "' . tra('This field is required') . '" '; } $validationjs .= '}, '; } } $validationjs .= $custom_messages; // remove last comma (not supported in IE7) $validationjs = rtrim($validationjs, ' ,'); $validationjs .= '}, '; // Add an invalidHandler to scroll the first error into view // works in both modal and full page modes and leaves the focus on the error input $validationjs .= ' focusInvalid: false, invalidHandler: function(event, validator) { var errors = validator.numberOfInvalids(); if (errors) { var $container = $scroller = $(this).parents(".modal"), offset = 0; if (!$container.length) { $container = $("html"); $scroller = $("body"); offset = $(".fixed-top").outerHeight() || 0; } var containerScrollTop = $scroller.scrollTop(), $firstError = $(validator.errorList[0].element), $scrollElement = $firstError.parents(".form-group"); if (! $scrollElement.length) { $scrollElement = $firstError; } if ($firstError.parents(".tab-content").length > 0) { $tab = $firstError.parents(".tab-pane"); $(\'a[href="#\' + $tab.attr("id") + \'"]\').tab("show"); } $container.animate({ scrollTop: containerScrollTop + $scrollElement.offset().top - offset - ($(window).height() / 2) }, 1000, function () { if ($firstError.is("select") && jqueryTiki.select2) { $firstError.select2("focus"); } else { $firstError.focus(); } }); } } '; if ($custom_handlers) { $validationjs .= ",\n$custom_handlers"; } return $validationjs; } }