]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-10364 improved calculation form
authorskodak <skodak>
Wed, 1 Aug 2007 21:48:10 +0000 (21:48 +0000)
committerskodak <skodak>
Wed, 1 Aug 2007 21:48:10 +0000 (21:48 +0000)
grade/edit/scale/edit_form.php
grade/edit/tree/calculation.php
grade/edit/tree/calculation_form.php
grade/edit/tree/index.php
grade/edit/tree/item_form.php
lang/en_utf8/grades.php
lib/grade/grade_item.php
lib/gradelib.php

index d617b187dd6c9053a36d5349b8088915c1dedbf8..8025415df295b4f2a6d32dfca012967ea3d65214 100644 (file)
@@ -81,17 +81,17 @@ class edit_scale_form extends moodleform {
 
 /// perform extra validation before submission
     function validation($data){
-        
+
         global $CFG;
-        
+
         $errors= array();
-        
+
         // we can not allow 2 scales with the same exact scale as this creates
         // problems for backup/restore
         $courseid = empty($data['courseid'])?0:$data['courseid'];
         if (count_records('scale', 'courseid', $courseid, 'scale', $data['scale'])) {
-            $errors['scale'] = get_string('duplicatescale', 'grades');  
-        }  
+            $errors['scale'] = get_string('duplicatescale', 'grades');
+        }
 
         $options = explode(',', $data['scale']);
         if (count($options) < 2) {
index 0edf689a3c835072081dd52bc3d80be97507f5c4..a3855dd252d7e34bcd4d3666b4fae01f97ae7b36 100644 (file)
@@ -34,11 +34,12 @@ $mform = new edit_calculation_form(null, array('gpr'=>$gpr));
 if ($mform->is_cancelled()) {
     redirect($returnurl);
 
-} else if (!$mform->is_submitted()) {
-    $calculation = grade_item::denormalize_formula($grade_item->calculation, $grade_item->courseid);
-    $mform->set_data(array('courseid'=>$grade_item->courseid, 'calculation'=>$calculation, 'id'=>$grade_item->id, 'itemname'=>$grade_item->itemname));
+}
+
+$calculation = grade_item::denormalize_formula($grade_item->calculation, $grade_item->courseid);
+$mform->set_data(array('courseid'=>$grade_item->courseid, 'calculation'=>$calculation, 'id'=>$grade_item->id, 'itemname'=>$grade_item->itemname));
 
-} else if ($data = $mform->get_data()) {
+if ($data = $mform->get_data()) {
     $grade_item->set_calculation($data->calculation);
     redirect($returnurl);
 }
index ae0e7fbe8b69ab39299ae15bd9d2f54351e86b1a..c98204e8b923abc19a2128eba631c938fc512966 100644 (file)
@@ -3,16 +3,46 @@
 require_once $CFG->libdir.'/formslib.php';
 
 class edit_calculation_form extends moodleform {
+    var $available;
+    var $noidnumbers;
+    var $showing;
+
     function definition() {
         global $COURSE;
 
         $mform =& $this->_form;
 
+        $this->available = grade_item::fetch_all(array('courseid'=>$COURSE->id));
+        $this->noidnumbers = array();
+        foreach ($this->available as $item) {
+            if (empty($item->idnumber)) {
+                $this->noidnumbers[$item->id] = $item;
+                unset($this->available[$item->id]);
+            }
+        }
+
 /// visible elements
         $mform->addElement('header', 'general', get_string('gradeitem', 'grades'));
 
         $mform->addElement('static', 'itemname', get_string('itemname', 'grades'));
-        $mform->addElement('text', 'calculation', get_string('calculation', 'grades'));
+        $mform->addElement('textarea', 'calculation', get_string('calculation', 'grades'), 'cols="60" rows="5"');
+
+/// idnumbers
+        $mform->addElement('header', 'availableheader', get_string('availableidnumbers', 'grades'));
+        foreach ($this->available as $item) {
+            $mform->addElement('static', 'idnumber_'.$item->id, $item->get_name());
+            $mform->setDefault('idnumber_'.$item->id, '[['.$item->idnumber.']]');
+        }
+
+
+/// set idnumbers
+        if ($this->noidnumbers) {
+            $mform->addElement('header', 'addidnumbersheader', get_string('addidnumbers', 'grades'));
+            foreach ($this->noidnumbers as $item) {
+                $mform->addElement('text', 'idnumber_'.$item->id, $item->get_name(), 'size="30"');
+            }
+        }
+
 
 /// hidden params
         $mform->addElement('hidden', 'id', 0);
@@ -21,22 +51,63 @@ class edit_calculation_form extends moodleform {
         $mform->addElement('hidden', 'courseid', 0);
         $mform->setType('courseid', PARAM_INT);
 
+        $mform->addElement('hidden', 'showingadding', 0);
+
+
 /// add return tracking info
         $gpr = $this->_customdata['gpr'];
         $gpr->add_mform_elements($mform);
 
 //-------------------------------------------------------------------------------
         // buttons
+        if ($this->noidnumbers) {
+            $mform->addElement('submit', 'addidnumbers', get_string('addidnumbers', 'grades'));
+            $mform->registerNoSubmitButton('addidnumbers');
+        }
         $this->add_action_buttons();
     }
 
+    function definition_after_data() {
+        global $CFG, $COURSE;
+
+        $mform =& $this->_form;
+
+        if ($this->noidnumbers) {
+            if (optional_param('addidnumbers', 0, PARAM_RAW)) {
+                $el =& $mform->getElement('showingadding');
+                $el->setValue(1);
+            }
+
+            $this->showing = $mform->getElementValue('showingadding');
+            if (!$this->showing) {
+                foreach ($this->noidnumbers as $item) {
+                    $mform->removeElement('idnumber_'.$item->id);
+                }
+                $mform->removeElement('addidnumbersheader');
+            } else {
+                $mform->removeElement('addidnumbers');
+            }
+        }
+    }
+
 /// perform extra validation before submission
     function validation($data){
-        $errors= array();
+        $errors = array();
+
+        //first validate and store the new idnubmers
+        if ($this->noidnumbers and $this->showing) {
+            foreach ($this->noidnumbers as $item) {
+                if (!empty($data['idnumber_'.$item->id])) {
+                    if(!$item->add_idnumber(stripslashes($data['idnumber_'.$item->id]))) {
+                        $errors['idnumber_'.$item->id] = get_string('error');
+                    }
+                }
+            }
+        }
 
         if ($data['calculation'] != '') {
             $grade_item = grade_item::fetch(array('id'=>$data['id'], 'courseid'=>$data['courseid']));
-            $result = $grade_item->validate_formula($data['calculation']);
+            $result = $grade_item->validate_formula(stripslashes($data['calculation']));
             if ($result !== true) {
                 $errors['calculation'] = $result;
             }
index 962c1780399075c602919e1b6a84ffa681b89528..6b8dbd48d21d65954cb9c72add86c7472f4691c0 100644 (file)
@@ -206,7 +206,7 @@ function print_grade_tree(&$gtree, $element, $moving, &$gpr) {
                     $icon = '<img src="'.$CFG->pixpath.'/t/edit.gif" class="icon" alt="'.get_string('manualgrade', 'grades').'"/>'; // TODO: localize
                 } else {
                     $icon = '<img src="'.$CFG->pixpath.'/i/outcomes.gif" class="icon" alt="'.get_string('outcome', 'grades').'"/>';
-                    
+
                 }
             }
             break;
index 71bc94fdea2fd80f365305f5c579f29b86074990..9f4e04709a211f28d50510354763832f4f665452 100644 (file)
@@ -131,12 +131,11 @@ class edit_item_form extends moodleform {
                     // following items are set up from modules and should not be overrided by user
                     $mform->hardFreeze('itemname,idnumber,gradetype,grademax,grademin,scaleid');
                     $mform->removeElement('calculation');
-    
+
                 } else if ($grade_item->is_manual_item()) {
                     // manual grade item does not use these - uses only final grades
                     $mform->removeElement('plusfactor');
                     $mform->removeElement('multfactor');
-    
                 }
             }
             //remove the aggregation coef element if not needed
index cd053cbc3b4e28954548a5934684b5a294ba17b4..f17999f55a99863b612101ebbc38b96d930ffd5d 100644 (file)
@@ -106,6 +106,7 @@ $string['enableajax'] = 'Enable AJAX';
 $string['enableoutcomes'] = 'Enable outcomes';
 $string['encoding'] = 'Encoding';
 $string['errorgradevaluenonnumeric'] = 'Received non-numeric for low or high grade for';
+$string['errorcalculationnoequal'] = 'Formula must start with equal sign (=1+2)';
 $string['errorcalculationunknown'] = 'Invalid formula';
 $string['errornocategorizedid'] = 'Could not get an uncategorized id!';
 $string['errornocourse'] = 'Could not get course information';
index 51e728c52268e9d3ec5fa3726e8bf58ed44620f5..6a996469103df41f0b041572bcef051628a9f6ba 100644 (file)
@@ -345,23 +345,11 @@ class grade_item extends grade_object {
             $this->sortorder = 1;
         }
 
-        // If not set, generate an idnumber from itemmodule and iteminstance
-        if (empty($this->idnumber)) {
-            if (!empty($this->itemmodule) && !empty($this->iteminstance)) {
-                $this->idnumber = "$this->itemmodule.$this->iteminstance";
-            } else { // No itemmodule or iteminstance, generate a random idnumber
-                $this->idnumber = rand(0,9999999999); // TODO replace rand() with proper random generator
-            }
-        }
-
         // add proper item numbers to manual items
         if ($this->itemtype == 'manual') {
             if (empty($this->itemnumber)) {
                 $this->itemnumber = 0;
             }
-            while (grade_item::fetch(array('courseid'=>$this->courseid, 'itemtype'=>'manual', 'itemnumber'=>$this->itemnumber))) {
-                $this->itemnumber++;
-            }
         }
 
         if (parent::insert($source)) {
@@ -375,6 +363,39 @@ class grade_item extends grade_object {
         }
     }
 
+    /**
+     * Set idnumber of grade item, updates also course_modules table
+     * @param string $idnumber
+     * @return boolean success
+     */
+    function add_idnumber($idnumber) {
+        //TODO: add uniqueness checking
+        if (!empty($this->idnumber)) {
+            return false;
+        }
+
+        if ($this->itemtype == 'mod' and !$this->is_outcome_item()) {
+            if (!$cm = get_coursemodule_from_instance($this->itemmodule, $this->iteminstance, $this->courseid)) {
+                return false;
+            }
+            if (!empty($cm->idnumber)) {
+                return false;
+            }
+            $ncm = new object();
+            $ncm->id = $cm->id;
+            $ncm->idnumber = $idnumber();
+            if(update_record('course_modules', $ncm)) {
+                $this->idnumber = $idnumber;
+                return $this->update();
+            }
+            return false;
+
+        } else {
+            $this->idnumber = $idnumber;
+            return $this->update();
+        }
+    }
+
     /**
      * Returns the locked state of this grade_item (if the grade_item is locked OR no specific
      * $userid is given) or the locked state of a specific grade within this item if a specific
index 02e58fbc8857eb6b1ca7a28608247aa245bd1ff7..1b9783adf2b4a7b968083b0d5ba0fd920ec69999 100644 (file)
@@ -330,7 +330,7 @@ function grade_get_outcomes($courseid, $itemtype, $itemmodule, $iteminstance, $u
                 $o->locked = $item->is_locked();
             }
             $o->grade = intval($o->grade); // 0 means no grade, int for scales
-            
+
             $result[$item->itemnumber] = $o;
         }
     }
@@ -354,7 +354,7 @@ function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $item
             }
             $grade = $data[$item->itemnumber] < 1 ? null : $data[$item->itemnumber];
             $item->update_final_grade($userid, $grade, $source);
-        }        
+        }
     }
 }