Skip to content

Commit

Permalink
MDL-9506 Changed grade_tree fullobjects param (not fully implemented)…
Browse files Browse the repository at this point in the history
… to $include_grades param, default to false, fully implemented. Full objects are always loaded when building the tree, but grades are only loaded conditionally.
  • Loading branch information
nicolasconnault committed May 22, 2007
1 parent ac90523 commit 9c585e5
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 50 deletions.
93 changes: 46 additions & 47 deletions lib/grade/grade_tree.php
Expand Up @@ -67,22 +67,28 @@ class grade_tree {
*/
var $need_delete = array();

/**
* Whether or not this grade_tree should load and store all the grades in addition to the categories and items.
* @var boolean $include_grades
*/
var $include_grades;

/**
* Constructor, retrieves and stores a hierarchical array of all grade_category and grade_item
* objects for the given courseid or the entire site if no courseid given. Full objects are instantiated
* by default, but this can be switched off. The tree is indexed by sortorder, to facilitate CRUD operations
* and renumbering.
* @param int $courseid
* @param boolean $fullobjects
* @param boolean $include_grades
* @param array $tree
*/
function grade_tree($courseid=NULL, $fullobjects=true, $tree=NULL) {
function grade_tree($courseid=NULL, $include_grades=false, $tree=NULL) {
$this->courseid = $courseid;
$this->include_grades = $include_grades;
if (!empty($tree)) {
$this->tree_array = $tree;
} else {
$this->tree_array = $this->get_tree($fullobjects);
$this->tree_array = $this->get_tree($include_grades);
}

$this->first_sortorder = key($this->tree_array);
Expand Down Expand Up @@ -273,7 +279,7 @@ function insert_element($element, $destination_sortorder, $position='before') {
}

// If the object is a grade_item, but the final_grades index isn't yet loaded, make the switch now. Same for grade_category and children
if (get_class($new_element->element['object']) == 'grade_item' && empty($new_element->element['final_grades'])) {
if (get_class($new_element->element['object']) == 'grade_item' && empty($new_element->element['final_grades']) && $this->include_grades) {
$new_element->element['final_grades'] = $new_element->element['object']->load_final();
unset($new_element->element['object']->grade_grades_final);
} elseif (get_class($new_element->element['object']) == 'grade_category' &&
Expand Down Expand Up @@ -479,10 +485,9 @@ function renumber($starting_sortorder=NULL) {
/**
* Static method that returns a sorted, nested array of all grade_categories and grade_items for
* a given course, or for the entire site if no courseid is given.
* @param boolean $fullobjects Whether to instantiate full objects based on the data or not
* @return array
*/
function get_tree($fullobjects=true) {
function get_tree() {
global $CFG;
global $db;
$db->debug = false;
Expand All @@ -507,9 +512,7 @@ function get_tree($fullobjects=true) {
// For every grade_item that doesn't have a parent category, create category fillers
foreach ($grade_items as $itemid => $item) {
if (empty($item->categoryid)) {
if ($fullobjects) {
$item = new grade_item($item);
}
$item = new grade_item($item);
$fillers[$item->sortorder] = $item;
}
}
Expand Down Expand Up @@ -541,14 +544,14 @@ function get_tree($fullobjects=true) {
$object = current($fillers);
unset($fillers[$sortorder]);

$this->tree_filled[$sortorder] = $this->get_filler($object, $fullobjects);
$this->tree_filled[$sortorder] = $this->get_filler($object);
$element = array();

if (get_class($object) == 'grade_category') {
$children = $object->get_children(1);
unset($object->children);
$element['children'] = $children;
} elseif (get_class($object) == 'grade_item') {
} elseif (get_class($object) == 'grade_item' && $this->include_grades) {
$final_grades = $object->get_final();
unset($object->grade_grades_final);
$element['final_grades'] = $final_grades;
Expand Down Expand Up @@ -577,38 +580,30 @@ function get_tree($fullobjects=true) {
}

foreach ($items as $itemid => $item) {
$finaltree = array();
if ($fullobjects) {
$finals = array();

if ($this->include_grades) {
$final = new grade_grades_final();
$final->itemid = $itemid;
$finals = $final->fetch_all_using_this();
} else {
$finals = get_records('grade_grades_final', 'itemid', $itemid);
}

if ($fullobjects) {
$sortorder = $item->sortorder;
$item = new grade_item($item);
$item->sortorder = $sortorder;
}
$sortorder = $item->sortorder;
$item = new grade_item($item);
$item->sortorder = $sortorder;

$itemtree[$item->sortorder] = array('object' => $item, 'finalgrades' => $finals);
}

if ($fullobjects) {
$sortorder = $subcat->sortorder;
$subcat = new grade_category($subcat, false);
$subcat->sortorder = $sortorder;
}
$sortorder = $subcat->sortorder;
$subcat = new grade_category($subcat, false);
$subcat->sortorder = $sortorder;
$subcattree[$subcat->sortorder] = array('object' => $subcat, 'children' => $itemtree);
}

if ($fullobjects) {
$sortorder = $topcat->sortorder;
$topcat = new grade_category($topcat, false);
$topcat->sortorder = $sortorder;
}
$sortorder = $topcat->sortorder;
$topcat = new grade_category($topcat, false);
$topcat->sortorder = $sortorder;

$tree[$topcat->sortorder] = array('object' => $topcat, 'children' => $subcattree);
$this->tree_filled[$topcat->sortorder] = array('object' => $topcat, 'children' => $subcattree);
Expand All @@ -617,13 +612,13 @@ function get_tree($fullobjects=true) {
// If there are still grade_items or grade_categories without a top category, add another filler
if (!empty($fillers)) {
foreach ($fillers as $sortorder => $object) {
$this->tree_filled[$sortorder] = $this->get_filler($object, $fullobjects);
$this->tree_filled[$sortorder] = $this->get_filler($object);

if (get_class($object) == 'grade_category') {
$children = $object->get_children(1);
unset($object->children);
$element['children'] = $children;
} elseif (get_class($object) == 'grade_item') {
} elseif (get_class($object) == 'grade_item' && $this->include_grades) {
$final_grades = $object->get_final();
unset($object->grade_grades_final);
$element['final_grades'] = $final_grades;
Expand All @@ -644,19 +639,21 @@ function get_tree($fullobjects=true) {
* the tree of grade_items in the cases where a grade_item or grade_category doesn't have a
* 2nd level topcategory.
* @param object $object A grade_item or a grade_category object
* @param boolean $fullobjects Whether to instantiate full objects or just return stdClass objects
* @return array
*/
function get_filler($object, $fullobjects=true) {
function get_filler($object) {
$filler_array = array();

// Depending on whether the filler is for a grade_item or a category...
if (isset($object->itemname)) {
if (get_class($object) == 'grade_item') {
$finals = $object->load_final();
} else {
$item_object = new grade_item($object, false);
$finals = $object->load_final();
$finals = array();
if ($this->include_grades) {
if (get_class($object) == 'grade_item') {
$finals = $object->load_final();
} else {
$item_object = new grade_item($object, false);
$finals = $object->load_final();
}
}

$filler_array = array('object' => 'filler', 'children' =>
Expand All @@ -667,14 +664,16 @@ function get_filler($object, $fullobjects=true) {
$subcat_children = $object->get_children(0, 'flat');
$children_for_tree = array();
foreach ($subcat_children as $itemid => $item) {
$finals = null;

if (get_class($item) == 'grade_item') {
$finals = $item->load_final();
} else {
$item_object = new grade_item($item, false);
if (method_exists($item, 'load_final')) {
$finals = array();

if ($this->include_grades) {
if (get_class($item) == 'grade_item') {
$finals = $item->load_final();
} else {
$item_object = new grade_item($item, false);
if (method_exists($item, 'load_final')) {
$finals = $item->load_final();
}
}
}

Expand Down
11 changes: 8 additions & 3 deletions lib/simpletest/grade/simpletest/testgradetree.php
Expand Up @@ -77,7 +77,7 @@ function test_grade_tree_insert_grade_topcategory() {
}

function test_grade_tree_insert_grade_item() {
$tree = new grade_tree($this->courseid);
$tree = new grade_tree($this->courseid, true);
$grade_item = new grade_item($this->grade_items[2]);
$element = array('object' => $grade_item);
$tree->insert_element($element, 4);
Expand Down Expand Up @@ -163,7 +163,7 @@ function test_grade_tree_display_grades() {
}

function test_grade_tree_get_tree() {
$tree = new grade_tree($this->courseid);
$tree = new grade_tree($this->courseid, true);
$this->assertEqual(58, count($tree->tree_filled, COUNT_RECURSIVE));
$this->assertEqual(44, count($tree->tree_array, COUNT_RECURSIVE));
}
Expand Down Expand Up @@ -214,7 +214,7 @@ function test_grade_tree_remove_element() {
$tree->renumber();
$this->assertTrue(empty($tree->tree_array[1]['children'][4]));

$this->assertEqual(12, count($tree->tree_array, COUNT_RECURSIVE));
$this->assertEqual(9, count($tree->tree_array, COUNT_RECURSIVE));

// Check the need_delete array
$this->assertEqual(5, count($tree->need_delete));
Expand Down Expand Up @@ -259,4 +259,9 @@ function test_grade_tree_update_db() {
$tree->insert_element($element, 9);

}

function test_grade_tree_load_without_finals() {
$tree = new grade_tree($this->courseid);
$this->assertEqual(27, count($tree->tree_array, COUNT_RECURSIVE));
}
}

0 comments on commit 9c585e5

Please sign in to comment.