1*de02284cSSzymon Olewniczak<?php 2*de02284cSSzymon Olewniczak 3*de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl; 4*de02284cSSzymon Olewniczak 5*de02284cSSzymon Olewniczakuse dokuwiki\plugin\bez\meta\ValidationException; 6*de02284cSSzymon Olewniczak 7*de02284cSSzymon Olewniczakclass Validator { 8*de02284cSSzymon Olewniczak private $rules=array(), $errors, $model; 9*de02284cSSzymon Olewniczak public function __construct($model) { 10*de02284cSSzymon Olewniczak $this->model = $model; 11*de02284cSSzymon Olewniczak } 12*de02284cSSzymon Olewniczak 13*de02284cSSzymon Olewniczak public function add_rule($field, $rule) { 14*de02284cSSzymon Olewniczak $this->rules[$field] = $rule; 15*de02284cSSzymon Olewniczak } 16*de02284cSSzymon Olewniczak 17*de02284cSSzymon Olewniczak public function set_rules($rules) { 18*de02284cSSzymon Olewniczak $this->rules = array_merge($this->rules, $rules); 19*de02284cSSzymon Olewniczak } 20*de02284cSSzymon Olewniczak 21*de02284cSSzymon Olewniczak public function get_rules() { 22*de02284cSSzymon Olewniczak return $this->rules; 23*de02284cSSzymon Olewniczak } 24*de02284cSSzymon Olewniczak 25*de02284cSSzymon Olewniczak public function get_errors() { 26*de02284cSSzymon Olewniczak return $this->errors; 27*de02284cSSzymon Olewniczak } 28*de02284cSSzymon Olewniczak 29*de02284cSSzymon Olewniczak public function set_error($field, $code) { 30*de02284cSSzymon Olewniczak $this->errors[$field] = $code; 31*de02284cSSzymon Olewniczak } 32*de02284cSSzymon Olewniczak 33*de02284cSSzymon Olewniczak protected function check_against_val_method($value, $method, $args) { 34*de02284cSSzymon Olewniczak $validator = 'validate_'.$method; 35*de02284cSSzymon Olewniczak if (!method_exists($this, $validator)) { 36*de02284cSSzymon Olewniczak throw new \Exception("there is no validation function $validator"); 37*de02284cSSzymon Olewniczak } 38*de02284cSSzymon Olewniczak 39*de02284cSSzymon Olewniczak array_unshift($args, $value); 40*de02284cSSzymon Olewniczak $result = call_user_func_array(array($this, $validator), $args); 41*de02284cSSzymon Olewniczak return array($result, $method); 42*de02284cSSzymon Olewniczak } 43*de02284cSSzymon Olewniczak 44*de02284cSSzymon Olewniczak protected function validate_one($value, $method, $args, $null) { 45*de02284cSSzymon Olewniczak if ($null === 'NOT NULL' && $value == '') { 46*de02284cSSzymon Olewniczak return array(false, 'is_null'); 47*de02284cSSzymon Olewniczak } else if ($null === 'NULL' && $value == '') { 48*de02284cSSzymon Olewniczak return array(true, 'is_null'); 49*de02284cSSzymon Olewniczak } 50*de02284cSSzymon Olewniczak 51*de02284cSSzymon Olewniczak return $this->check_against_val_method($value, $method, $args); 52*de02284cSSzymon Olewniczak } 53*de02284cSSzymon Olewniczak 54*de02284cSSzymon Olewniczak public function validate_field($field, $value) { 55*de02284cSSzymon Olewniczak if (!isset($this->rules[$field])) { 56*de02284cSSzymon Olewniczak throw new \Exception('no validation rule for '.$field); 57*de02284cSSzymon Olewniczak } 58*de02284cSSzymon Olewniczak 59*de02284cSSzymon Olewniczak $args = $this->rules[$field][0]; 60*de02284cSSzymon Olewniczak $null = $this->rules[$field][1]; 61*de02284cSSzymon Olewniczak 62*de02284cSSzymon Olewniczak $method = array_shift($args); 63*de02284cSSzymon Olewniczak list($result, $code) = $this->validate_one($value, $method, $args, $null); 64*de02284cSSzymon Olewniczak if ($result === false) { 65*de02284cSSzymon Olewniczak throw new ValidationException('-unknown', array($field => $code)); 66*de02284cSSzymon Olewniczak } 67*de02284cSSzymon Olewniczak 68*de02284cSSzymon Olewniczak /*by convention all values as passed as strings*/ 69*de02284cSSzymon Olewniczak return (string) $value; 70*de02284cSSzymon Olewniczak } 71*de02284cSSzymon Olewniczak 72*de02284cSSzymon Olewniczak public function validate($data, $fields=null) { 73*de02284cSSzymon Olewniczak $val_data = array(); 74*de02284cSSzymon Olewniczak 75*de02284cSSzymon Olewniczak if (is_null($fields)) { 76*de02284cSSzymon Olewniczak $fields = array_keys($this->rules); 77*de02284cSSzymon Olewniczak } 78*de02284cSSzymon Olewniczak 79*de02284cSSzymon Olewniczak foreach ($data as $key => $value) { 80*de02284cSSzymon Olewniczak if (!in_array($key, $fields)) { 81*de02284cSSzymon Olewniczak continue; 82*de02284cSSzymon Olewniczak } 83*de02284cSSzymon Olewniczak try { 84*de02284cSSzymon Olewniczak $val_data[$key] = $this->validate_field($key, $value); 85*de02284cSSzymon Olewniczak 86*de02284cSSzymon Olewniczak } catch (ValidationException $e) { 87*de02284cSSzymon Olewniczak $this->errors[$key] = $e->get_errors()[$key]; 88*de02284cSSzymon Olewniczak } 89*de02284cSSzymon Olewniczak } 90*de02284cSSzymon Olewniczak if (count($this->errors) > 0) { 91*de02284cSSzymon Olewniczak return false; 92*de02284cSSzymon Olewniczak } 93*de02284cSSzymon Olewniczak 94*de02284cSSzymon Olewniczak return $val_data; 95*de02284cSSzymon Olewniczak } 96*de02284cSSzymon Olewniczak 97*de02284cSSzymon Olewniczak public function validate_array_of($array, $args) { 98*de02284cSSzymon Olewniczak 99*de02284cSSzymon Olewniczak $method = array_shift($args); 100*de02284cSSzymon Olewniczak 101*de02284cSSzymon Olewniczak foreach ($array as $value) { 102*de02284cSSzymon Olewniczak $result = $this->check_against_val_method($value, $method, $args); 103*de02284cSSzymon Olewniczak if ($result === false) { 104*de02284cSSzymon Olewniczak return false; 105*de02284cSSzymon Olewniczak } 106*de02284cSSzymon Olewniczak } 107*de02284cSSzymon Olewniczak return true; 108*de02284cSSzymon Olewniczak } 109*de02284cSSzymon Olewniczak 110*de02284cSSzymon Olewniczak public function validate_select($value, $options) { 111*de02284cSSzymon Olewniczak if (in_array($value, $options)) { 112*de02284cSSzymon Olewniczak return true; 113*de02284cSSzymon Olewniczak } 114*de02284cSSzymon Olewniczak return false; 115*de02284cSSzymon Olewniczak } 116*de02284cSSzymon Olewniczak 117*de02284cSSzymon Olewniczak public function validate_dw_user($user, $addtitional_values=array()) { 118*de02284cSSzymon Olewniczak $wiki_users = $this->model->userFactory->get_all(); 119*de02284cSSzymon Olewniczak if (array_key_exists($user, $wiki_users) || 120*de02284cSSzymon Olewniczak in_array($user, $addtitional_values)) { 121*de02284cSSzymon Olewniczak return true; 122*de02284cSSzymon Olewniczak } 123*de02284cSSzymon Olewniczak return false; 124*de02284cSSzymon Olewniczak } 125*de02284cSSzymon Olewniczak 126*de02284cSSzymon Olewniczak public function validate_unix_timestamp($stamp) { 127*de02284cSSzymon Olewniczak if (is_numeric($stamp)) { 128*de02284cSSzymon Olewniczak return true; 129*de02284cSSzymon Olewniczak } 130*de02284cSSzymon Olewniczak return false; 131*de02284cSSzymon Olewniczak } 132*de02284cSSzymon Olewniczak 133*de02284cSSzymon Olewniczak public function validate_numeric($value) { 134*de02284cSSzymon Olewniczak if (is_numeric($value)) { 135*de02284cSSzymon Olewniczak return true; 136*de02284cSSzymon Olewniczak } 137*de02284cSSzymon Olewniczak return false; 138*de02284cSSzymon Olewniczak } 139*de02284cSSzymon Olewniczak 140*de02284cSSzymon Olewniczak public function validate_length($value, $max_length) { 141*de02284cSSzymon Olewniczak if (strlen($value) <= $max_length) { 142*de02284cSSzymon Olewniczak return true; 143*de02284cSSzymon Olewniczak } 144*de02284cSSzymon Olewniczak return false; 145*de02284cSSzymon Olewniczak } 146*de02284cSSzymon Olewniczak 147*de02284cSSzymon Olewniczak public function validate_iso_date($date) { 148*de02284cSSzymon Olewniczak if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $parts)) { 149*de02284cSSzymon Olewniczak $year = $parts[1]; 150*de02284cSSzymon Olewniczak $month = $parts[2]; 151*de02284cSSzymon Olewniczak $day = $parts[3]; 152*de02284cSSzymon Olewniczak if (mktime(0, 0, 0, $month, $day, $year)) { 153*de02284cSSzymon Olewniczak return true; 154*de02284cSSzymon Olewniczak } 155*de02284cSSzymon Olewniczak return false; 156*de02284cSSzymon Olewniczak } 157*de02284cSSzymon Olewniczak return false; 158*de02284cSSzymon Olewniczak } 159*de02284cSSzymon Olewniczak 160*de02284cSSzymon Olewniczak public function validate_sqlite_datetime($date) { 161*de02284cSSzymon Olewniczak $strtotime = strtotime($date); 162*de02284cSSzymon Olewniczak if ($strtotime === false) { 163*de02284cSSzymon Olewniczak return false; 164*de02284cSSzymon Olewniczak } 165*de02284cSSzymon Olewniczak 166*de02284cSSzymon Olewniczak $datetime = date('Y-m-d H:i:s', $strtotime); 167*de02284cSSzymon Olewniczak if ($datetime !== $date) { 168*de02284cSSzymon Olewniczak return false; 169*de02284cSSzymon Olewniczak } 170*de02284cSSzymon Olewniczak 171*de02284cSSzymon Olewniczak return true; 172*de02284cSSzymon Olewniczak } 173*de02284cSSzymon Olewniczak 174*de02284cSSzymon Olewniczak public function validate_time($time) { 175*de02284cSSzymon Olewniczak if (preg_match('/^(\d{1,2}):(\d{1,2})$/', $time, $parts)) { 176*de02284cSSzymon Olewniczak $hours = $parts[1]; 177*de02284cSSzymon Olewniczak $minutes = $parts[2]; 178*de02284cSSzymon Olewniczak 179*de02284cSSzymon Olewniczak if (mktime($hours, $minutes, 0)) { 180*de02284cSSzymon Olewniczak return true; 181*de02284cSSzymon Olewniczak } 182*de02284cSSzymon Olewniczak return false; 183*de02284cSSzymon Olewniczak } 184*de02284cSSzymon Olewniczak return false; 185*de02284cSSzymon Olewniczak } 186*de02284cSSzymon Olewniczak 187*de02284cSSzymon Olewniczak public function validate_must_be_empty($value) { 188*de02284cSSzymon Olewniczak if ($value == '') { 189*de02284cSSzymon Olewniczak return true; 190*de02284cSSzymon Olewniczak } 191*de02284cSSzymon Olewniczak return false; 192*de02284cSSzymon Olewniczak } 193*de02284cSSzymon Olewniczak} 194