Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/fluentform/app/Services/ConditionAssesor.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
3
+
namespace FluentForm\App\Services;
4
+
5
+
use FluentForm\App\Helpers\Helper;
6
+
use FluentForm\App\Helpers\Str;
7
+
use FluentForm\App\Services\FormBuilder\EditorShortcodeParser;
8
+
use FluentForm\Framework\Helpers\ArrayHelper as Arr;
9
+
10
+
class ConditionAssesor
11
+
{
12
+
public static function evaluate(&$field, &$inputs, $form = null)
13
+
{
14
+
$status = Arr::get($field, 'conditionals.status');
15
+
if (!$status) {
16
+
return true;
17
+
}
18
+
19
+
$type = Arr::get($field, 'conditionals.type', 'any');
20
+
21
+
// Handle group conditions
22
+
if ($type === 'group' && $conditionGroups = Arr::get($field, 'conditionals.condition_groups')) {
23
+
return self::evaluateGroupConditions($conditionGroups, $inputs, $form);
24
+
}
25
+
26
+
// Handle 'any', 'all' conditions
27
+
if ($type !== 'group' && $conditions = Arr::get($field, 'conditionals.conditions')) {
28
+
return self::evaluateConditions($conditions, $inputs, $type, $form);
29
+
}
30
+
return true;
31
+
}
32
+
33
+
private static function evaluateGroupConditions($conditionGroups, &$inputs, $form = null)
34
+
{
35
+
$hasGroupConditionsMet = true;
36
+
foreach ($conditionGroups as $group) {
37
+
if ($conditions = Arr::get($group, 'rules')) {
38
+
$hasGroupConditionsMet = self::evaluateConditions($conditions, $inputs, 'all', $form);
39
+
if ($hasGroupConditionsMet) {
40
+
return true;
41
+
}
42
+
}
43
+
}
44
+
return $hasGroupConditionsMet;
45
+
}
46
+
47
+
private static function evaluateConditions($conditions, &$inputs, $type, $form = null)
48
+
{
49
+
$hasConditionMet = true;
50
+
51
+
foreach ($conditions as $condition) {
52
+
if (!Arr::get($condition, 'field') || !Arr::get($condition, 'operator')) {
53
+
continue;
54
+
}
55
+
56
+
$hasConditionMet = static::assess($condition, $inputs, $form);
57
+
58
+
if ($hasConditionMet && $type == 'any') {
59
+
return true;
60
+
}
61
+
62
+
if ($type === 'all' && !$hasConditionMet) {
63
+
return false;
64
+
}
65
+
}
66
+
67
+
return $hasConditionMet;
68
+
}
69
+
70
+
public static function assess(&$conditional, &$inputs, $form = null)
71
+
{
72
+
if ($conditional['field']) {
73
+
$accessor = rtrim(str_replace(['[', ']', '*'], ['.'], $conditional['field']), '.');
74
+
75
+
if (!Arr::has($inputs, $accessor)) {
76
+
return false;
77
+
}
78
+
$inputValue = Arr::get($inputs, $accessor);
79
+
80
+
if ($numericFormatter = Arr::get($conditional, 'numeric_formatter')) {
81
+
$inputValue = Helper::getNumericValue($inputValue, $numericFormatter);
82
+
}
83
+
$conditionValue = Arr::get($conditional, 'value');
84
+
$isArrayAcceptable = in_array($conditional['operator'], ['=', '!=']);
85
+
if (!empty($conditionValue) && is_string($conditionValue)) {
86
+
$conditionValue = self::processSmartCodesInValue($conditionValue, $inputs, $form, $isArrayAcceptable);
87
+
}
88
+
89
+
$conditionValue = is_null($conditionValue) ? '' : $conditionValue;
90
+
91
+
switch ($conditional['operator']) {
92
+
case '=':
93
+
if (is_array($inputValue) && is_array($conditionValue)) {
94
+
$flatInput = Arr::flatten($inputValue);
95
+
$flatCondition = Arr::flatten($conditionValue);
96
+
sort($flatInput);
97
+
sort($flatCondition);
98
+
return $flatInput == $flatCondition;
99
+
}
100
+
101
+
if (is_array($conditionValue)) {
102
+
return in_array($inputValue, Arr::flatten($conditionValue));
103
+
}
104
+
if (is_array($inputValue)) {
105
+
return in_array($conditionValue, Arr::flatten($inputValue));
106
+
}
107
+
return $inputValue == $conditionValue;
108
+
case '!=':
109
+
if (is_array($inputValue) && is_array($conditionValue)) {
110
+
return count(array_intersect(Arr::flatten($inputValue), Arr::flatten($conditionValue))) == 0;
111
+
}
112
+
if (is_array($conditionValue)) {
113
+
return !in_array($inputValue, Arr::flatten($conditionValue));
114
+
}
115
+
if (is_array($inputValue)) {
116
+
return !in_array($conditionValue, Arr::flatten($inputValue));
117
+
}
118
+
return $inputValue != $conditionValue;
119
+
case '>':
120
+
return $inputValue > $conditionValue;
121
+
case '<':
122
+
return $inputValue < $conditionValue;
123
+
case '>=':
124
+
return $inputValue >= $conditionValue;
125
+
case '<=':
126
+
return $inputValue <= $conditionValue;
127
+
case 'startsWith':
128
+
return Str::startsWith($inputValue, $conditionValue);
129
+
case 'endsWith':
130
+
return Str::endsWith($inputValue, $conditionValue);
131
+
case 'contains':
132
+
return Str::contains($inputValue, $conditionValue);
133
+
case 'doNotContains':
134
+
return !Str::contains($inputValue, $conditionValue);
135
+
case 'length_equal':
136
+
if (is_array($inputValue)) {
137
+
return count($inputValue) == $conditionValue;
138
+
}
139
+
$inputValue = (string)$inputValue;
140
+
return strlen($inputValue) == $conditionValue;
141
+
case 'length_less_than':
142
+
if (is_array($inputValue)) {
143
+
return count($inputValue) < $conditionValue;
144
+
}
145
+
$inputValue = (string)$inputValue;
146
+
return strlen($inputValue) < $conditionValue;
147
+
case 'length_greater_than':
148
+
if (is_array($inputValue)) {
149
+
return count($inputValue) > $conditionValue;
150
+
}
151
+
$inputValue = (string)$inputValue;
152
+
return strlen($inputValue) > $conditionValue;
153
+
case 'test_regex':
154
+
if (is_array($inputValue)) {
155
+
$inputValue = implode(' ', $inputValue);
156
+
}
157
+
$pattern = '/' . $conditionValue . '/';
158
+
$result = @preg_match($pattern, $inputValue);
159
+
if ($result === false) {
160
+
// Invalid regex pattern, handle gracefully
161
+
return false;
162
+
}
163
+
return (bool) $result;
164
+
}
165
+
}
166
+
167
+
return false;
168
+
}
169
+
170
+
private static function processSmartCodesInValue($value, &$inputs, $form = null, $isArrayAcceptable = true)
171
+
{
172
+
if (strpos($value, '{') === false) {
173
+
return $value;
174
+
}
175
+
176
+
if (preg_match('/^{inputs\.([^}]+)}$/', $value, $inputMatches)) {
177
+
$fieldName = $inputMatches[1];
178
+
$fieldKey = str_replace(['[', ']'], ['.', ''], $fieldName);
179
+
180
+
$resolvedValue = Arr::get($inputs, $fieldKey);
181
+
182
+
if ($resolvedValue === null && $fieldKey !== $fieldName) {
183
+
$resolvedValue = Arr::get($inputs, $fieldName);
184
+
}
185
+
186
+
// Return array if it's an array
187
+
if (is_array($resolvedValue) && $isArrayAcceptable) {
188
+
return $resolvedValue;
189
+
}
190
+
}
191
+
192
+
try {
193
+
$processedValue = preg_replace_callback('/{+(.*?)}/', function ($matches) use ($inputs, $form) {
194
+
$smartCode = $matches[1];
195
+
196
+
if (false !== strpos($smartCode, 'inputs.')) {
197
+
$fieldName = substr($smartCode, strlen('inputs.'));
198
+
199
+
$fieldKey = str_replace(['[', ']'], ['.', ''], $fieldName);
200
+
201
+
$value = Arr::get($inputs, $fieldKey, '');
202
+
203
+
if ($value === '' && $fieldKey !== $fieldName) {
204
+
$value = Arr::get($inputs, $fieldName, '');
205
+
}
206
+
207
+
if (is_array($value)) {
208
+
$value = fluentImplodeRecursive(', ', $value);
209
+
}
210
+
211
+
return $value !== null && $value !== '' ? $value : '';
212
+
}
213
+
214
+
// @todo Support general shortcodes in future
215
+
216
+
// Always return the original value if we don't have a match
217
+
return $matches[0];
218
+
}, $value);
219
+
220
+
return $processedValue;
221
+
} catch (\Exception $e) {
222
+
return $value;
223
+
}
224
+
}
225
+
}
226
+