|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00003 // This file is part of Moodle - http://moodle.org/ 00004 // 00005 // Moodle is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // Moodle is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU General Public License 00016 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00017 00018 class grade_edit_tree { 00019 public $columns = array(); 00020 00024 public $gtree; 00025 00029 public $gpr; 00030 00034 public $moving; 00035 00036 public $deepest_level; 00037 00038 public $uses_extra_credit = false; 00039 00040 public $uses_weight = false; 00041 00042 public $table; 00043 00044 public $categories = array(); 00048 public function __construct($gtree, $moving=false, $gpr) { 00049 global $USER, $OUTPUT, $COURSE; 00050 00051 $this->gtree = $gtree; 00052 $this->moving = $moving; 00053 $this->gpr = $gpr; 00054 $this->deepest_level = $this->get_deepest_level($this->gtree->top_element); 00055 00056 $this->columns = array(grade_edit_tree_column::factory('name', array('deepest_level' => $this->deepest_level)), 00057 grade_edit_tree_column::factory('aggregation', array('flag' => true))); 00058 00059 if ($this->uses_weight) { 00060 $this->columns[] = grade_edit_tree_column::factory('weight', array('adv' => 'aggregationcoef')); 00061 } 00062 if ($this->uses_extra_credit) { 00063 $this->columns[] = grade_edit_tree_column::factory('extracredit', array('adv' => 'aggregationcoef')); 00064 } 00065 00066 $this->columns[] = grade_edit_tree_column::factory('range'); // This is not a setting... How do we deal with it? 00067 $this->columns[] = grade_edit_tree_column::factory('aggregateonlygraded', array('flag' => true)); 00068 $this->columns[] = grade_edit_tree_column::factory('aggregatesubcats', array('flag' => true)); 00069 $this->columns[] = grade_edit_tree_column::factory('aggregateoutcomes', array('flag' => true)); 00070 $this->columns[] = grade_edit_tree_column::factory('droplow', array('flag' => true)); 00071 $this->columns[] = grade_edit_tree_column::factory('keephigh', array('flag' => true)); 00072 $this->columns[] = grade_edit_tree_column::factory('multfactor', array('adv' => true)); 00073 $this->columns[] = grade_edit_tree_column::factory('plusfactor', array('adv' => true)); 00074 $this->columns[] = grade_edit_tree_column::factory('actions'); 00075 $this->columns[] = grade_edit_tree_column::factory('select'); 00076 00077 $mode = ($USER->gradeediting[$COURSE->id]) ? 'advanced' : 'simple'; 00078 00079 $widthstyle = ''; 00080 if ($mode == 'simple') { 00081 $widthstyle = ' style="width:auto;" '; 00082 } 00083 00084 $this->table = new html_table(); 00085 $this->table->id = "grade_edit_tree_table"; 00086 $this->table->cellpadding = 5; 00087 $this->table->attributes['class'] = 'generaltable ' . $mode; 00088 $this->table->style = $widthstyle; 00089 00090 foreach ($this->columns as $column) { 00091 if (!($this->moving && $column->hide_when_moving) && !$column->is_hidden($mode)) { 00092 $this->table->head[] = $column->get_header_cell(); 00093 } 00094 } 00095 00096 $rowcount = 0; 00097 $this->table->data = $this->build_html_tree($this->gtree->top_element, true, array(), 0, $rowcount); 00098 } 00099 00110 public function build_html_tree($element, $totals, $parents, $level, &$row_count) { 00111 global $CFG, $COURSE, $USER, $OUTPUT; 00112 00113 $object = $element['object']; 00114 $eid = $element['eid']; 00115 $object->name = $this->gtree->get_element_header($element, true, true, false); 00116 $object->stripped_name = $this->gtree->get_element_header($element, false, false, false); 00117 00118 $is_category_item = false; 00119 if ($element['type'] == 'categoryitem' || $element['type'] == 'courseitem') { 00120 $is_category_item = true; 00121 } 00122 00123 $rowclasses = array(); 00124 foreach ($parents as $parent_eid) { 00125 $rowclasses[] = $parent_eid; 00126 } 00127 00128 $actions = ''; 00129 00130 if (!$is_category_item) { 00131 $actions .= $this->gtree->get_edit_icon($element, $this->gpr); 00132 } 00133 00134 $actions .= $this->gtree->get_calculation_icon($element, $this->gpr); 00135 00136 if ($element['type'] == 'item' or ($element['type'] == 'category' and $element['depth'] > 1)) { 00137 if ($this->element_deletable($element)) { 00138 $aurl = new moodle_url('index.php', array('id' => $COURSE->id, 'action' => 'delete', 'eid' => $eid, 'sesskey' => sesskey())); 00139 $actions .= $OUTPUT->action_icon($aurl, new pix_icon('t/delete', get_string('delete'))); 00140 } 00141 00142 $aurl = new moodle_url('index.php', array('id' => $COURSE->id, 'action' => 'moveselect', 'eid' => $eid, 'sesskey' => sesskey())); 00143 $actions .= $OUTPUT->action_icon($aurl, new pix_icon('t/move', get_string('move'))); 00144 } 00145 00146 $actions .= $this->gtree->get_hiding_icon($element, $this->gpr); 00147 $actions .= $this->gtree->get_locking_icon($element, $this->gpr); 00148 00149 $mode = ($USER->gradeediting[$COURSE->id]) ? 'advanced' : 'simple'; 00150 00151 $returnrows = array(); 00152 $root = false; 00153 00154 $id = required_param('id', PARAM_INT); 00155 00157 $last = ''; 00158 00160 if ($this->moving == $eid) { 00161 // do not diplay children 00162 $cell = new html_table_cell(); 00163 $cell->colspan = 12; 00164 $cell->attributes['class'] = $element['type'] . ' moving'; 00165 $cell->text = $object->name.' ('.get_string('move').')'; 00166 return array(new html_table_row(array($cell))); 00167 } 00168 00169 if ($element['type'] == 'category') { 00170 $level++; 00171 $this->categories[$object->id] = $object->stripped_name; 00172 $category = grade_category::fetch(array('id' => $object->id)); 00173 $item = $category->get_grade_item(); 00174 00175 // Add aggregation coef input if not a course item and if parent category has correct aggregation type 00176 $dimmed = ($item->is_hidden()) ? 'dimmed' : ''; 00177 00178 // Before we print the category's row, we must find out how many rows will appear below it (for the filler cell's rowspan) 00179 $aggregation_position = grade_get_setting($COURSE->id, 'aggregationposition', $CFG->grade_aggregationposition); 00180 $category_total_data = null; // Used if aggregationposition is set to "last", so we can print it last 00181 00182 $html_children = array(); 00183 00184 $row_count = 0; 00185 00186 foreach($element['children'] as $child_el) { 00187 $moveto = null; 00188 00189 if (empty($child_el['object']->itemtype)) { 00190 $child_el['object']->itemtype = false; 00191 } 00192 00193 if (($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category') && !$totals) { 00194 continue; 00195 } 00196 00197 $child_eid = $child_el['eid']; 00198 $first = ''; 00199 00200 if ($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category') { 00201 $first = array('first' => 1); 00202 $child_eid = $eid; 00203 } 00204 00205 if ($this->moving && $this->moving != $child_eid) { 00206 00207 $strmove = get_string('move'); 00208 $strmovehere = get_string('movehere'); 00209 $actions = ''; // no action icons when moving 00210 00211 $aurl = new moodle_url('index.php', array('id' => $COURSE->id, 'action' => 'move', 'eid' => $this->moving, 'moveafter' => $child_eid, 'sesskey' => sesskey())); 00212 if ($first) { 00213 $aurl->params($first); 00214 } 00215 00216 $cell = new html_table_cell(); 00217 $cell->colspan = 12; 00218 00219 $icon = new pix_icon('movehere', $strmovehere, null, array('class'=>'movetarget')); 00220 $cell->text = $OUTPUT->action_icon($aurl, $icon); 00221 00222 $moveto = new html_table_row(array($cell)); 00223 } 00224 00225 $newparents = $parents; 00226 $newparents[] = $eid; 00227 00228 $row_count++; 00229 $child_row_count = 0; 00230 00231 // If moving, do not print course and category totals, but still print the moveto target box 00232 if ($this->moving && ($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category')) { 00233 $html_children[] = $moveto; 00234 } elseif ($child_el['object']->itemtype == 'course' || $child_el['object']->itemtype == 'category') { 00235 // We don't build the item yet because we first need to know the deepest level of categories (for category/name colspans) 00236 $category_total_item = $this->build_html_tree($child_el, $totals, $newparents, $level, $child_row_count); 00237 if (!$aggregation_position) { 00238 $html_children = array_merge($html_children, $category_total_item); 00239 } 00240 } else { 00241 $html_children = array_merge($html_children, $this->build_html_tree($child_el, $totals, $newparents, $level, $child_row_count)); 00242 if (!empty($moveto)) { 00243 $html_children[] = $moveto; 00244 } 00245 00246 if ($this->moving) { 00247 $row_count++; 00248 } 00249 } 00250 00251 $row_count += $child_row_count; 00252 00253 // If the child is a category, increment row_count by one more (for the extra coloured row) 00254 if ($child_el['type'] == 'category') { 00255 $row_count++; 00256 } 00257 } 00258 00259 // Print category total at the end if aggregation position is "last" (1) 00260 if (!empty($category_total_item) && $aggregation_position) { 00261 $html_children = array_merge($html_children, $category_total_item); 00262 } 00263 00264 // Determine if we are at the root 00265 if (isset($element['object']->grade_item) && $element['object']->grade_item->is_course_item()) { 00266 $root = true; 00267 } 00268 00269 $row_count_offset = 0; 00270 00271 if (empty($category_total_item) && !$this->moving) { 00272 $row_count_offset = -1; 00273 } 00274 00275 $levelclass = "level$level"; 00276 00277 $courseclass = ''; 00278 if ($level == 1) { 00279 $courseclass = 'coursecategory'; 00280 } 00281 00282 $row = new html_table_row(); 00283 $row->attributes['class'] = $courseclass . ' category ' . $dimmed; 00284 foreach ($rowclasses as $class) { 00285 $row->attributes['class'] .= ' ' . $class; 00286 } 00287 00288 $headercell = new html_table_cell(); 00289 $headercell->header = true; 00290 $headercell->scope = 'row'; 00291 $headercell->attributes['title'] = $object->stripped_name; 00292 $headercell->attributes['class'] = 'cell rowspan ' . $levelclass; 00293 $headercell->rowspan = $row_count+1+$row_count_offset; 00294 $row->cells[] = $headercell; 00295 00296 foreach ($this->columns as $column) { 00297 if (!($this->moving && $column->hide_when_moving) && !$column->is_hidden($mode)) { 00298 $row->cells[] = $column->get_category_cell($category, $levelclass, array('id' => $id, 'name' => $object->name, 'level' => $level, 'actions' => $actions, 'eid' => $eid)); 00299 } 00300 } 00301 00302 $returnrows[] = $row; 00303 00304 $returnrows = array_merge($returnrows, $html_children); 00305 00306 // Print a coloured row to show the end of the category across the table 00307 $endcell = new html_table_cell(); 00308 $endcell->colspan = (19 - $level); 00309 $endcell->attributes['class'] = 'colspan ' . $levelclass; 00310 00311 $returnrows[] = new html_table_row(array($endcell));; 00312 00313 } else { // Dealing with a grade item 00314 00315 $item = grade_item::fetch(array('id' => $object->id)); 00316 $element['type'] = 'item'; 00317 $element['object'] = $item; 00318 00319 $categoryitemclass = ''; 00320 if ($item->itemtype == 'category') { 00321 $categoryitemclass = 'categoryitem'; 00322 } 00323 00324 $dimmed = ($item->is_hidden()) ? "dimmed_text" : ""; 00325 $gradeitemrow = new html_table_row(); 00326 $gradeitemrow->attributes['class'] = $categoryitemclass . ' item ' . $dimmed; 00327 foreach ($rowclasses as $class) { 00328 $gradeitemrow->attributes['class'] .= ' ' . $class; 00329 } 00330 00331 foreach ($this->columns as $column) { 00332 if (!($this->moving && $column->hide_when_moving) && !$column->is_hidden($mode)) { 00333 $gradeitemrow->cells[] = $column->get_item_cell($item, array('id' => $id, 'name' => $object->name, 'level' => $level, 'actions' => $actions, 00334 'element' => $element, 'eid' => $eid, 'itemtype' => $object->itemtype)); 00335 } 00336 } 00337 00338 $returnrows[] = $gradeitemrow; 00339 } 00340 00341 return $returnrows; 00342 00343 } 00344 00351 function get_weight_input($item, $type) { 00352 global $OUTPUT; 00353 00354 if (!is_object($item) || get_class($item) !== 'grade_item') { 00355 throw new Exception('grade_edit_tree::get_weight_input($item) was given a variable that is not of the required type (grade_item object)'); 00356 return false; 00357 } 00358 00359 if ($item->is_course_item()) { 00360 return ''; 00361 } 00362 00363 $parent_category = $item->get_parent_category(); 00364 $parent_category->apply_forced_settings(); 00365 $aggcoef = $item->get_coefstring(); 00366 00367 if ((($aggcoef == 'aggregationcoefweight' || $aggcoef == 'aggregationcoef') && $type == 'weight') || 00368 ($aggcoef == 'aggregationcoefextraweight' && $type == 'extra')) { 00369 return '<input type="text" size="6" id="aggregationcoef_'.$item->id.'" name="aggregationcoef_'.$item->id.'" 00370 value="'.grade_edit_tree::format_number($item->aggregationcoef).'" />'; 00371 } elseif ($aggcoef == 'aggregationcoefextrasum' && $type == 'extra') { 00372 $checked = ($item->aggregationcoef > 0) ? 'checked="checked"' : ''; 00373 return '<input type="hidden" name="extracredit_'.$item->id.'" value="0" /> 00374 <input type="checkbox" id="extracredit_'.$item->id.'" name="extracredit_'.$item->id.'" value="1" '."$checked />\n"; 00375 } else { 00376 return ''; 00377 } 00378 } 00379 00380 //Trims trailing zeros 00381 //Used on the 'categories and items' page for grade items settings like aggregation co-efficient 00382 //Grader report has its own decimal place settings so they are handled elsewhere 00383 function format_number($number) { 00384 $formatted = rtrim(format_float($number, 4),'0'); 00385 if (substr($formatted, -1)=='.') { //if last char is the decimal point 00386 $formatted .= '0'; 00387 } 00388 return $formatted; 00389 } 00390 00397 function element_deletable($element) { 00398 global $COURSE; 00399 00400 if ($element['type'] != 'item') { 00401 return true; 00402 } 00403 00404 $grade_item = $element['object']; 00405 00406 if ($grade_item->itemtype != 'mod' or $grade_item->is_outcome_item() or $grade_item->gradetype == GRADE_TYPE_NONE) { 00407 return true; 00408 } 00409 00410 $modinfo = get_fast_modinfo($COURSE); 00411 if (!isset($modinfo->instances[$grade_item->itemmodule][$grade_item->iteminstance])) { 00412 // module does not exist 00413 return true; 00414 } 00415 00416 return false; 00417 } 00418 00427 function move_elements($eids, $returnurl) { 00428 $moveafter = required_param('moveafter', PARAM_INT); 00429 00430 if (!is_array($eids)) { 00431 $eids = array($eids); 00432 } 00433 00434 if(!$after_el = $this->gtree->locate_element("c$moveafter")) { 00435 print_error('invalidelementid', '', $returnurl); 00436 } 00437 00438 $after = $after_el['object']; 00439 $parent = $after; 00440 $sortorder = $after->get_sortorder(); 00441 00442 foreach ($eids as $eid) { 00443 if (!$element = $this->gtree->locate_element($eid)) { 00444 print_error('invalidelementid', '', $returnurl); 00445 } 00446 $object = $element['object']; 00447 00448 $object->set_parent($parent->id); 00449 $object->move_after_sortorder($sortorder); 00450 $sortorder++; 00451 } 00452 00453 redirect($returnurl, '', 0); 00454 } 00455 00466 function get_deepest_level($element, $level=0, $deepest_level=1) { 00467 $object = $element['object']; 00468 00469 $level++; 00470 $coefstring = $element['object']->get_coefstring(); 00471 if ($element['type'] == 'category') { 00472 if ($coefstring == 'aggregationcoefweight') { 00473 $this->uses_weight = true; 00474 } elseif ($coefstring == 'aggregationcoefextraweight' || $coefstring == 'aggregationcoefextrasum') { 00475 $this->uses_extra_credit = true; 00476 } 00477 00478 foreach($element['children'] as $child_el) { 00479 if ($level > $deepest_level) { 00480 $deepest_level = $level; 00481 } 00482 $deepest_level = $this->get_deepest_level($child_el, $level, $deepest_level); 00483 } 00484 } 00485 00486 return $deepest_level; 00487 } 00488 } 00489 00490 abstract class grade_edit_tree_column { 00491 public $forced; 00492 public $hidden; 00493 public $forced_hidden; 00494 public $advanced_hidden; 00495 public $hide_when_moving = true; 00501 public $headercell; 00507 public $categorycell; 00513 public $itemcell; 00514 00515 public static function factory($name, $params=array()) { 00516 $class_name = "grade_edit_tree_column_$name"; 00517 if (class_exists($class_name)) { 00518 return new $class_name($params); 00519 } 00520 } 00521 00522 public abstract function get_header_cell(); 00523 00524 public abstract function get_category_cell($category, $levelclass, $params); 00525 00526 public abstract function get_item_cell($item, $params); 00527 00528 public abstract function is_hidden($mode='simple'); 00529 00530 public function __construct() { 00531 $this->headercell = new html_table_cell(); 00532 $this->headercell->header = true; 00533 $this->headercell->style = 'whitespace: normal;'; 00534 $this->headercell->attributes['class'] = 'header'; 00535 00536 $this->categorycell = new html_table_cell(); 00537 $this->categorycell->attributes['class'] = 'cell'; 00538 00539 $this->itemcell = new html_table_cell(); 00540 $this->itemcell->attributes['class'] = 'cell'; 00541 } 00542 } 00543 00544 abstract class grade_edit_tree_column_category extends grade_edit_tree_column { 00545 00546 public $forced; 00547 public $advanced; 00548 00549 public function __construct($name) { 00550 global $CFG; 00551 $this->forced = (int)$CFG->{"grade_$name"."_flag"} & 1; 00552 $this->advanced = (int)$CFG->{"grade_$name"."_flag"} & 2; 00553 parent::__construct(); 00554 } 00555 00556 public function is_hidden($mode='simple') { 00557 global $CFG; 00558 if ($mode == 'simple') { 00559 return $this->advanced; 00560 } elseif ($mode == 'advanced') { 00561 if ($this->forced && $CFG->grade_hideforcedsettings) { 00562 return true; 00563 } else { 00564 return false; 00565 } 00566 } 00567 } 00568 } 00569 00570 class grade_edit_tree_column_name extends grade_edit_tree_column { 00571 public $forced = false; 00572 public $hidden = false; 00573 public $forced_hidden = false; 00574 public $advanced_hidden = false; 00575 public $deepest_level = 1; 00576 public $hide_when_moving = false; 00577 00578 public function __construct($params) { 00579 if (empty($params['deepest_level'])) { 00580 throw new Exception('Tried to instantiate a grade_edit_tree_column_name object without the "deepest_level" param!'); 00581 } 00582 00583 $this->deepest_level = $params['deepest_level']; 00584 parent::__construct(); 00585 } 00586 00587 public function get_header_cell() { 00588 $headercell = clone($this->headercell); 00589 $headercell->attributes['class'] .= ' name'; 00590 $headercell->colspan = $this->deepest_level + 1; 00591 $headercell->text = get_string('name'); 00592 return $headercell; 00593 } 00594 00595 public function get_category_cell($category, $levelclass, $params) { 00596 global $OUTPUT; 00597 if (empty($params['name']) || empty($params['level'])) { 00598 throw new Exception('Array key (name or level) missing from 3rd param of grade_edit_tree_column_name::get_category_cell($category, $levelclass, $params)'); 00599 } 00600 $categorycell = clone($this->categorycell); 00601 $categorycell->attributes['class'] .= ' name ' . $levelclass; 00602 $categorycell->colspan = ($this->deepest_level +1) - $params['level']; 00603 $categorycell->text = $OUTPUT->heading($params['name'], 4); 00604 return $categorycell; 00605 } 00606 00607 public function get_item_cell($item, $params) { 00608 global $CFG; 00609 00610 if (empty($params['element']) || empty($params['name']) || empty($params['level'])) { 00611 throw new Exception('Array key (name, level or element) missing from 2nd param of grade_edit_tree_column_name::get_item_cell($item, $params)'); 00612 } 00613 00614 $name = $params['name']; 00615 00616 $itemcell = clone($this->itemcell); 00617 $itemcell->attributes['class'] .= ' name'; 00618 $itemcell->colspan = ($this->deepest_level + 1) - $params['level']; 00619 $itemcell->text = $name; 00620 return $itemcell; 00621 } 00622 00623 public function is_hidden($mode='simple') { 00624 return false; 00625 } 00626 } 00627 00628 class grade_edit_tree_column_aggregation extends grade_edit_tree_column_category { 00629 00630 public function __construct($params) { 00631 parent::__construct('aggregation'); 00632 } 00633 00634 public function get_header_cell() { 00635 global $OUTPUT; 00636 $headercell = clone($this->headercell); 00637 $headercell->text = get_string('aggregation', 'grades').$OUTPUT->help_icon('aggregation', 'grades'); 00638 return $headercell; 00639 } 00640 00641 public function get_category_cell($category, $levelclass, $params) { 00642 global $CFG, $OUTPUT; 00643 if (empty($params['id'])) { 00644 throw new Exception('Array key (id) missing from 3rd param of grade_edit_tree_column_aggregation::get_category_cell($category, $levelclass, $params)'); 00645 } 00646 00647 $options = array(GRADE_AGGREGATE_MEAN => get_string('aggregatemean', 'grades'), 00648 GRADE_AGGREGATE_WEIGHTED_MEAN => get_string('aggregateweightedmean', 'grades'), 00649 GRADE_AGGREGATE_WEIGHTED_MEAN2 => get_string('aggregateweightedmean2', 'grades'), 00650 GRADE_AGGREGATE_EXTRACREDIT_MEAN => get_string('aggregateextracreditmean', 'grades'), 00651 GRADE_AGGREGATE_MEDIAN => get_string('aggregatemedian', 'grades'), 00652 GRADE_AGGREGATE_MIN => get_string('aggregatemin', 'grades'), 00653 GRADE_AGGREGATE_MAX => get_string('aggregatemax', 'grades'), 00654 GRADE_AGGREGATE_MODE => get_string('aggregatemode', 'grades'), 00655 GRADE_AGGREGATE_SUM => get_string('aggregatesum', 'grades')); 00656 00657 $visible = explode(',', $CFG->grade_aggregations_visible); 00658 foreach ($options as $constant => $string) { 00659 if (!in_array($constant, $visible) && $constant != $category->aggregation) { 00660 unset($options[$constant]); 00661 } 00662 } 00663 00664 if ($this->forced) { 00665 $aggregation = $options[$category->aggregation]; 00666 } else { 00667 $attributes = array(); 00668 $attributes['id'] = 'aggregation_'.$category->id; 00669 $aggregation = html_writer::select($options, 'aggregation_'.$category->id, $category->aggregation, null, $attributes); 00670 $action = new component_action('change', 'update_category_aggregation', array('courseid' => $params['id'], 'category' => $category->id, 'sesskey' => sesskey())); 00671 $OUTPUT->add_action_handler($action, 'aggregation_'.$category->id); 00672 } 00673 00674 $categorycell = clone($this->categorycell); 00675 $categorycell->attributes['class'] .= ' ' . $levelclass; 00676 $categorycell->text = $aggregation; 00677 return $categorycell; 00678 00679 } 00680 00681 public function get_item_cell($item, $params) { 00682 $itemcell = clone($this->itemcell); 00683 $itemcell->text = ' - '; 00684 return $itemcell; 00685 } 00686 } 00687 00688 class grade_edit_tree_column_extracredit extends grade_edit_tree_column { 00689 00690 public function get_header_cell() { 00691 global $OUTPUT; 00692 $headercell = clone($this->headercell); 00693 $headercell->text = get_string('aggregationcoefextra', 'grades').$OUTPUT->help_icon('aggregationcoefextra', 'grades'); 00694 return $headercell; 00695 } 00696 00697 public function get_category_cell($category, $levelclass, $params) { 00698 $item = $category->get_grade_item(); 00699 $categorycell = clone($this->categorycell); 00700 $categorycell->attributes['class'] .= ' ' . $levelclass; 00701 $categorycell->text = grade_edit_tree::get_weight_input($item, 'extra'); 00702 return $categorycell; 00703 } 00704 00705 public function get_item_cell($item, $params) { 00706 if (empty($params['element'])) { 00707 throw new Exception('Array key (element) missing from 2nd param of grade_edit_tree_column_weightorextracredit::get_item_cell($item, $params)'); 00708 } 00709 00710 $itemcell = clone($this->itemcell); 00711 $itemcell->text = ' '; 00712 00713 if (!in_array($params['element']['object']->itemtype, array('courseitem', 'categoryitem', 'category'))) { 00714 $itemcell->text = grade_edit_tree::get_weight_input($item, 'extra'); 00715 } 00716 00717 return $itemcell; 00718 } 00719 00720 public function is_hidden($mode='simple') { 00721 global $CFG; 00722 if ($mode == 'simple') { 00723 return strstr($CFG->grade_item_advanced, 'aggregationcoef'); 00724 } elseif ($mode == 'advanced') { 00725 return false; 00726 } 00727 } 00728 } 00729 00730 class grade_edit_tree_column_weight extends grade_edit_tree_column { 00731 00732 public function get_header_cell() { 00733 global $OUTPUT; 00734 $headercell = clone($this->headercell); 00735 $headercell->text = get_string('weightuc', 'grades').$OUTPUT->help_icon('aggregationcoefweight', 'grades'); 00736 return $headercell; 00737 } 00738 00739 public function get_category_cell($category, $levelclass, $params) { 00740 00741 $item = $category->get_grade_item(); 00742 $categorycell = clone($this->categorycell); 00743 $categorycell->attributes['class'] .= ' ' . $levelclass; 00744 $categorycell->text = grade_edit_tree::get_weight_input($item, 'weight'); 00745 return $categorycell; 00746 } 00747 00748 public function get_item_cell($item, $params) { 00749 if (empty($params['element'])) { 00750 throw new Exception('Array key (element) missing from 2nd param of grade_edit_tree_column_weightorextracredit::get_item_cell($item, $params)'); 00751 } 00752 $itemcell = clone($this->itemcell); 00753 $itemcell->text = ' '; 00754 00755 if (!in_array($params['element']['object']->itemtype, array('courseitem', 'categoryitem', 'category'))) { 00756 $itemcell->text = grade_edit_tree::get_weight_input($item, 'weight'); 00757 } 00758 00759 return $itemcell; 00760 } 00761 00762 public function is_hidden($mode='simple') { 00763 global $CFG; 00764 if ($mode == 'simple') { 00765 return strstr($CFG->grade_item_advanced, 'aggregationcoef'); 00766 } elseif ($mode == 'advanced') { 00767 return false; 00768 } 00769 } 00770 } 00771 00772 class grade_edit_tree_column_range extends grade_edit_tree_column { 00773 00774 public function get_header_cell() { 00775 $headercell = clone($this->headercell); 00776 $headercell->text = get_string('maxgrade', 'grades'); 00777 return $headercell; 00778 } 00779 00780 public function get_category_cell($category, $levelclass, $params) { 00781 $categorycell = clone($this->categorycell); 00782 $categorycell->attributes['class'] .= ' range ' . $levelclass; 00783 $categorycell->text = ' - '; 00784 return $categorycell; 00785 } 00786 00787 public function get_item_cell($item, $params) { 00788 global $DB, $OUTPUT; 00789 00790 // If the parent aggregation is Sum of Grades, this cannot be changed 00791 $parent_cat = $item->get_parent_category(); 00792 if ($parent_cat->aggregation == GRADE_AGGREGATE_SUM) { 00793 $grademax = format_float($item->grademax, $item->get_decimals()); 00794 } elseif ($item->gradetype == GRADE_TYPE_SCALE) { 00795 $scale = $DB->get_record('scale', array('id' => $item->scaleid)); 00796 $scale_items = null; 00797 if (empty($scale)) { //if the item is using a scale that's been removed 00798 $scale_items = array(); 00799 } else { 00800 $scale_items = explode(',', $scale->scale); 00801 } 00802 $grademax = end($scale_items) . ' (' . count($scale_items) . ')'; 00803 } elseif ($item->is_external_item()) { 00804 $grademax = format_float($item->grademax, $item->get_decimals()); 00805 } else { 00806 $grademax = '<input type="text" size="6" id="grademax'.$item->id.'" name="grademax_'.$item->id.'" value="'.format_float($item->grademax, $item->get_decimals()).'" />'; 00807 } 00808 00809 $itemcell = clone($this->itemcell); 00810 $itemcell->text = $grademax; 00811 return $itemcell; 00812 } 00813 00814 public function is_hidden($mode='simple') { 00815 global $CFG; 00816 if ($mode == 'simple') { 00817 return strstr($CFG->grade_item_advanced, 'grademax'); 00818 } elseif ($mode == 'advanced') { 00819 return false; 00820 } 00821 } 00822 } 00823 00824 class grade_edit_tree_column_aggregateonlygraded extends grade_edit_tree_column_category { 00825 00826 public function __construct($params) { 00827 parent::__construct('aggregateonlygraded'); 00828 } 00829 00830 public function get_header_cell() { 00831 global $OUTPUT; 00832 $headercell = clone($this->headercell); 00833 $headercell->style .= 'width: 40px;'; 00834 $headercell->text = get_string('aggregateonlygraded', 'grades') 00835 . $OUTPUT->help_icon('aggregateonlygraded', 'grades'); 00836 return $headercell; 00837 } 00838 00839 public function get_category_cell($category, $levelclass, $params) { 00840 $onlygradedcheck = ($category->aggregateonlygraded == 1) ? 'checked="checked"' : ''; 00841 $hidden = '<input type="hidden" name="aggregateonlygraded_'.$category->id.'" value="0" />'; 00842 $aggregateonlygraded ='<input type="checkbox" id="aggregateonlygraded_'.$category->id.'" name="aggregateonlygraded_'.$category->id.'" value="1" '.$onlygradedcheck . ' />'; 00843 00844 if ($this->forced) { 00845 $aggregateonlygraded = ($category->aggregateonlygraded) ? get_string('yes') : get_string('no'); 00846 } 00847 00848 $categorycell = clone($this->categorycell); 00849 $categorycell->attributes['class'] .= ' ' . $levelclass; 00850 $categorycell->text = $hidden.$aggregateonlygraded; 00851 return $categorycell; 00852 } 00853 00854 public function get_item_cell($item, $params) { 00855 $itemcell = clone($this->itemcell); 00856 $itemcell->text = ' - '; 00857 return $itemcell; 00858 } 00859 } 00860 00861 class grade_edit_tree_column_aggregatesubcats extends grade_edit_tree_column_category { 00862 00863 public function __construct($params) { 00864 parent::__construct('aggregatesubcats'); 00865 } 00866 00867 public function get_header_cell() { 00868 global $OUTPUT; 00869 $headercell = clone($this->headercell); 00870 $headercell->style .= 'width: 40px;'; 00871 $headercell->text = get_string('aggregatesubcats', 'grades') 00872 .$OUTPUT->help_icon('aggregatesubcats', 'grades'); 00873 return $headercell; 00874 } 00875 00876 public function get_category_cell($category, $levelclass, $params) { 00877 $subcatscheck = ($category->aggregatesubcats == 1) ? 'checked="checked"' : ''; 00878 $hidden = '<input type="hidden" name="aggregatesubcats_'.$category->id.'" value="0" />'; 00879 $aggregatesubcats = '<input type="checkbox" id="aggregatesubcats_'.$category->id.'" name="aggregatesubcats_'.$category->id.'" value="1" ' . $subcatscheck.' />'; 00880 00881 if ($this->forced) { 00882 $aggregatesubcats = ($category->aggregatesubcats) ? get_string('yes') : get_string('no'); 00883 } 00884 00885 $categorycell = clone($this->categorycell); 00886 $categorycell->attributes['class'] .= ' ' . $levelclass; 00887 $categorycell->text = $hidden.$aggregatesubcats; 00888 return $categorycell; 00889 00890 } 00891 00892 public function get_item_cell($item, $params) { 00893 $itemcell = clone($this->itemcell); 00894 $itemcell->text = ' - '; 00895 return $itemcell; 00896 } 00897 } 00898 00899 class grade_edit_tree_column_aggregateoutcomes extends grade_edit_tree_column_category { 00900 00901 public function __construct($params) { 00902 parent::__construct('aggregateoutcomes'); 00903 } 00904 00905 public function get_header_cell() { 00906 global $OUTPUT; 00907 $headercell = clone($this->headercell); 00908 $headercell->style .= 'width: 40px;'; 00909 $headercell->text = get_string('aggregateoutcomes', 'grades') 00910 .$OUTPUT->help_icon('aggregateoutcomes', 'grades'); 00911 return $headercell; 00912 } 00913 00914 public function get_category_cell($category, $levelclass, $params) { 00915 $outcomescheck = ($category->aggregateoutcomes == 1) ? 'checked="checked"' : ''; 00916 $hidden = '<input type="hidden" name="aggregateoutcomes_'.$category->id.'" value="0" />'; 00917 $aggregateoutcomes = '<input type="checkbox" id="aggregateoutcomes_'.$category->id.'" name="aggregateoutcomes_'.$category->id.'" value="1" ' . $outcomescheck.' />'; 00918 00919 if ($this->forced) { 00920 $aggregateoutcomes = ($category->aggregateoutcomes) ? get_string('yes') : get_string('no'); 00921 } 00922 00923 $categorycell = clone($this->categorycell); 00924 $categorycell->attributes['class'] .= ' ' . $levelclass; 00925 $categorycell->text = $hidden.$aggregateoutcomes; 00926 return $categorycell; 00927 } 00928 00929 public function get_item_cell($item, $params) { 00930 $itemcell = clone($this->itemcell); 00931 $itemcell->text = ' - '; 00932 return $itemcell; 00933 } 00934 00935 public function is_hidden($mode='simple') { 00936 global $CFG; 00937 if ($CFG->enableoutcomes) { 00938 return parent::is_hidden($mode); 00939 } else { 00940 return true; 00941 } 00942 } 00943 } 00944 00945 class grade_edit_tree_column_droplow extends grade_edit_tree_column_category { 00946 00947 public function __construct($params) { 00948 parent::__construct('droplow'); 00949 } 00950 00951 public function get_header_cell() { 00952 global $OUTPUT; 00953 $headercell = clone($this->headercell); 00954 $headercell->text = get_string('droplow', 'grades').$OUTPUT->help_icon('droplow', 'grades'); 00955 return $headercell; 00956 } 00957 00958 public function get_category_cell($category, $levelclass, $params) { 00959 $droplow = '<input type="text" size="3" id="droplow_'.$category->id.'" name="droplow_'.$category->id.'" value="'.$category->droplow.'" />'; 00960 00961 if ($this->forced) { 00962 $droplow = $category->droplow; 00963 } 00964 00965 $categorycell = clone($this->categorycell); 00966 $categorycell->attributes['class'] .= ' ' . $levelclass; 00967 $categorycell->text = $droplow; 00968 return $categorycell; 00969 } 00970 00971 public function get_item_cell($item, $params) { 00972 $itemcell = clone($this->itemcell); 00973 $itemcell->text = ' - '; 00974 return $itemcell; 00975 } 00976 } 00977 00978 class grade_edit_tree_column_keephigh extends grade_edit_tree_column_category { 00979 00980 public function __construct($params) { 00981 parent::__construct('keephigh'); 00982 } 00983 00984 public function get_header_cell() { 00985 global $OUTPUT; 00986 $headercell = clone($this->headercell); 00987 $headercell->text = get_string('keephigh', 'grades').$OUTPUT->help_icon('keephigh', 'grades'); 00988 return $headercell; 00989 } 00990 00991 public function get_category_cell($category, $levelclass, $params) { 00992 $keephigh = '<input type="text" size="3" id="keephigh_'.$category->id.'" name="keephigh_'.$category->id.'" value="'.$category->keephigh.'" />'; 00993 00994 if ($this->forced) { 00995 $keephigh = $category->keephigh; 00996 } 00997 00998 $categorycell = clone($this->categorycell); 00999 $categorycell->attributes['class'] .= ' ' . $levelclass; 01000 $categorycell->text = $keephigh; 01001 return $categorycell; 01002 } 01003 01004 public function get_item_cell($item, $params) { 01005 $itemcell = clone($this->itemcell); 01006 $itemcell->text = ' - '; 01007 return $itemcell; 01008 } 01009 } 01010 01011 class grade_edit_tree_column_multfactor extends grade_edit_tree_column { 01012 01013 public function __construct($params) { 01014 parent::__construct(); 01015 } 01016 01017 public function get_header_cell() { 01018 global $OUTPUT; 01019 $headercell = clone($this->headercell); 01020 $headercell->text = get_string('multfactor', 'grades').$OUTPUT->help_icon('multfactor', 'grades'); 01021 return $headercell; 01022 } 01023 01024 public function get_category_cell($category, $levelclass, $params) { 01025 $categorycell = clone($this->categorycell); 01026 $categorycell->attributes['class'] .= ' ' . $levelclass; 01027 $categorycell->text = ' - '; 01028 return $categorycell; 01029 } 01030 01031 public function get_item_cell($item, $params) { 01032 global $OUTPUT; 01033 01034 $itemcell = clone($this->itemcell); 01035 if (!$item->is_raw_used()) { 01036 $itemcell->text = ' '; 01037 return $itemcell; 01038 } 01039 01040 $multfactor = '<input type="text" size="4" id="multfactor'.$item->id.'" name="multfactor_'.$item->id.'" value="'.grade_edit_tree::format_number($item->multfactor).'" />'; 01041 01042 $itemcell->text = $multfactor; 01043 return $itemcell; 01044 } 01045 01046 public function is_hidden($mode='simple') { 01047 global $CFG; 01048 if ($mode == 'simple') { 01049 return strstr($CFG->grade_item_advanced, 'multfactor'); 01050 } elseif ($mode == 'advanced') { 01051 return false; 01052 } 01053 } 01054 } 01055 01056 class grade_edit_tree_column_plusfactor extends grade_edit_tree_column { 01057 01058 public function get_header_cell() { 01059 global $OUTPUT; 01060 $headercell = clone($this->headercell); 01061 $headercell->text = get_string('plusfactor', 'grades').$OUTPUT->help_icon('plusfactor', 'grades'); 01062 return $headercell; 01063 } 01064 01065 public function get_category_cell($category, $levelclass, $params) { 01066 $categorycell = clone($this->categorycell); 01067 $categorycell->attributes['class'] .= ' ' . $levelclass; 01068 $categorycell->text = ' - '; 01069 return $categorycell; 01070 01071 } 01072 01073 public function get_item_cell($item, $params) { 01074 global $OUTPUT; 01075 01076 $itemcell = clone($this->itemcell); 01077 if (!$item->is_raw_used()) { 01078 $itemcell->text = ' '; 01079 return $itemcell; 01080 } 01081 01082 $plusfactor = '<input type="text" size="4" id="plusfactor_'.$item->id.'" name="plusfactor_'.$item->id.'" value="'.grade_edit_tree::format_number($item->plusfactor).'" />'; 01083 01084 $itemcell->text = $plusfactor; 01085 return $itemcell; 01086 01087 } 01088 01089 public function is_hidden($mode='simple') { 01090 global $CFG; 01091 if ($mode == 'simple') { 01092 return strstr($CFG->grade_item_advanced, 'plusfactor'); 01093 } elseif ($mode == 'advanced') { 01094 return false; 01095 } 01096 } 01097 } 01098 01099 class grade_edit_tree_column_actions extends grade_edit_tree_column { 01100 01101 public function __construct($params) { 01102 parent::__construct(); 01103 } 01104 01105 public function get_header_cell() { 01106 $headercell = clone($this->headercell); 01107 $headercell->attributes['class'] .= ' actions'; 01108 $headercell->text = get_string('actions'); 01109 return $headercell; 01110 } 01111 01112 public function get_category_cell($category, $levelclass, $params) { 01113 01114 if (empty($params['actions'])) { 01115 throw new Exception('Array key (actions) missing from 3rd param of grade_edit_tree_column_actions::get_category_actions($category, $levelclass, $params)'); 01116 } 01117 01118 $categorycell = clone($this->categorycell); 01119 $categorycell->attributes['class'] .= ' ' . $levelclass; 01120 $categorycell->text = $params['actions']; 01121 return $categorycell; 01122 } 01123 01124 public function get_item_cell($item, $params) { 01125 if (empty($params['actions'])) { 01126 throw new Exception('Array key (actions) missing from 2nd param of grade_edit_tree_column_actions::get_item_cell($item, $params)'); 01127 } 01128 $itemcell = clone($this->itemcell); 01129 $itemcell->attributes['class'] .= ' actions'; 01130 $itemcell->text = $params['actions']; 01131 return $itemcell; 01132 } 01133 01134 public function is_hidden($mode='simple') { 01135 return false; 01136 } 01137 } 01138 01139 class grade_edit_tree_column_select extends grade_edit_tree_column { 01140 01141 public function get_header_cell() { 01142 $headercell = clone($this->headercell); 01143 $headercell->attributes['class'] .= ' selection'; 01144 $headercell->text = get_string('select'); 01145 return $headercell; 01146 } 01147 01148 public function get_category_cell($category, $levelclass, $params) { 01149 global $OUTPUT; 01150 if (empty($params['eid'])) { 01151 throw new Exception('Array key (eid) missing from 3rd param of grade_edit_tree_column_select::get_category_cell($category, $levelclass, $params)'); 01152 } 01153 $selectall = new action_link(new moodle_url('#'), get_string('all'), new component_action('click', 'togglecheckboxes', array('eid' => $params['eid'], 'check' => true))); 01154 $selectnone = new action_link(new moodle_url('#'), get_string('none'), new component_action('click', 'togglecheckboxes', array('eid' => $params['eid'], 'check' => false))); 01155 01156 $categorycell = clone($this->categorycell); 01157 $categorycell->attributes['class'] .= ' last ' . $levelclass; 01158 $categorycell->style .= 'text-align: center;'; 01159 $categorycell->text = $OUTPUT->render($selectall) . '<br />' . $OUTPUT->render($selectnone); 01160 return $categorycell; 01161 } 01162 01163 public function get_item_cell($item, $params) { 01164 if (empty($params['itemtype']) || empty($params['eid'])) { 01165 error('Array key (itemtype or eid) missing from 2nd param of grade_edit_tree_column_select::get_item_cell($item, $params)'); 01166 } 01167 $itemselect = ''; 01168 01169 if ($params['itemtype'] != 'course' && $params['itemtype'] != 'category') { 01170 $itemselect = '<input class="itemselect" type="checkbox" name="select_'.$params['eid'].'" onchange="toggleCategorySelector();"/>'; // TODO: convert to YUI handler 01171 } 01172 //html_writer::table() will wrap the item cell contents in a <TD> so don't do it here 01173 return $itemselect; 01174 } 01175 01176 public function is_hidden($mode='simple') { 01177 return false; 01178 } 01179 } 01180