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