@@ -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