Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Validate
- {
- private $_passed = false,
- $_errors = array(),
- $_db = null;
- public function __construct(){
- $this->_db = DB::getInstance();
- }
- public function check($source, $items = array()) {
- foreach ($items as $item => $rules) {
- $item = sanitize($item);
- $display = $rules['display'];
- foreach ($rules as $rule => $rule_value) {
- $value = trim($source[$item]);
- $value = sanitize($value);
- if ($rule === 'required' && empty($value)) {
- $this->addError(["{$display} is required",$item]);
- }
- elseif ($rule === 'required_if' && empty($value) && $source[$rule_value[0]] == $rule_value[1]) {
- $this->addError(["{$display} is required",$item]);
- }
- elseif(!empty($value)){
- switch ($rule) {
- case 'min':
- if (strlen($value) < $rule_value) {
- $this->addError(["{$display} must be a minimum of {$rule_value} characters.", $item]);
- }
- break;
- case 'max':
- if (strlen($value) > $rule_value) {
- $this->addError(["{$display} must be a maximum of {$rule_value} characters.", $item]);
- }
- break;
- case 'matches':
- if ($value != $source[$rule_value]) {
- $match = $items[$rule_value]['display'];
- $this->addError(["{$match} and {$display} must match.", $item]);
- }
- break;
- case 'unique':
- $check = $this->_db->get($rule_value, array($item, '=', $value));
- if ($check->count()) {
- $this->addError(["{$display} already exists. Please choose another {$display}.", $item]);
- }
- break;
- case 'unique_image':
- $check = file_exists($_SERVER['DOCUMENT_ROOT'] . $rule_value);
- if ($check === true) {
- $this->addError(["{$display} already exists. The image name is based on the title without punctuation. Please choose another title.", $item]);
- }
- break;
- case 'unique_update':
- $t = explode(',', $rule_value);
- $table = $t[0];
- $id = $t[1];
- $query = "SELECT * FROM {$table} WHERE id != {$id} AND {$item} = '{$value}'";
- $check = $this->_db->query($query);
- if ($check->count()) {
- $this->addError(["{$display} already exists. Please choose another {$display}.", $item]);
- }
- break;
- case 'is_numeric':
- if (!is_numeric($value)) {
- $this->addError(["{$display} has to be a number. Please use a numeric value.", $item]);
- }
- break;
- case 'valid_email':
- if(!filter_var($value,FILTER_VALIDATE_EMAIL)) {
- $this->addError(["{$display} must be a valid email address.", $item]);
- }
- break;
- case 'valid_date':
- $d = DateTime::createFromFormat('Y-m-d', $value);
- if(!($d && $d->format('Y-m-d') == $value)) {
- $this->addError(["{$display} must be a date with a format of YYYY-MM-DD.", $item]);
- }
- break;
- case 'valid_month':
- $d = DateTime::createFromFormat('F Y', $value);
- if(!($d && $d->format('F Y') == $value)) {
- $this->addError(["{$display} must be a date with a format of 'Month Year' ('F Y').", $item]);
- }
- break;
- case 'valid_time':
- $DateTime = \DateTime::createFromFormat('d/m/Y '.$rule_value, '10/10/2010 '.$value);
- if ($DateTime && $DateTime->format('d/m/Y '.$rule_value) == '10/10/2010 '.$value) $valid = true;
- else $valid = false;
- if($valid != true) {
- $this->addError(["{$display} must be a time with a format of HH:MM:SS.", $item]);
- }
- break;
- case 'valid_datetime': // UNTESTED
- $d = DateTime::createFromFormat('Y-m-d H:i:s', $value);
- if(!($d && $d->format('Y-m-d h:m:s') == $value)) {
- $this->addError(["{$display} must be a datetime with a format of YYYY-MM-DD HH:MM:SS.", $item]);
- }
- break;
- case 'valid_futuredate':
- $today = date("Y-m-d H:i:s");
- $checkDate = date('Y-m-d H:i:s', strtotime($value));
- if(!($today && $checkDate && $checkDate > $today)) {
- $this->addError(["{$display} must be a date in the future.", $item]);
- }
- break;
- case 'valid_image':
- $size = getimagesize($value);
- if(!(is_array($size) === true)) {
- $this->addError(["{$display} is not a valid image. Acceptable types are .gif, .jpg/.jpeg, and .png", $item]);
- }
- break;
- case 'image_width':
- $size = getimagesize($value);
- if(is_array($size) === true && $rule_value > $size[0]) {
- $this->addError(["{$display} is too small. Choose an image with a larger width than {$rule_value} pixels.", $item]);
- }
- break;
- case 'image_height':
- $size = getimagesize($value);
- if(is_array($size) === true && $rule_value > $size[1]) {
- $this->addError(["{$display} is too small. Choose an image with a larger height than {$rule_value} pixels.", $item]);
- }
- break;
- case 'valid_tracking':
- $package = Argo\Package::instance($value);
- $checkable = array('usps', 'ups', 'fedex', 'dhl');
- if (in_array(strtolower($rule_value), $checkable)) {
- if(!isset($package->carrier->name)) {
- $this->addError(["{$display} is not a valid tracking number.", $item]);
- }
- elseif ($package->carrier->name != $rule_value) {
- $this->addError(["{$display} is a tracking number for {$package->carrier->name}, but you selected {$rule_value}.", $item]);
- }
- }
- break;
- case 'in_array':
- if (!in_array($value, array_flip($rule_value))) {
- $allowed = '<ul>';
- foreach ($rule_value as $rule => $ruleDescription) {
- $allowed .= "<li>{$ruleDescription}</li>";
- }
- $allowed .= '</ul>';
- $this->addError(["{$display} must be any of these values: {$allowed}", $item]);
- }
- break;
- case 'zxcvbn':
- $zxcvbn = new Zxcvbn\Zxcvbn();
- $strength = $zxcvbn->passwordStrength($value);
- if ($strength['score'] < 3) {
- $this->addError(["{$display} must rate \"Good\" or better to be accepted.", $item]);
- }
- break;
- }
- }
- }
- }
- if (empty($this->_errors)) {
- $this->_passed = true;
- }
- return $this;
- }
- public function addError($error) {
- $this->_errors[] = $error;
- $this->_passed = false;
- }
- public function display_errors() {
- if (!empty($this->_errors)) {
- $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">×</span></button>';
- $html .= '<ul>';
- foreach($this->_errors as $error){
- if(is_array($error)){
- $html .= "<li>{$error[0]}</li>";
- }
- else {
- $html .= "<li>{$error}</li>";
- }
- }
- $html .= '</ul>';
- $html .= '</div>';
- return $html;
- }
- else return '';
- }
- public function errors() {
- return $this->_errors;
- }
- public function passed() {
- return $this->_passed;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement