From: tjhunt Date: Wed, 7 Jan 2009 09:26:47 +0000 (+0000) Subject: quiz editing: MDL-17416 Clean layout when starting a new attempt. X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=edd5246bddb5d19b7fabef8f63e87e69e5419a87;p=moodle.git quiz editing: MDL-17416 Clean layout when starting a new attempt. --- diff --git a/mod/quiz/attemptlib.php b/mod/quiz/attemptlib.php index 47fa2c720b..821469da86 100644 --- a/mod/quiz/attemptlib.php +++ b/mod/quiz/attemptlib.php @@ -319,7 +319,7 @@ class quiz { } // Break up the layout string into pages. - $pagelayouts = explode(',0', $layout); + $pagelayouts = explode(',0', quiz_clean_layout($layout, true)); // Strip off any empty last page (normally there is one). if (end($pagelayouts) == '') { diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index 4121f2e25a..3770cb66f1 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -1147,48 +1147,43 @@ function quiz_send_notification_emails($course, $quiz, $attempt, $context, $cm) * @param boolean $removeemptypages If true, remove empty pages from the quiz. False by default. * @return $string the cleaned-up layout */ -function quiz_clean_layout($layout,$removeemptypages=false){ - //remove duplicate "," (or triple, or...) - while(strstr($layout,",,")){ - $layout = str_replace(',,', ',', $layout); - } - //remove duplicate question ids - $layout_arr=explode(",",$layout); - $new_arr=array(); - $seen=array(); - foreach($layout_arr as $key=>$value){ - if(!in_array($value,$seen) && $value!=0){ - $new_arr[]=$value; - $seen[]=$value; - }else if($value==0){ - $new_arr[]=0; - } +function quiz_clean_layout($layout, $removeemptypages = false){ + // Remove duplicate "," (or triple, or...) + $layout = preg_replace('/,{2,}/', ',', trim($layout, ',')); + + // Remove duplicate question ids + $layout = explode(',', $layout); + $cleanerlayout = array(); + $seen = array(); + foreach ($layout as $item) { + if ($item == 0) { + $cleanerlayout[] = '0'; + } else if (!in_array($item, $seen)) { + $cleanerlayout[] = $item; + $seen[] = $item; + } } - if($removeemptypages){ + + if ($removeemptypages) { // Avoid duplicate page breaks - // Go through all the array keys - for($i=0;$i1 AND - !($layout[$last-1] == ',' AND $layout[$last] == '0')){ - $layout .= ',0'; + + // Add a page break at the end if there is none + if (end($cleanerlayout) !== '0') { + $cleanerlayout[] = '0'; } - return $layout; + return implode(',', $cleanerlayout); } /** * Print a quiz error message. This is a thin wrapper around print_error, for convinience. diff --git a/mod/quiz/simpletest/testlocallib.php b/mod/quiz/simpletest/testlocallib.php index 833d5d68dc..75beb6830d 100644 --- a/mod/quiz/simpletest/testlocallib.php +++ b/mod/quiz/simpletest/testlocallib.php @@ -48,5 +48,28 @@ class quiz_locallib_test extends MoodleUnitTestCase { $this->assertEqual(quiz_number_of_questions_in_quiz('1,2,3,0'), 3); $this->assertEqual(quiz_number_of_questions_in_quiz('0,1,0,0,2,0'), 2); } + + function test_quiz_clean_layout() { + // Without stripping empty pages. + $this->assertEqual(quiz_clean_layout(',,1,,,2,,'), '1,2,0'); + $this->assertEqual(quiz_clean_layout(''), '0'); + $this->assertEqual(quiz_clean_layout('0'), '0'); + $this->assertEqual(quiz_clean_layout('0,0'), '0,0'); + $this->assertEqual(quiz_clean_layout('0,0,0'), '0,0,0'); + $this->assertEqual(quiz_clean_layout('1'), '1,0'); + $this->assertEqual(quiz_clean_layout('1,2'), '1,2,0'); + $this->assertEqual(quiz_clean_layout('1,0,2'), '1,0,2,0'); + $this->assertEqual(quiz_clean_layout('0,1,0,0,2,0'), '0,1,0,0,2,0'); + + // With stripping empty pages. + $this->assertEqual(quiz_clean_layout('', true), '0'); + $this->assertEqual(quiz_clean_layout('0', true), '0'); + $this->assertEqual(quiz_clean_layout('0,0', true), '0'); + $this->assertEqual(quiz_clean_layout('0,0,0', true), '0'); + $this->assertEqual(quiz_clean_layout('1', true), '1,0'); + $this->assertEqual(quiz_clean_layout('1,2', true), '1,2,0'); + $this->assertEqual(quiz_clean_layout('1,0,2', true), '1,0,2,0'); + $this->assertEqual(quiz_clean_layout('0,1,0,0,2,0', true), '1,0,2,0'); + } } ?> \ No newline at end of file