From d4d41eebefa66e0441bee6bc03500937287f361d Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Thu, 15 Nov 2018 10:53:09 +0100 Subject: [PATCH] Use mastery_score as "min prerequisite" value if it was set before See BT#15056 In 1.9.x c_lp_item.mastery_score was used as a min value. This value will be checked if "c_lp_item.prerequisite_min_score" is empty only when a exercise is a prerequisite. --- main/lp/learnpath.class.php | 13 +++++++++- main/lp/learnpathItem.class.php | 44 ++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/main/lp/learnpath.class.php b/main/lp/learnpath.class.php index 1919fd3dbe..2bd320c80d 100755 --- a/main/lp/learnpath.class.php +++ b/main/lp/learnpath.class.php @@ -10290,8 +10290,10 @@ class learnpath public function display_item_prerequisites_form($item_id = 0) { $course_id = api_get_course_int_id(); + $item_id = (int) $item_id; + $tbl_lp_item = Database::get_course_table(TABLE_LP_ITEM); - $item_id = intval($item_id); + /* Current prerequisite */ $sql = "SELECT * FROM $tbl_lp_item WHERE iid = $item_id"; @@ -10329,10 +10331,13 @@ class learnpath $selectedMinScore = []; $selectedMaxScore = []; + $masteryScore = []; + while ($row = Database::fetch_array($result)) { if ($row['id'] == $item_id) { $selectedMinScore[$row['prerequisite']] = $row['prerequisite_min_score']; $selectedMaxScore[$row['prerequisite']] = $row['prerequisite_max_score']; + $masteryScore[$row['prerequisite']] = $row['mastery_score']; } $arrLP[] = [ 'id' => $row['iid'], @@ -10366,6 +10371,7 @@ class learnpath $selectedMaxScoreValue = isset($selectedMaxScore[$item['id']]) ? $selectedMaxScore[$item['id']] : $item['max_score']; $selectedMinScoreValue = isset($selectedMinScore[$item['id']]) ? $selectedMinScore[$item['id']] : 0; + $masteryScoreAsMinValue = isset($masteryScore[$item['id']]) ? $masteryScore[$item['id']] : 0; $return .= ''; $return .= ''; @@ -10398,6 +10404,11 @@ class learnpath $lpItemObj->update(); $item['max_score'] = $lpItemObj->max_score; + if (empty($selectedMinScoreValue) && !empty($masteryScoreAsMinValue)) { + // Backwards compatibility with 1.9.x use mastery_score as min value + $selectedMinScoreValue = $masteryScoreAsMinValue; + } + $return .= ''; $return .= 'type == 'quiz') { + if ($itemToCheck->type === 'quiz') { // 1. Checking the status in current items. $status = $itemToCheck->get_status(true); $returnstatus = $status == $this->possible_status[2] || $status == $this->possible_status[3]; @@ -2495,10 +2495,18 @@ class learnpathItem LIMIT 0, 1'; $rs_quiz = Database::query($sql); if ($quiz = Database::fetch_array($rs_quiz)) { - $minScore = $items[$refs_list[$this->get_id( - )]]->getPrerequisiteMinScore(); - $maxScore = $items[$refs_list[$this->get_id( - )]]->getPrerequisiteMaxScore(); + /** @var learnpathItem $myItemToCheck */ + $myItemToCheck = $items[$refs_list[$this->get_id()]]; + $minScore = $myItemToCheck->getPrerequisiteMinScore(); + $maxScore = $myItemToCheck->getPrerequisiteMaxScore(); + + if (empty($minScore)) { + // Try with mastery_score + $masteryScoreAsMin = $myItemToCheck->get_mastery_score(); + if (!empty($masteryScoreAsMin)) { + $minScore = $masteryScoreAsMin; + } + } if (isset($minScore) && isset($minScore)) { // Taking min/max prerequisites values see BT#5776 @@ -2544,19 +2552,29 @@ class learnpathItem exe_exo_id = '.$items[$refs_list[$prereqs_string]]->path.' AND exe_user_id = '.$user_id.' AND orig_lp_id = '.$this->lp_id.' AND - orig_lp_item_id = '.$prereqs_string.' '; + orig_lp_item_id = '.$prereqs_string; $rs_quiz = Database::query($sql); if (Database::num_rows($rs_quiz) > 0) { while ($quiz = Database::fetch_array($rs_quiz)) { - $minScore = $items[$refs_list[$this->get_id( - )]]->getPrerequisiteMinScore(); - $maxScore = $items[$refs_list[$this->get_id( - )]]->getPrerequisiteMaxScore(); + /** @var learnpathItem $myItemToCheck */ + $myItemToCheck = $items[$refs_list[$this->get_id()]]; + $minScore = $myItemToCheck->getPrerequisiteMinScore(); + $maxScore = $myItemToCheck->getPrerequisiteMaxScore(); + + if (empty($minScore)) { + // Try with mastery_score + $masteryScoreAsMin = $myItemToCheck->get_mastery_score(); + if (!empty($masteryScoreAsMin)) { + $minScore = $masteryScoreAsMin; + } + } if (isset($minScore) && isset($minScore)) { // Taking min/max prerequisites values see BT#5776 - if ($quiz['exe_result'] >= $minScore && $quiz['exe_result'] <= $maxScore) { + if ($quiz['exe_result'] >= $minScore && + $quiz['exe_result'] <= $maxScore + ) { $returnstatus = true; break; } else { @@ -2574,9 +2592,7 @@ class learnpathItem $returnstatus = true; break; } else { - $this->prereq_alert = get_lang( - 'LearnpathPrereqNotCompleted' - ); + $this->prereq_alert = get_lang('LearnpathPrereqNotCompleted'); $returnstatus = false; } }