PageRenderTime 25ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/validatorslib.php

https://gitlab.com/ElvisAns/tiki
PHP | 213 lines | 193 code | 8 blank | 12 comment | 63 complexity | 62ba930bce3e74e1414858c6dee85191 MD5 | raw file
  1. <?php
  2. // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
  3. //
  4. // All Rights Reserved. See copyright.txt for details and a complete list of authors.
  5. // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
  6. // $Id$
  7. class Validators
  8. {
  9. private $input;
  10. public function __construct()
  11. {
  12. global $prefs;
  13. $this->available = $this->get_all_validators();
  14. }
  15. public function setInput($input)
  16. {
  17. $this->input = $input;
  18. return true;
  19. }
  20. public function getInput()
  21. {
  22. if (isset($this->input)) {
  23. return $this->input;
  24. } else {
  25. return false;
  26. }
  27. }
  28. public function validateInput($validator, $parameter = '', $message = '')
  29. {
  30. include_once('lib/validators/validator_' . $validator . '.php');
  31. if (! function_exists("validator_$validator") || ! isset($this->input)) {
  32. return false;
  33. }
  34. $func_name = "validator_$validator";
  35. $result = $func_name($this->input, $parameter, $message);
  36. return $result;
  37. }
  38. private function get_all_validators()
  39. {
  40. $validators = [];
  41. foreach (glob('lib/validators/validator_*.php') as $file) {
  42. $base = basename($file);
  43. $validator = substr($base, 10, -4);
  44. $validators[] = $validator;
  45. }
  46. return $validators;
  47. }
  48. public function generateTrackerValidateJS($fields_data, $prefix = 'ins_', $custom_rules = '', $custom_messages = '', $custom_handlers = '')
  49. {
  50. $validationjs = 'rules: { ';
  51. foreach ($fields_data as $field_value) {
  52. if ($field_value['type'] == 'b') {
  53. $validationjs .= $prefix . $field_value['fieldId'] . '_currency: {required:
  54. function(element){
  55. return $("#' . $prefix . $field_value['fieldId'] . '").val()!="";
  56. },},';
  57. }
  58. if ($field_value['validation'] || $field_value['isMandatory'] == 'y') {
  59. if ($field_value['type'] == 'e' || $field_value['type'] == 'M') {
  60. $validationjs .= '"' . $prefix . $field_value['fieldId'] . '[]": { ';
  61. } else {
  62. $validationjs .= $prefix . $field_value['fieldId'] . ': { ';
  63. }
  64. if ($field_value['isMandatory'] == 'y') {
  65. if ($field_value['type'] == 'D') {
  66. $validationjs .= 'required_in_group: [1, ".group_' . $prefix . $field_value['fieldId'] . '", "other"], ';
  67. } elseif ($field_value['type'] == 'A') {
  68. $validationjs .= 'required_tracker_file: [1, ".file_' . $prefix . $field_value['fieldId'] . '"], ';
  69. } elseif ($field_value['type'] == 'f') { // old style date picker - jq validator rules have to apply to an element name or id
  70. // so we have to add a required_in_group for each of the date selects in turn
  71. $validationjs .= 'required: false },'; // dummy for the "group"
  72. $date_ins_num = $field_value['options_array'][0] === 'dt' ? 5 : 3;
  73. $validationjs .= $prefix . $field_value['fieldId'] . 'Month: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' .
  74. $prefix . $field_value['fieldId'] . 'Day: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' .
  75. $prefix . $field_value['fieldId'] . 'Year: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"], ';
  76. if ($field_value['options_array'][0] === 'dt') {
  77. $validationjs = rtrim($validationjs, ', ');
  78. $validationjs .= '},';
  79. $validationjs .= $prefix . $field_value['fieldId'] . 'Hour: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"]}, ' .
  80. $prefix . $field_value['fieldId'] . 'Minute: {required_in_group: [' . $date_ins_num . ', "select[name^=' . $prefix . $field_value['fieldId'] . ']"], ';
  81. }
  82. } else {
  83. $validationjs .= 'required: true, ';
  84. }
  85. }
  86. if ($field_value['validation']) {
  87. $validationjs .= 'remote: { ';
  88. $validationjs .= 'url: "validate-ajax.php", ';
  89. $validationjs .= 'type: "post", ';
  90. $validationjs .= 'data: { ';
  91. $validationjs .= 'validator: "' . $field_value['validation'] . '", ';
  92. global $jitRequest;
  93. if ($jitRequest->itemId->int()) {
  94. $current_id = $jitRequest->itemId->int();
  95. } else {
  96. $current_id = 0;
  97. }
  98. if ($field_value['validation'] == 'distinct' && empty($field_value['validationParam'])) {
  99. $validationjs .= 'parameter: "trackerId=' . $field_value['trackerId'] . '&fieldId=' . $field_value['fieldId'] . '&itemId=' . $current_id . '", ';
  100. } elseif ($field_value['validation'] == 'remotelock') {
  101. $validationjs .= 'parameter: "trackerId=' . $field_value['trackerId'] . '&itemId=' . $current_id . '", ';
  102. } else {
  103. $validationjs .= 'parameter: "' . addslashes($field_value['validationParam']) . '", ';
  104. }
  105. $validationjs .= 'message: "' . tra($field_value['validationMessage']) . '", ';
  106. $validationjs .= 'input: function() { ';
  107. if ($prefix == 'ins_' && $field_value['type'] == 'a') {
  108. $validationjs .= 'return $("textarea[name=\'' . $prefix . $field_value['fieldId'] . '\']").val(); ';
  109. } elseif ($prefix == 'ins_' && $field_value['type'] == 'k') {
  110. $validationjs .= 'return $("#page_selector_' . $field_value['fieldId'] . '").val(); ';
  111. } elseif ($prefix == 'ins_' && $field_value['type'] == 'u') {
  112. $validationjs .= 'return $("#user_selector_' . $field_value['fieldId'] . '").val(); ';
  113. } else {
  114. 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') {
  115. // Let's handle drop-down style fields
  116. $validationjs .= 'return $(\'select[name="' . $prefix . $field_value['fieldId'] . '"] option:selected\').text(); ';
  117. } else { // Let's handle text style fields
  118. $validationjs .= 'return $("#' . $prefix . $field_value['fieldId'] . '").val(); ';
  119. }
  120. }
  121. $validationjs .= '} } } ';
  122. } else {
  123. // remove last comma (not supported in IE7)
  124. $validationjs = rtrim($validationjs, ' ,');
  125. }
  126. $validationjs .= '}, ';
  127. }
  128. }
  129. $validationjs .= $custom_rules;
  130. // remove last comma (not supported in IE7)
  131. $validationjs = rtrim($validationjs, ' ,');
  132. $validationjs .= '}, ';
  133. $validationjs .= 'messages: { ';
  134. foreach ($fields_data as $field_value) {
  135. if ($field_value['type'] == 'b') {
  136. if ($field_value['validationMessage']) {
  137. $validationjs .= $prefix . $field_value['fieldId'] . '_currency: "' . tra($field_value['validationMessage']) . '",';
  138. } else {
  139. $validationjs .= $prefix . $field_value['fieldId'] . '_currency: "' . tra('This field is required') . '",';
  140. }
  141. }
  142. if ($field_value['validationMessage'] && $field_value['isMandatory'] == 'y') {
  143. if ($field_value['type'] == 'e' || $field_value['type'] == 'M') {
  144. $validationjs .= '"' . $prefix . $field_value['fieldId'] . '[]": { ';
  145. } else {
  146. $validationjs .= $prefix . $field_value['fieldId'] . ': { ';
  147. }
  148. $validationjs .= 'required: "' . tra($field_value['validationMessage']) . '" ';
  149. $validationjs .= '}, ';
  150. } elseif ($field_value['isMandatory'] == 'y') {
  151. $validationjs .= $prefix . $field_value['fieldId'] . ': { ';
  152. $validationjs .= 'required: "' . tra('This field is required') . '" ';
  153. $validationjs .= '}, ';
  154. }
  155. }
  156. $validationjs .= $custom_messages;
  157. // remove last comma (not supported in IE7)
  158. $validationjs = rtrim($validationjs, ' ,');
  159. $validationjs .= '}, ';
  160. // Add an invalidHandler to scroll the first error into view
  161. // works in both modal and full page modes and leaves the focus on the error input
  162. $validationjs .= '
  163. focusInvalid: false,
  164. invalidHandler: function(event, validator) {
  165. var errors = validator.numberOfInvalids();
  166. if (errors) {
  167. var $container = $scroller = $(this).parents(".modal"),
  168. offset = 0;
  169. if (!$container.length) {
  170. $container = $("html");
  171. $scroller = $("body");
  172. offset = $(".fixed-top").outerHeight() || 0;
  173. }
  174. var containerScrollTop = $scroller.scrollTop(),
  175. $firstError = $(validator.errorList[0].element),
  176. $scrollElement = $firstError.parents(".form-group");
  177. if (! $scrollElement.length) {
  178. $scrollElement = $firstError;
  179. }
  180. if ($firstError.parents(".tab-content").length > 0) {
  181. $tab = $firstError.parents(".tab-pane");
  182. $(\'a[href="#\' + $tab.attr("id") + \'"]\').tab("show");
  183. }
  184. $container.animate({
  185. scrollTop: containerScrollTop + $scrollElement.offset().top - offset - ($(window).height() / 2)
  186. }, 1000, function () {
  187. if ($firstError.is("select") && jqueryTiki.select2) {
  188. $firstError.select2("focus");
  189. } else {
  190. $firstError.focus();
  191. }
  192. });
  193. }
  194. }
  195. ';
  196. if ($custom_handlers) {
  197. $validationjs .= ",\n$custom_handlers";
  198. }
  199. return $validationjs;
  200. }
  201. }