aboutsummaryrefslogtreecommitdiff
path: root/lib/validation.php
blob: fdcb51c5e4e3075cf1a206f1bbdeef7370187feb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
function validateData(&$data, $parameters){
	$validateTextValue = function($value, $pattern = null){
		if(!is_null($pattern)) {
			$filteredValue = filter_var($value,
			FILTER_VALIDATE_REGEXP,
			array('options' => array(
					'regexp' => '/^' . $pattern . '$/'
				)
			));
		} else {
			$filteredValue = filter_var($value);
		}

		if($filteredValue === false)
			return null;

		return $filteredValue;
	};

	$validateNumberValue = function($value){
		$filteredValue = filter_var($value, FILTER_VALIDATE_INT);

		if($filteredValue === false)
			return null;

		return $filteredValue;
	};

	$validateCheckboxValue = function($value){
		return filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
	};

	$validateListValue = function($value, $expectedValues){
		$filteredValue = filter_var($value);

		if($filteredValue === false)
			return null;

		if(!in_array($filteredValue, $expectedValues)) { // Check sub-values?
			foreach($expectedValues as $subName => $subValue) {
				if(is_array($subValue) && in_array($filteredValue, $subValue))
					return $filteredValue;
			}
			return null;
		}

		return $filteredValue;
	};

	if(!is_array($data))
		return false;

	foreach($data as $name => $value) {
		$registered = false;
		foreach($parameters as $context => $set) {
			if(array_key_exists($name, $set)) {
				$registered = true;
				if(!isset($set[$name]['type'])) {
					$set[$name]['type'] = 'text';
				}

				switch($set[$name]['type']) {
				case 'number':
					$data[$name] = $validateNumberValue($value);
					break;
				case 'checkbox':
					$data[$name] = $validateCheckboxValue($value);
					break;
				case 'list':
					$data[$name] = $validateListValue($value, $set[$name]['values']);
					break;
				default:
				case 'text':
					if(isset($set[$name]['pattern'])) {
						$data[$name] = $validateTextValue($value, $set[$name]['pattern']);
					} else {
						$data[$name] = $validateTextValue($value);
					}
					break;
				}

				if(is_null($data[$name]) && isset($set[$name]['required']) && $set[$name]['required']) {
					echo 'Parameter \'' . $name . '\' is invalid!' . PHP_EOL;
					return false;
				}
			}
		}

		if(!$registered)
			return false;
	}

	return true;
}