From a31697ba49f760f7121d1cd67db09aa3d30ff19d Mon Sep 17 00:00:00 2001 From: pichetp Date: Mon, 1 Jun 2009 03:12:29 +0000 Subject: [PATCH] MDL-17366 adding control of number of values displayed and validation improvments. --- lang/en_utf8/qtype_calculatedsimple.php | 11 +- .../edit_calculatedsimple_form.php | 246 ++++++++++++------ 2 files changed, 181 insertions(+), 76 deletions(-) diff --git a/lang/en_utf8/qtype_calculatedsimple.php b/lang/en_utf8/qtype_calculatedsimple.php index 4fd496f080..50ff9173f1 100644 --- a/lang/en_utf8/qtype_calculatedsimple.php +++ b/lang/en_utf8/qtype_calculatedsimple.php @@ -1,5 +1,6 @@ {x..} present in the correct answer formulas'; $string['calculatedsimple'] = 'Calculated Simple '; $string['calculatedsimplesummary'] = 'A simpler version of calculated questions which are like numerical questions but with the numbers used selected randomly from a set when the quiz is taken.'; $string['converttocalculated'] = 'Save as a new regular calculated question'; @@ -8,8 +9,14 @@ $string['findwildcards']='Find the wild cards {x..} present in the correct answe $string['generatenewitemsset'] = 'Generate a new set of '; $string['mustbenumeric'] = 'You must enter a number here.'; $string['mustnotbenumeric'] = 'This can\'t be a number.'; -$string['wildcarditems']= 'Items generated'; +$string['showitems'] = 'Display '; +$string['updatewildcardvalues'] = 'Update the wild card(s) values'; +$string['useadvance'] = 'Use the advance button to see the errors' ; +$string['wildcard'] = 'Wild card {$a}'; +$string['wildcardvalues']= 'Wild card(s) values '; +$string['wildcardvaluesgenerated']= 'Wild card(s) values generated'; $string['wildcardrole']= ' The wild cards {x..} will be substituted by a numerical value from the generated values'; -$string['wildcardparam']= 'Wild cards parameters used to generate the items '; +$string['wildcardparam']= 'Wild cards parameters used to generate the values '; $string['willconverttocalculated']= 'If set, the Save as new question will save as a new calculated question'; +$string['youmustaddatleastonevalue'] = 'You must add at least one set of wild card(s) values before you can save this question.'; ?> \ No newline at end of file diff --git a/question/type/calculatedsimple/edit_calculatedsimple_form.php b/question/type/calculatedsimple/edit_calculatedsimple_form.php index c2be49a483..5cc016a687 100644 --- a/question/type/calculatedsimple/edit_calculatedsimple_form.php +++ b/question/type/calculatedsimple/edit_calculatedsimple_form.php @@ -41,13 +41,15 @@ class question_edit_calculatedsimple_form extends question_edit_form { public $answer = array(); public $nonemptyanswer = array(); + + public $numbererrors = array(); + + public $formdata = array(); + function question_edit_calculatedsimple_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true){ global $QTYPES, $SESSION, $CFG, $DB; - // echo "

QTYPES

";print_r($QTYPES);echo"

"; - // echo "

session

";print_r($SESSION);echo"

"; - // echo "

question

";print_r($question);echo"

"; $this->regenerate = true; $this->question = $question; $this->qtypeobj =& $QTYPES[$this->question->qtype]; @@ -60,7 +62,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { // question->id == 0 so no stored datasets // else get datasets if ( "1" == optional_param('reload','', PARAM_INT )) { - // echo "

optional reload exist

"; $this->reload = true ; }else { $this->reload = false ; @@ -138,8 +139,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { } } } - // echo "

this->answer

";print_r($this->answer);echo"

"; - // echo "

this->answer

";print_r($this->nonemptyanswer);echo"

"; $this->datasetdefs = array(); // rebuild datasetdefs from old values $olddef = optional_param('datasetdef'); @@ -147,11 +146,7 @@ class question_edit_calculatedsimple_form extends question_edit_form { $calcmin = optional_param('calcmin') ; $calclength = optional_param('calclength') ; $calcmax = optional_param('calcmax') ; - /* echo "

calcmin

";print_r(optional_param('calcmin'));echo"

"; - echo "

calcmax

";print_r(optional_param('calcmax'));echo"

"; - echo "

calclength

";print_r(optional_param('calclength'));echo"

";*/ $newdatasetvalues = false ; - // echo "

olddef

";print_r(optional_param('datasetdef'));echo"

"; for($key = 1 ; $key <= sizeof($olddef) ; $key++) { $def = $olddef[$key] ; @@ -169,14 +164,12 @@ class question_edit_calculatedsimple_form extends question_edit_form { $this->datasetdefs[$def]->calcmax != $regs[3] || $this->datasetdefs[$def]->calclength != $regs[4]){ $newdatasetvalues = true ; - // echo "

new datasetdefs values ".$regs[2]."xx". $regs[3]."xx".$regs[4]."

"; } } $this->datasetdefs[$def]->options="uniform:".$this->datasetdefs[$def]->calcmin.":".$this->datasetdefs[$def]->calcmax.":".$this->datasetdefs[$def]->calclength; } - // echo "

this datasetdefs

";print_r($this->datasetdefs);echo"

"; // detect new datasets $newdataset = false ; foreach ($mandatorydatasets as $datasetname) { @@ -190,7 +183,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { $this->datasetdefs[$key]->name = $datasetname; $this->datasetdefs[$key]->options = "uniform:1.0:10.0:1"; $newdataset = true ; - // echo "

new datasetdefs $datasetname

"; // $form->dataset[$key]=$selected ; //$key++; }else { @@ -201,7 +193,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { $datasettoremove = false; foreach ($this->datasetdefs as $defkey => $datasetdef){ if(!isset($datasetdef->name )){ - // echo "

dataset $defkey to remove

"; $datasettoremove = true; unset($this->datasetdefs[$defkey]); } @@ -237,18 +228,14 @@ class question_edit_calculatedsimple_form extends question_edit_form { }//for number added }// datasetsdefs end $this->maxnumber = $maxnumber ; - // echo"

using create new items $this->maxnumber

"; }else { // Handle reload dataset items - // echo"

using optional to build

"; if ( "" !=optional_param('definition')&& !($datasettoremove ||$newdataset ||$newdatasetvalues )){ $i = 1; $fromformdefinition = optional_param('definition'); $fromformnumber = optional_param('number'); $fromformitemid = optional_param('itemid'); ksort($fromformdefinition); - // echo "

fromformdefinition

";print_r($fromformdefinition);echo"

"; - // echo "

fromformnumber

";print_r($fromformnumber);echo"

"; foreach($fromformdefinition as $key => $defid) { $addeditem = new stdClass(); @@ -270,12 +257,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { } } - // echo "

line 443 datasetdefs

";print_r($this->datasetdefs);echo"

"; - //$key = 0 ; - // if ( "" !=optional_param('answer')) echo "

optional answer exist

"; - // if ( "" !=optional_param('answer['.$key.']','', PARAM_NOTAGS)) echo "

optional $key exist

"; - // if ( "" !=optional_param('noanswer','', PARAM_INT )) echo "

optional noanswer exist

"; - parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable); } @@ -307,14 +288,14 @@ class question_edit_calculatedsimple_form extends question_edit_form { global $QTYPES; $this->qtypeobj =& $QTYPES[$this->qtype()]; $strquestionlabel = $this->qtypeobj->comment_header($this->nonemptyanswer); - $label = get_string("sharedwildcards", "qtype_datasetdependent"); + $label = get_string("sharedwildcards", "qtype_datasetdependent"); $mform->addElement('hidden', 'initialcategory', 1); $mform->addElement('hidden', 'reload', 1); // $html2 = $this->qtypeobj->print_dataset_definitions_category($this->question); // $mform->insertElementBefore($mform->createElement('static','listcategory',$label,$html2),'name'); - $addfieldsname='updatecategory'; + $addfieldsname='updatequestion value'; $addstring=get_string("updatecategory", "qtype_calculated"); - $mform->registerNoSubmitButton($addfieldsname); + $mform->registerNoSubmitButton($addfieldsname); // $mform->insertElementBefore( $mform->createElement('submit', $addfieldsname, $addstring),'listcategory'); @@ -363,9 +344,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { if ( "" != optional_param('analyzequestion','', PARAM_RAW)) { $this->wizarddisplay = true; - // echo "

session answer

";print_r($SESSION);echo"

"; - // echo "

session answer

";print_r($SESSION->calculated->questionform->answers);echo"

"; - }else { $this->wizwarddisplay = false; @@ -375,55 +353,169 @@ class question_edit_calculatedsimple_form extends question_edit_form { } else { $this->noofitems = 0; } - if(!empty($this->datasetdefs)){ - - $key = 0; - $mform->addElement('header', 'additemhdr', get_string('wildcardparam', 'qtype_calculatedsimple')); - $idx = 1; - if(!empty($this->datasetdefs)){ - $j = (($this->noofitems) * count($this->datasetdefs))+1;// - foreach ($this->datasetdefs as $defkey => $datasetdef){ - $mform->addElement('static', "na[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name)); - $this->qtypeobj->custom_generator_tools_part($mform, $idx, $j); - $mform->addElement('hidden', "datasetdef[$idx]"); - $mform->setType("datasetdef[$idx]", PARAM_RAW); - $idx++; - $mform->addElement('static', "divider[$j]", '', '
'); - $j++; - } - } + if(!empty($this->datasetdefs)){//So there are some datadefs + // we put them on the page + $key = 0; + $mform->addElement('header', 'additemhdr', get_string('wildcardparam', 'qtype_calculatedsimple')); + $idx = 1; + if(!empty($this->datasetdefs)){// unnecessary test + $j = (($this->noofitems) * count($this->datasetdefs))+1;// + foreach ($this->datasetdefs as $defkey => $datasetdef){ + $mform->addElement('static', "na[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name)); + $this->qtypeobj->custom_generator_tools_part($mform, $idx, $j); + $mform->addElement('hidden', "datasetdef[$idx]"); + $mform->setType("datasetdef[$idx]", PARAM_RAW); + $idx++; + $mform->addElement('static', "divider[$j]", '', '
'); + $j++; + } + } + //this should be done before the elements are created and stored as $this->formdata ; + //fill out all data sets and also the fields for the next item to add. + /*Here we do already the values error analysis so that + * we could force all wild cards values display if there is an error in values. + * as using a , in a number */ + $this->numbererrors = array(); + if(!empty($this->datasetdefs)){ + $j = $this->noofitems * count($this->datasetdefs); + for ($itemnumber = $this->noofitems; $itemnumber >= 1; $itemnumber--){ + $data = array(); + $numbererrors = array() ; + $comment = new stdClass; + $comment->stranswers = array(); + $comment->outsidelimit = false ; + $comment->answers = array(); + + foreach ($this->datasetdefs as $defid => $datasetdef){ + if (isset($datasetdef->items[$itemnumber])){ + $this->formdata["definition[$j]"] = $defid; + $this->formdata["itemid[$j]"] = $datasetdef->items[$itemnumber]->id; + $data[$datasetdef->name] = $datasetdef->items[$itemnumber]->value; + $this->formdata["number[$j]"] = $number = $datasetdef->items[$itemnumber]->value; + if(! is_numeric($number)){ + $a = new stdClass; + $a->name = '{'.$datasetdef->name.'}' ; + $a->value = $datasetdef->items[$itemnumber]->value ; + if (stristr($number,',')){ + $this->numbererrors["number[$j]"]=get_string('nocommaallowed', 'qtype_datasetdependent'); + $numbererrors .= $this->numbererrors['number['.$j.']']."
"; + + }else { + $this->numbererrors["number[$j]"]= get_string('notvalidnumber','qtype_datasetdependent',$a); + $numbererrors .= $this->numbererrors['number['.$j.']']."
"; + //$comment->outsidelimit = false ; + } + }else if( stristr($number,'x')){ // hexa will pass the test + $a = new stdClass; + $a->name = '{'.$datasetdef->name.'}' ; + $a->value = $datasetdef->items[$itemnumber]->value ; + $this->numbererrors['number['.$j.']']= get_string('hexanotallowed','qtype_datasetdependent',$a); + $numbererrors .= $this->numbererrors['number['.$j.']']."
"; + } else if( is_nan($number)){ + $a = new stdClass; + $a->name = '{'.$datasetdef->name.'}' ; + $a->value = $datasetdef->items[$itemnumber]->value ; + $this->numbererrors["number[$j]"]= get_string('notvalidnumber','qtype_datasetdependent',$a); + $numbererrors .= $this->numbererrors['number['.$j.']']."
"; + // $val = 1.0 ; + } + } + $j--; + } + if($this->noofitems != 0 ) { + if (empty($numbererrors )){ + if(!isset($question->id)) $question->id = 0 ; + $comment = $this->qtypeobj->comment_on_datasetitems($question->id,$this->nonemptyanswer, $data, $itemnumber);//$this-> + if ($comment->outsidelimit) { + $this->outsidelimit=$comment->outsidelimit ; + } + $totalcomment=''; + + foreach ($this->nonemptyanswer as $key => $answer) { + $totalcomment .= $comment->stranswers[$key].'
'; + } + + $this->formdata['answercomment['.$itemnumber.']'] = $totalcomment ; + } + } + } + $this->formdata['selectdelete'] = '1'; + $this->formdata['selectadd'] = '1'; + $j = $this->noofitems * count($this->datasetdefs)+1; + $data = array(); // data for comment_on_datasetitems later + $idx =1 ; + foreach ($this->datasetdefs as $defid => $datasetdef){ + $this->formdata["datasetdef[$idx]"] = $defid; + $idx++; + } + $this->formdata = $this->qtypeobj->custom_generator_set_data($this->datasetdefs, $this->formdata); + } + + $addoptions = Array(); $addoptions['1']='1'; for ($i=10; $i<=100 ; $i+=10){ $addoptions["$i"]="$i"; } + $showoptions = Array(); + $showoptions['1']='1'; + $showoptions['2']='2'; + $showoptions['5']='5'; + for ($i=10; $i<=100 ; $i+=10){ + $showoptions["$i"]="$i"; + } $mform->closeHeaderBefore('additemhdr'); $addgrp = array(); $addgrp[] =& $mform->createElement('submit', 'addbutton', get_string('generatenewitemsset', 'qtype_calculatedsimple')); - $addgrp[] =& $mform->createElement('select', "selectadd", get_string('additem', 'qtype_datasetdependent'), $addoptions); - $addgrp[] = & $mform->createElement('static',"stat","Items",get_string('item(s)', 'qtype_datasetdependent')); + $addgrp[] =& $mform->createElement('select', "selectadd", get_string('wildcardvalues', 'qtype_calculatedsimple'), $addoptions); + $addgrp[] = & $mform->createElement('static',"stat",'',get_string('wildcardvalues', 'qtype_calculatedsimple')); $mform->addGroup($addgrp, 'addgrp', '', ' ', false); $mform->registerNoSubmitButton('addbutton'); $mform->closeHeaderBefore('addgrp'); + $addgrp1 = array(); + $addgrp1[] =& $mform->createElement('submit', 'showbutton', get_string('showitems', 'qtype_calculatedsimple')); + $addgrp1[] =& $mform->createElement('select', "selectshow",'' , $showoptions); + $addgrp1[] = & $mform->createElement('static',"stat",'',get_string('wildcardvalues', 'qtype_calculatedsimple')); + $mform->addGroup($addgrp1, 'addgrp1', '', ' ', false); + $mform->registerNoSubmitButton('showbutton'); + $mform->closeHeaderBefore('addgrp1'); $mform->addElement('static', "divideradd", '', ''); if ($this->noofitems == 0) { - $mform->addElement('static','warningnoitems','',''.get_string('youmustaddatleastoneitem', 'qtype_datasetdependent').''); - $mform->closeHeaderBefore('warningnoitems'); + $mform->addElement('static','warningnoitems','',''.get_string('youmustaddatleastonevalue', 'qtype_calculatedsimple').''); + $mform->closeHeaderBefore('warningnoitems'); }else { - $mform->addElement('header', 'additemhdr1', get_string('wildcarditems', 'qtype_calculatedsimple')); - $mform->closeHeaderBefore('additemhdr1'); + $mform->addElement('header', 'additemhdr1', get_string('wildcardvalues', 'qtype_calculatedsimple')); + $mform->closeHeaderBefore('additemhdr1'); // $mform->addElement('header', '', get_string('itemno', 'qtype_datasetdependent', "")); - // $mform->addElement('submit', 'updatedatasets', get_string('updatedatasetparam', 'qtype_datasetdependent')); - // $mform->registerNoSubmitButton('updatedatasets'); - // $mform->setAdvanced("updatedatasets",true); + if( !empty($this->numbererrors) || $this->outsidelimit) { + $mform->addElement('static', "alert", '', ''.get_string('useadvance', 'qtype_calculatedsimple').''); + } + + $mform->addElement('submit', 'updatedatasets', get_string('updatewildcardvalues', 'qtype_calculatedsimple')); + $mform->registerNoSubmitButton('updatedatasets'); + $mform->setAdvanced("updatedatasets",true); //------------------------------------------------------------------------------------------------------------------------------ $j = $this->noofitems * count($this->datasetdefs); + $k = 1 ; + if ("" != optional_param('selectshow')){ + $k = optional_param('selectshow') ; + } + for ($i = $this->noofitems; $i >= 1 ; $i--){ foreach ($this->datasetdefs as $defkey => $datasetdef){ - $mform->addElement('text', "number[$j]", get_string('param', 'qtype_datasetdependent', $datasetdef->name)); - $mform->setType("number[$j]", PARAM_NUMBER); + if($k > 0 || $this->outsidelimit || !empty($this->numbererrors ) ){ + $mform->addElement('text',"number[$j]" , get_string('wildcard', 'qtype_calculatedsimple', $datasetdef->name)); $mform->setAdvanced("number[$j]",true); + if(!empty($this->numbererrors['number['.$j.']']) ){ + $mform->addElement('static', "numbercomment[$j]",'',''.$this->numbererrors['number['.$j.']'].''); + $mform->setAdvanced("numbercomment[$j]",true); + } + }else { + $mform->addElement('hidden',"number[$j]" , get_string('wildcard', 'qtype_calculatedsimple', $datasetdef->name)); + } + $mform->setType("number[$j]", PARAM_NUMBER); + $mform->addElement('hidden', "itemid[$j]"); $mform->setType("itemid[$j]", PARAM_INT); @@ -432,11 +524,16 @@ class question_edit_calculatedsimple_form extends question_edit_form { $j--; } - if (!empty( $strquestionlabel)){ - $repeated[] =& $mform->addElement('static', "answercomment[$i]", "".get_string('itemno', 'qtype_datasetdependent', $i)."  ".$strquestionlabel); + if (!empty( $strquestionlabel) && ($k > 0 || $this->outsidelimit || !empty($this->numbererrors ) ) ){ + // $repeated[] =& $mform->addElement('static', "answercomment[$i]", $strquestionlabel); + $mform->addElement('static', "answercomment[$i]", "".get_string('itemno', 'qtype_datasetdependent', $i)."  ".$strquestionlabel); + } - $mform->addElement('static', "divider1[$j]", '', '
'); - + if($k > 0 || $this->outsidelimit || !empty($this->numbererrors )){ + $mform->addElement('static', "divider1[$j]", '', '
'); + + } + $k-- ; } } // if ($this->outsidelimit){ @@ -513,12 +610,12 @@ class question_edit_calculatedsimple_form extends question_edit_form { } } $key = 0 ; - // echo "

mandatorydatasets $key xx".optional_param("answer[0]",'', PARAM_NOTAGS)."YY".$this->_form->getElementValue('answer['.$key.']')."xx

"; $formdata = array(); $fromform = new stdClass(); + //this should be done before the elements are created and stored as $this->formdata ; //fill out all data sets and also the fields for the next item to add. - if(!empty($this->datasetdefs)){ + /* if(!empty($this->datasetdefs)){ $j = $this->noofitems * count($this->datasetdefs); for ($itemnumber = $this->noofitems; $itemnumber >= 1; $itemnumber--){ $data = array(); @@ -562,9 +659,8 @@ class question_edit_calculatedsimple_form extends question_edit_form { $idx++; } $formdata = $this->qtypeobj->custom_generator_set_data($this->datasetdefs, $formdata); - } - $question = (object)((array)$question + $default_values+$formdata ); - // echo "

question data

";print_r($question);echo"

"; + }*/ + $question = (object)((array)$question + $default_values+$this->formdata ); parent::set_data($question); } @@ -582,7 +678,6 @@ class question_edit_calculatedsimple_form extends question_edit_form { foreach ($possibledatasets as $name => $value) { $qtextremaining = str_replace('{'.$name.'}', '1', $qtextremaining); } - // echo "numericalquestion qtextremaining
";print_r($possibledatasets);
         while  (ereg('\{=([^[:space:]}]*)}', $qtextremaining, $regs1)) {
             $qtextsplits = explode($regs1[0], $qtextremaining, 2);
             $qtext =$qtext.$qtextsplits[0];
@@ -604,8 +699,7 @@ class question_edit_calculatedsimple_form extends question_edit_form {
             $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer);
         }
         if ( count($mandatorydatasets )==0){
-          //  $errors['questiontext']=get_string('atleastonewildcard', 'qtype_datasetdependent');
-            foreach ($answers as $key => $answer){
+             foreach ($answers as $key => $answer){
                 $errors['answer['.$key.']'] = get_string('atleastonewildcard', 'qtype_datasetdependent');
             }
         }
@@ -691,20 +785,24 @@ class question_edit_calculatedsimple_form extends question_edit_form {
          //   if(!isset($errors['warning'])) $errors['warning']=' ';
            $errors['outsidelimits'] = get_string('oneanswertrueansweroutsidelimits','qtype_calculated');
         }
+              	/*Here we use the already done the error analysis so that 
+      	* we could force all wild cards values display if there is an error in values.
+      	* as using a , in a number */
         $numbers = $data['number'];
         foreach ($numbers as $key => $number){
             if(! is_numeric($number)){
                 if (stristr($number,',')){
-                    $errors['number['.$key.']'] = get_string('The , cannot be used, use . as in 0.013 or 1.3e-2', 'qtype_datasetdependent');
+                    $errors['number['.$key.']'] = get_string('notvalidnumber', 'qtype_datasetdependent');
                 }else {    
-                    $errors['number['.$key.']'] = get_string('This is not a valid number', 'qtype_datasetdependent');
+                    $errors['number['.$key.']'] = get_string('notvalidnumber', 'qtype_datasetdependent');
                 }
             }else if( stristr($number,'x')){
-                $errors['number['.$key.']'] = get_string('Hexadecimal format (i.e. 0X12d) is not allowed', 'qtype_datasetdependent');
+                $errors['number['.$key.']'] = get_string('notvalidnumber', 'qtype_datasetdependent');
             } else if( is_nan($number)){
-                $errors['number['.$key.']'] = get_string('is a NAN number', 'qtype_datasetdependent');
+                $errors['number['.$key.']'] = get_string('notvalidnumber', 'qtype_datasetdependent');
             }        
         }
+        
         if ( $this->noofitems==0  ){
             $errors['warning'] = get_string('warning', 'mnet');
         }
-- 
2.39.5