From 2ade1b52f9f44ca80aff60da5ec8b325b2f8fc6f Mon Sep 17 00:00:00 2001 From: Tomasz Muras Date: Fri, 21 Sep 2012 22:01:06 +0200 Subject: [PATCH] MDL-35547 Detect loops in question categories. --- lib/questionlib.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/questionlib.php b/lib/questionlib.php index 5f2cfc14d39..c18a7632c5b 100644 --- a/lib/questionlib.php +++ b/lib/questionlib.php @@ -1179,16 +1179,24 @@ function question_add_tops($categories, $pcontexts) { function question_categorylist($categoryid) { global $DB; - $subcategories = $DB->get_records('question_categories', - array('parent' => $categoryid), 'sortorder ASC', 'id, 1'); + //final list of category IDs + $categorylist = array(); - $categorylist = array($categoryid); - foreach ($subcategories as $subcategory) { - if($subcategory->id == $categoryid) - //prevent infinite loop - throw new coding_exception("Question category $categoryid points to itself as a parent."); + //a list of category IDs to check for any sub-categories + $templist = array($categoryid); + + while ($current = array_shift($templist)) { + if (isset($categorylist[$current])) { + throw new coding_exception("Category id=$current is already on the list - loop of categories detected."); } - $categorylist = array_merge($categorylist, question_categorylist($subcategory->id)); + + $subcategories = $DB->get_records('question_categories', + array('parent' => $current), 'sortorder ASC', 'id, 1'); + foreach ($subcategories as $subcategory) { + $templist[] = $subcategory->id; + } + + $categorylist[$current] = $current; } return $categorylist;