xref: /plugin/bez/mdl/Validator.php (revision de02284c1e90f3c0d8df29c1c019b3ef912eafd9)
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