Test Failed
Push — master ( 794710...4acb1e )
by Georgi
03:38
created

Form::validate()   A

Complexity

Conditions 6
Paths 1

Size

Total Lines 24
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 12
nc 1
nop 1
dl 0
loc 24
rs 9.2222
c 0
b 0
f 0
1
<?php
2
3
namespace Epesi\Core\System\View;
4
5
use atk4\ui\Form as BaseForm;
6
use atk4\ui\jsExpression;
7
use atk4\ui\jsFunction;
8
use Epesi\Core\System\Modules\Concerns\Notifies;
9
10
class Form extends BaseForm
11
{
12
	use Notifies;
13
	
14
	public $buttonSave = null;
15
	
16
	protected $fieldRules = [];
17
	protected $validationRules = [];
18
	
19
	public function addElements($elements, $parent = null) {
20
		$parent = $parent?: $this;
21
		
22
		foreach ($elements as $name => $desc) {
23
			$name = $desc['name']?? $name;
24
			
25
			$this->addFieldRules($name, $desc['rules']?? []);
26
			
27
			switch ($desc['type']?? 'field') {
28
				case 'field':
29
					$desc = is_string($desc)? [
30
					'decorator' => [$desc]
31
					]: $desc;
32
					
33
					$field = $parent->addField($name, $desc['decorator']?? [], $desc['options']?? []);
34
					
35
					if ($default = $desc['default']) {
36
						$field->set($default);
37
					}
38
					
39
					if ($desc['display']?? false) {
40
						$this->addFieldsDisplayRules([$name => $desc['display']]);
41
					}
42
					break;
43
					
44
				case 'group':
45
					$seed = $desc['seed']?? [$name];
46
					
47
					$group = $parent->addGroup($seed);
48
					
49
					$this->addElements($desc['elements'], $group);
50
					
51
					if ($desc['display']?? false) {
52
						$this->addGroupDisplayRules([$name => $desc['display']]);
53
					}
54
					break;
55
					
56
				case 'header':
57
					$seed = $desc['seed']?? [$name];
58
					
59
					$parent->addHeader($seed);
0 ignored issues
show
Bug introduced by
It seems like $seed can also be of type array; however, parameter $title of atk4\ui\Form::addHeader() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

59
					$parent->addHeader(/** @scrutinizer ignore-type */ $seed);
Loading history...
60
					break;
61
					
62
				case 'view':
63
					$seed = $desc['seed']?? ['Label', $name];
64
					
65
					$region = $desc['region']?? null;
66
					
67
					$this->add($seed, $region);
68
					break;
69
					
70
				default:
71
					;
72
					break;
73
			}
74
		}
75
		
76
		return $this;
77
	}
78
	
79
	public function addFieldsDisplayRules($fieldsDisplayRules) {
80
		$this->setFieldsDisplayRules(array_merge($this->fieldsDisplayRules?: [], $fieldsDisplayRules));
81
	}
82
	
83
	public function addGroupDisplayRules($groupDisplayRules) {
84
		$fieldsDisplayRules = $this->fieldsDisplayRules;
85
		
86
		$this->setGroupDisplayRules($groupDisplayRules);
87
		
88
		$this->addFieldsDisplayRules($fieldsDisplayRules);
89
	}
90
	
91
	public function addFieldRules($field, $rules = []) {
92
		if (! $rules) return;
93
		
94
		$this->fieldRules[$field] = $rules['rules']?? [
95
				'identifier' => $field,
96
				'rules' => $rules
97
		];
98
		
99
		return $this;
100
	}
101
	
102
	public function validate($callback)
103
	{
104
		$this->setApiConfig([
105
				'beforeSend' => new jsFunction(['settings'], [new jsExpression('return $(this).form("is valid")')]),
106
		]);
107
		
108
		$this->setFormConfig([
109
				'fields' => $this->fieldRules
110
		]);
111
		
112
		$this->onSubmit(function ($form) use ($callback) {
113
			$errors = [];
114
			foreach ($this->validationRules?: [] as $ruleCallback) {
115
				if (! is_callable($ruleCallback)) continue;
116
				
117
				$ruleErrors = $ruleCallback($form);
118
				
119
				$errors = array_merge($errors, $ruleErrors?: []);
120
			}
121
			
122
			return $errors?: $callback($this);
123
		});
124
			
125
			return $this;
126
	}
127
	
128
	public function submit()
129
	{
130
		return $this->js()->form('submit');
131
	}
132
	
133
	public function confirmLeave($confirm = true)
134
	{
135
		$this->canLeave = ! $confirm;
136
		
137
		return $this;
138
	}
139
}