From f4e974d2fce84eeed9a128020c93d8f5319bd698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Szarvas?= Date: Mon, 4 Feb 2019 16:24:22 +0100 Subject: [PATCH] MDL-63959 mod_feedback: Fixed nested dependency handling For example the dependecy chain is the following: A->B->C. When a question (A) depends on another dependent item (B) and B hasn't displayed (because of C's response), the $value for the B's response will be null. In this case the can_see_item() method returned null. Because the can_see_item() returned null (not false), the get_pages() method displayed the question A, because it checks for explicit false: $this->can_see_item($item) !== false. Now, false is also returned, if the dependent question is not visible. --- mod/feedback/classes/completion.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mod/feedback/classes/completion.php b/mod/feedback/classes/completion.php index 22898408152..5c675610238 100644 --- a/mod/feedback/classes/completion.php +++ b/mod/feedback/classes/completion.php @@ -147,7 +147,10 @@ class mod_feedback_completion extends mod_feedback_structure { * * @param stdClass $item * @return bool whether user can see item or not, - * null if dependency is broken or dependent question is not answered. + * true if there is no dependency or dependency is met, + * false if dependent question is visible or broken + * and further it is either not answered or the dependency is not met, + * null if dependency is broken. */ protected function can_see_item($item) { if (empty($item->dependitem)) { @@ -165,6 +168,10 @@ class mod_feedback_completion extends mod_feedback_structure { $value = $this->get_values_tmp($ditem); } if ($value === null) { + // Cyclic dependencies are no problem here, since they will throw an dependency error above. + if ($this->can_see_item($ditem) === false) { + return false; + } return null; } return $itemobj->compare_value($ditem, $value, $item->dependvalue) ? true : false;