Advertisement
Guest User

Untitled

a guest
Jul 10th, 2017
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.13 KB | None | 0 0
  1. <?php
  2.  
  3. class Validate
  4. {
  5. private $_passed = false,
  6. $_errors = array(),
  7. $_db = null;
  8.  
  9. public function __construct(){
  10. $this->_db = DB::getInstance();
  11. }
  12.  
  13. public function check($source, $items = array()) {
  14. foreach ($items as $item => $rules) {
  15. $item = sanitize($item);
  16. $display = $rules['display'];
  17. foreach ($rules as $rule => $rule_value) {
  18. $value = trim($source[$item]);
  19. $value = sanitize($value);
  20.  
  21. if ($rule === 'required' && empty($value)) {
  22. $this->addError(["{$display} is required",$item]);
  23. }
  24. elseif ($rule === 'required_if' && empty($value) && $source[$rule_value[0]] == $rule_value[1]) {
  25. $this->addError(["{$display} is required",$item]);
  26. }
  27. elseif(!empty($value)){
  28. switch ($rule) {
  29. case 'min':
  30. if (strlen($value) < $rule_value) {
  31. $this->addError(["{$display} must be a minimum of {$rule_value} characters.", $item]);
  32. }
  33. break;
  34.  
  35. case 'max':
  36. if (strlen($value) > $rule_value) {
  37. $this->addError(["{$display} must be a maximum of {$rule_value} characters.", $item]);
  38. }
  39. break;
  40.  
  41. case 'matches':
  42. if ($value != $source[$rule_value]) {
  43. $match = $items[$rule_value]['display'];
  44. $this->addError(["{$match} and {$display} must match.", $item]);
  45. }
  46. break;
  47.  
  48. case 'unique':
  49. $check = $this->_db->get($rule_value, array($item, '=', $value));
  50. if ($check->count()) {
  51. $this->addError(["{$display} already exists. Please choose another {$display}.", $item]);
  52. }
  53. break;
  54.  
  55. case 'unique_image':
  56. $check = file_exists($_SERVER['DOCUMENT_ROOT'] . $rule_value);
  57. if ($check === true) {
  58. $this->addError(["{$display} already exists. The image name is based on the title without punctuation. Please choose another title.", $item]);
  59. }
  60. break;
  61.  
  62. case 'unique_update':
  63. $t = explode(',', $rule_value);
  64. $table = $t[0];
  65. $id = $t[1];
  66. $query = "SELECT * FROM {$table} WHERE id != {$id} AND {$item} = '{$value}'";
  67. $check = $this->_db->query($query);
  68. if ($check->count()) {
  69. $this->addError(["{$display} already exists. Please choose another {$display}.", $item]);
  70. }
  71. break;
  72.  
  73. case 'is_numeric':
  74. if (!is_numeric($value)) {
  75. $this->addError(["{$display} has to be a number. Please use a numeric value.", $item]);
  76. }
  77. break;
  78.  
  79. case 'valid_email':
  80. if(!filter_var($value,FILTER_VALIDATE_EMAIL)) {
  81. $this->addError(["{$display} must be a valid email address.", $item]);
  82. }
  83. break;
  84.  
  85. case 'valid_date':
  86. $d = DateTime::createFromFormat('Y-m-d', $value);
  87. if(!($d && $d->format('Y-m-d') == $value)) {
  88. $this->addError(["{$display} must be a date with a format of YYYY-MM-DD.", $item]);
  89. }
  90. break;
  91.  
  92. case 'valid_month':
  93. $d = DateTime::createFromFormat('F Y', $value);
  94. if(!($d && $d->format('F Y') == $value)) {
  95. $this->addError(["{$display} must be a date with a format of 'Month Year' ('F Y').", $item]);
  96. }
  97. break;
  98.  
  99. case 'valid_time':
  100. $DateTime = \DateTime::createFromFormat('d/m/Y '.$rule_value, '10/10/2010 '.$value);
  101. if ($DateTime && $DateTime->format('d/m/Y '.$rule_value) == '10/10/2010 '.$value) $valid = true;
  102. else $valid = false;
  103. if($valid != true) {
  104. $this->addError(["{$display} must be a time with a format of HH:MM:SS.", $item]);
  105. }
  106. break;
  107.  
  108. case 'valid_datetime': // UNTESTED
  109. $d = DateTime::createFromFormat('Y-m-d H:i:s', $value);
  110. if(!($d && $d->format('Y-m-d h:m:s') == $value)) {
  111. $this->addError(["{$display} must be a datetime with a format of YYYY-MM-DD HH:MM:SS.", $item]);
  112. }
  113. break;
  114.  
  115. case 'valid_futuredate':
  116. $today = date("Y-m-d H:i:s");
  117. $checkDate = date('Y-m-d H:i:s', strtotime($value));
  118. if(!($today && $checkDate && $checkDate > $today)) {
  119. $this->addError(["{$display} must be a date in the future.", $item]);
  120. }
  121. break;
  122.  
  123. case 'valid_image':
  124. $size = getimagesize($value);
  125. if(!(is_array($size) === true)) {
  126. $this->addError(["{$display} is not a valid image. Acceptable types are .gif, .jpg/.jpeg, and .png", $item]);
  127. }
  128. break;
  129.  
  130. case 'image_width':
  131. $size = getimagesize($value);
  132. if(is_array($size) === true && $rule_value > $size[0]) {
  133. $this->addError(["{$display} is too small. Choose an image with a larger width than {$rule_value} pixels.", $item]);
  134. }
  135. break;
  136.  
  137. case 'image_height':
  138. $size = getimagesize($value);
  139. if(is_array($size) === true && $rule_value > $size[1]) {
  140. $this->addError(["{$display} is too small. Choose an image with a larger height than {$rule_value} pixels.", $item]);
  141. }
  142. break;
  143.  
  144. case 'valid_tracking':
  145. $package = Argo\Package::instance($value);
  146. $checkable = array('usps', 'ups', 'fedex', 'dhl');
  147. if (in_array(strtolower($rule_value), $checkable)) {
  148. if(!isset($package->carrier->name)) {
  149. $this->addError(["{$display} is not a valid tracking number.", $item]);
  150. }
  151. elseif ($package->carrier->name != $rule_value) {
  152. $this->addError(["{$display} is a tracking number for {$package->carrier->name}, but you selected {$rule_value}.", $item]);
  153. }
  154. }
  155. break;
  156.  
  157. case 'in_array':
  158. if (!in_array($value, array_flip($rule_value))) {
  159. $allowed = '<ul>';
  160. foreach ($rule_value as $rule => $ruleDescription) {
  161. $allowed .= "<li>{$ruleDescription}</li>";
  162. }
  163. $allowed .= '</ul>';
  164. $this->addError(["{$display} must be any of these values: {$allowed}", $item]);
  165. }
  166. break;
  167.  
  168. case 'zxcvbn':
  169. $zxcvbn = new Zxcvbn\Zxcvbn();
  170. $strength = $zxcvbn->passwordStrength($value);
  171. if ($strength['score'] < 3) {
  172. $this->addError(["{$display} must rate \"Good\" or better to be accepted.", $item]);
  173. }
  174. break;
  175. }
  176. }
  177. }
  178. }
  179.  
  180. if (empty($this->_errors)) {
  181. $this->_passed = true;
  182. }
  183. return $this;
  184. }
  185.  
  186. public function addError($error) {
  187. $this->_errors[] = $error;
  188. $this->_passed = false;
  189. }
  190.  
  191. public function display_errors() {
  192. if (!empty($this->_errors)) {
  193. $html = '<div class="alert alert-danger alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
  194. $html .= '<ul>';
  195. foreach($this->_errors as $error){
  196. if(is_array($error)){
  197. $html .= "<li>{$error[0]}</li>";
  198. }
  199. else {
  200. $html .= "<li>{$error}</li>";
  201. }
  202. }
  203. $html .= '</ul>';
  204. $html .= '</div>';
  205. return $html;
  206. }
  207. else return '';
  208. }
  209.  
  210. public function errors() {
  211. return $this->_errors;
  212. }
  213.  
  214. public function passed() {
  215. return $this->_passed;
  216. }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement