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