/
ComplexRequiredFields.php
executable file
·120 lines (102 loc) · 2.81 KB
/
ComplexRequiredFields.php
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php
/**
* @package forms
* @subpackage validators
*/
/**
* Validator that makes it easy to do required-fields while still allowing custom behaviour.
* @package forms
* @subpackage validators
* @deprecated How is this better than / different from {@link CustomRequiredFields}?
*/
class ComplexRequiredFields extends RequiredFields{
protected $required;
function __construct() {
$Required = func_get_args();
$this->required = $Required;
}
/**
* Removes all required fields from this validator
*/
public function removeValidation(){
$this->required = null;
}
/**
* Creates the client side validation from form fields
* which is generated at the header of each page
*/
function javascript() {
foreach($this->form->Fields() as $field){
//if the field type has some special specific specification for validation of itself
$valid = $field->jsValidation();
if($valid){
$code .= $valid;
}
}
if($this->required){
foreach($this->required[0] as $field) {
if(is_array($field)){
$special = "\n clearValidationErrorCache();\n";
$special .= " errors = false;\n";
foreach($field as $compareset){
$special .= "\n errors = errors || (";
foreach($compareset as $required){
$special .= "\n require('$required',true) && ";
}
$special = substr($special,0,-4);
$special .= ");";
}
$special .= "\n if(!errors) showCachedValidationErrors();\n";
$code .= $special;
}else{
$code .= " require('$field');\n";
//Tabs for output tabbing :-)
}
}
}
return $code;
}
/**
* Creates the server side validation from form fields
* which is executed on form submission
*/
function php($data) {
$valid = true;
foreach($this->form->Fields() as $field) {
$valid = ($field->validate($this) && $valid);
}
if($this->required){
foreach($this->required[0] as $key => $field) {
if(is_array($field)){
$dataok = false;
// Items to XOR
foreach($field as $compareset){
// Items to AND
$requiredblock = false;
foreach($compareset as $requiredset){
$data[$requiredset] ? $requiredblock = $requiredblock || true : $requiredblock = $requiredblock && false;
$cachedErrors[$requiredset] = $requiredblock;
}
$dataok = $requiredblock || $dataok;
}
if(!$dataok){
foreach($cachedErrors as $field => $valid){
if(!$valid){
$this->validationError($field,"$field is required","required");
}
}
return false;
}
}else{
// if an error is found, the form is returned.
if(!$data[$field]) {
$this->validationError($field,"$field is required","required");
return false;
}
}
}
}
return $valid;
}
}
?>