Просмотр исходного кода

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.
Julio Montoya 6 лет назад
Родитель
Сommit
d4d41eebef
2 измененных файлов с 42 добавлено и 15 удалено
  1. 12 1
      main/lp/learnpath.class.php
  2. 30 14
      main/lp/learnpathItem.class.php

+ 12 - 1
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 .= '<tr>';
             $return .= '<td '.(($item['item_type'] != TOOL_QUIZ && $item['item_type'] != TOOL_HOTPOTATOES) ? ' colspan="3"' : '').'>';
@@ -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 .= '<td>';
                 $return .= '<input 
                     class="form-control" 

+ 30 - 14
main/lp/learnpathItem.class.php

@@ -2451,7 +2451,7 @@ class learnpathItem
                                     /** @var learnpathItem $itemToCheck */
                                     $itemToCheck = $items[$refs_list[$prereqs_string]];
 
-                                    if ($itemToCheck->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;
                                                         }
                                                     }