Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/grade/edit/tree/lib.php
Go to the documentation of this file.
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 = '&nbsp;';
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 = '&nbsp;';
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 = '&nbsp;';
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 = '&nbsp;';
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 
 All Data Structures Namespaces Files Functions Variables Enumerations