diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index d38e44b8c3d..aba5d839c28 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -1687,5 +1687,15 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2012120303.02); } + if ($oldversion < 2012120301.18) { + // MDL-29877 Some bad restores created grade items with no category information. + $sql = "UPDATE mdl_grade_items + SET categoryid = courseid + WHERE itemtype <> 'course' and itemtype <> 'category' + AND categoryid IS NULL"; + $DB->execute($sql); + upgrade_main_savepoint(true, 2012120301.18); + } + return true; } diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 87c494ffe26..1597d697a6d 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -1154,13 +1154,17 @@ class grade_category extends grade_object { } else { $categoryid = $item->categoryid; + if (empty($categoryid)) { + debugging('Found a grade item that isnt in a category'); + } } // prevent problems with duplicate sortorders in db $sortorder = $item->sortorder; - while (array_key_exists($sortorder, $cats[$categoryid]->children)) { - //debugging("$sortorder exists in item loop"); + while (array_key_exists($categoryid, $cats) + && array_key_exists($sortorder, $cats[$categoryid]->children)) { + $sortorder++; }