From: nicolasconnault Date: Thu, 24 May 2007 08:50:01 +0000 (+0000) Subject: MDL-9629 Beginning the edit category page. Also added dmllib::sql_max($field) and... X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=2186f72cb1af458ae6f8e40fb1e27b98592a4ba8;p=moodle.git MDL-9629 Beginning the edit category page. Also added dmllib::sql_max($field) and fixed a few bugs. Grade_item should now extrapolate its sortorder upon insertion if not set, by looking up the last sortorder in the table, and incrementing by 1. --- diff --git a/lib/dmllib.php b/lib/dmllib.php index 7a42dbd987..27b74cb296 100644 --- a/lib/dmllib.php +++ b/lib/dmllib.php @@ -1633,6 +1633,22 @@ function sql_ilike() { } +/** + * Returns the proper SQL to do MAX + * + * @uses $CFG + * @param string $field + * @return string + */ +function sql_max($field) { + global $CFG; + + switch ($CFG->dbfamily) { + default: + return "MAX($field)"; + } +} + /** * Returns the proper SQL (for the dbms in use) to concatenate $firstname and $lastname * diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 1711b7ef96..99f7f0dd09 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -793,5 +793,14 @@ class grade_category extends grade_object { return true; } } + + /** + * Returns the most descriptive field for this object. This is a standard method used + * when we do not know the exact type of an object. + * @return string name + */ + function get_name() { + return $this->fullname; + } } ?> diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 06e4aedd34..dd640450e3 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -459,6 +459,8 @@ class grade_item extends grade_object { * @return int ID of the new grade_item record. */ function insert() { + global $CFG; + // Retrieve scale and infer grademax from it if (!empty($this->scaleid)) { $this->load_scale(); @@ -467,7 +469,16 @@ class grade_item extends grade_object { $this->grademin = 0; $this->gradetype = GRADE_TYPE_SCALE; } - + + // If sortorder not given, extrapolate one + if (empty($this->sortorder)) { + $query = 'SELECT ' . sql_max('sortorder') . " FROM {$CFG->prefix}grade_items"; + $last_sortorder = execute_sql($query, false); + if (!empty($last_sortorder)) { + $this->sortorder = $last_sortorder + 1; + } + } + $result = parent::insert(); // Notify parent category of need to update. Note that a grade_item may not have a categoryid. @@ -894,5 +905,13 @@ class grade_item extends grade_object { return $this->sortorder; } + /** + * Returns the most descriptive field for this object. This is a standard method used + * when we do not know the exact type of an object. + * @return string name + */ + function get_name() { + return $this->itemname; + } } ?> diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php index 707351935f..6e90a0e8ff 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -120,5 +120,14 @@ class grade_outcome extends grade_object { return false; } } + + /** + * Returns the most descriptive field for this object. This is a standard method used + * when we do not know the exact type of an object. + * @return string name + */ + function get_name() { + return $this->shortname; + } } ?> diff --git a/lib/grade/grade_tree.php b/lib/grade/grade_tree.php index 5a26316945..5cee9d2764 100644 --- a/lib/grade/grade_tree.php +++ b/lib/grade/grade_tree.php @@ -346,7 +346,7 @@ class grade_tree { if (empty($this->first_sortorder)) { $this->reset_first_sortorder(); } - + // Locate the position of the source element in the tree $source = $this->locate_element($source_sortorder); @@ -372,6 +372,7 @@ class grade_tree { } reset($this->tree_array); $this->first_sortorder = key($this->tree_array); + return $this->first_sortorder; } @@ -554,8 +555,12 @@ class grade_tree { unset($topcats[$topcatid]); } } - + + $last_topsortorder = null; + foreach ($topcats as $topcatid => $topcat) { + $last_subsortorder = null; + // Check the fillers array, see if one must be inserted before this topcat if (key($fillers) < $topcat->sortorder) { $sortorder = key($fillers); @@ -568,7 +573,29 @@ class grade_tree { if (get_class($object) == 'grade_category') { $children = $object->get_children(1); unset($object->children); - $element['children'] = $children; + $last_itemsortorder = null; + $itemtree = array(); + + foreach ($children as $element) { + $finals = array(); + + if ($this->include_grades) { + $final = new grade_grades_final(); + $final->itemid = $element['object']->id; + $finals = $final->fetch_all_using_this(); + } + + $element['object']->previous_sortorder = $last_itemsortorder; + $itemtree[$element['object']->sortorder] = array('object' => $element['object'], 'finalgrades' => $finals); + + if (!empty($itemtree[$last_itemsortorder])) { + $itemtree[$last_itemsortorder]['object']->next_sortorder = $element['object']->sortorder; + } + + $last_itemsortorder = $element['object']->sortorder; + } + + $element['children'] = $itemtree; } elseif (get_class($object) == 'grade_item' && $this->include_grades) { $final_grades = $object->get_final(); unset($object->grade_grades_final); @@ -576,8 +603,15 @@ class grade_tree { } $object->sortorder = $sortorder; + $object->previous_sortorder = $last_topsortorder; $element['object'] = $object; $tree[$sortorder] = $element; + + if (!empty($tree[$last_topsortorder])) { + $tree[$last_topsortorder]['object']->next_sortorder = $sortorder; + } + + $last_topsortorder = $sortorder; } $query = "SELECT $category_table.*, sortorder FROM $category_table, $items_table @@ -592,6 +626,7 @@ class grade_tree { foreach ($subcats as $subcatid => $subcat) { $itemtree = array(); $items = get_records('grade_items', 'categoryid', $subcatid, 'sortorder'); + $last_itemsortorder = null; if (empty($items)) { continue; @@ -610,21 +645,42 @@ class grade_tree { $item = new grade_item($item); $item->sortorder = $sortorder; + $item->previous_sortorder = $last_itemsortorder; $itemtree[$item->sortorder] = array('object' => $item, 'finalgrades' => $finals); + + if (!empty($itemtree[$last_itemsortorder])) { + $itemtree[$last_itemsortorder]['object']->next_sortorder = $item->sortorder; + } + + $last_itemsortorder = $item->sortorder; } $sortorder = $subcat->sortorder; $subcat = new grade_category($subcat, false); $subcat->sortorder = $sortorder; + $subcat->previous_sortorder = $last_subsortorder; $subcattree[$subcat->sortorder] = array('object' => $subcat, 'children' => $itemtree); + + if (!empty($subcattree[$last_subsortorder])) { + $subcattree[$last_subsortorder]['object']->next_sortorder = $subcat->sortorder; + } + + $last_subsortorder = $subcat->sortorder; } $sortorder = $topcat->sortorder; $topcat = new grade_category($topcat, false); $topcat->sortorder = $sortorder; - + + $topcat->previous_sortorder = $last_topsortorder; $tree[$topcat->sortorder] = array('object' => $topcat, 'children' => $subcattree); $this->tree_filled[$topcat->sortorder] = array('object' => $topcat, 'children' => $subcattree); + + if (!empty($topcattree[$last_topsortorder])) { + $topcattree[$last_topsortorder]['object']->next_sortorder = $topcat->sortorder; + } + + $last_topsortorder = $topcat->sortorder; } // If there are still grade_items or grade_categories without a top category, add another filler @@ -635,7 +691,29 @@ class grade_tree { if (get_class($object) == 'grade_category') { $children = $object->get_children(1); unset($object->children); - $element['children'] = $children; + $last_itemsortorder = null; + $itemtree = array(); + + foreach ($children as $element) { + $finals = array(); + + if ($this->include_grades) { + $final = new grade_grades_final(); + $final->itemid = $element['object']->id; + $finals = $final->fetch_all_using_this(); + } + + $element['object']->previous_sortorder = $last_itemsortorder; + $itemtree[$element['object']->sortorder] = array('object' => $element['object'], 'finalgrades' => $finals); + + if (!empty($itemtree[$last_itemsortorder])) { + $itemtree[$last_itemsortorder]['object']->next_sortorder = $element['object']->sortorder; + } + + $last_itemsortorder = $element['object']->sortorder; + } + + $element['children'] = $itemtree; } elseif (get_class($object) == 'grade_item' && $this->include_grades) { $final_grades = $object->get_final(); unset($object->grade_grades_final); @@ -643,8 +721,15 @@ class grade_tree { } $object->sortorder = $sortorder; + $object->previous_sortorder = $last_topsortorder; $element['object'] = $object; $tree[$sortorder] = $element; + + if (!empty($tree[$last_topsortorder])) { + $tree[$last_topsortorder]['object']->next_sortorder = $sortorder; + } + + $last_topsortorder = $sortorder; } } @@ -829,4 +914,77 @@ class grade_tree { $this->need_update = array(); } + + /** + * Returns a HTML list with sorting arrows and insert boxes. This is a recursive method. + * @return string HTML code + */ + function get_edit_tree($level=1, $elements=null) { + if (empty($this->tree_array)) { + return null; + } else { + global $USER; + global $CFG; + + $strmoveup = get_string("moveup"); + $strmovedown = get_string("movedown"); + + if (empty($elements)) { + $list = '