Skip to content

Commit 0fc6aea

Browse files
committed
fix(question_condition): better performance
use static var to cache condition results Signed-off-by: Thierry Bugier <[email protected]>
1 parent 63f3cee commit 0fc6aea

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

ajax/showfields.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333

3434
include ('../../../inc/includes.php');
3535

36-
$visibility = PluginFormcreatorFields::updateVisibility($_POST);
36+
try {
37+
$visibility = PluginFormcreatorFields::updateVisibility($_POST);
38+
} catch (Exception $e) {
39+
http_response_code(500);
40+
exit();
41+
}
3742
echo json_encode($visibility);
3843
exit();

inc/fields.class.php

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -129,22 +129,27 @@ public static function printAllTabFieldsForJS() {
129129
*/
130130
public static function isVisible($id, $fields) {
131131
/**
132-
* Keep track of questions being evaluated to detect infinite loops
132+
* Keep track of questions results and computation status
133+
* null = is beinc computed
134+
* true or false = result of a previous evaluation
135+
* not set = not evaluated yet and not being evaluated
133136
*/
134137
static $evalQuestion = [];
135-
if (isset($evalQuestion[$id])) {
136-
// TODO : how to deal a infinite loop while evaluating visibility of question ?
137-
return true;
138+
if (!isset($evalQuestion[$id])) {
139+
$evalQuestion[$id] = null;
140+
} else if ($evalQuestion[$id] !== null) {
141+
return $evalQuestion[$id];
142+
} else {
143+
throw new Exception("Infinite loop in show conditions evaluation");
138144
}
139-
$evalQuestion[$id] = $id;
140145

141146
$question = new PluginFormcreatorQuestion();
142147
$question->getFromDB($id);
143148
$conditions = [];
144149

145150
// If the field is always shown
146151
if ($question->getField('show_rule') == 'always') {
147-
unset($evalQuestion[$id]);
152+
$evalQuestion[$id] = true;
148153
return true;
149154
}
150155

@@ -154,7 +159,7 @@ public static function isVisible($id, $fields) {
154159
$questionConditions = $question_condition->getConditionsFromQuestion($questionId);
155160
if (count($questionConditions) < 1) {
156161
// No condition defined, then always show the question
157-
unset($evalQuestion[$id]);
162+
$evalQuestion[$id] = true;
158163
return true;
159164
}
160165

@@ -294,15 +299,15 @@ public static function isVisible($id, $fields) {
294299
$return = ($return xor $lowPrecedenceReturnPart);
295300
}
296301

297-
unset($evalQuestion[$id]);
298-
299302
if ($question->fields['show_rule'] == 'hidden') {
300303
// If the field is hidden by default, show it if condition is true
301-
return $return;
304+
$evalQuestion[$id] = $return;
302305
} else {
303306
// else show it if condition is false
304-
return !$return;
307+
$evalQuestion[$id] = !$return;
305308
}
309+
310+
return $evalQuestion[$id];
306311
}
307312

308313
/**

0 commit comments

Comments
 (0)