diff --git a/question/type/calculated/editquestion.html b/question/type/calculated/editquestion.html index 71b9c0b26d1..9901f961fd0 100644 --- a/question/type/calculated/editquestion.html +++ b/question/type/calculated/editquestion.html @@ -80,24 +80,31 @@ +
";print_r($possibledatasets);
+// echo "test";print_r($numericalquestion);
+ while (ereg('\{=([^[:space:]}]*)}', $qtextremaining, $regs1)) {
+ $qtextsplits = explode($regs1[0], $qtextremaining, 2);
+ $qtext =$qtext.$qtextsplits[0];
+ $qtextremaining = $qtextsplits[1];
+ // echo "testsplit0".$qtextsplits[0]."
";
+ // echo "test".$regs1[0]."
";
+ // echo "qtext".$qtext."
";
+ // echo "test";print_r($regs1);
+ if (empty($regs1[1])) {
+ $str = '';
+ } else {
+ // could put here an equation verification
+ if ($formulaerrors =
+ qtype_calculated_find_formula_errors($regs1[1])) {
+ $calculatedmessages[] = $formulaerrors;
+ $str = '';
+ }
+ }
+ }
+ // import from 1.8 to be tested
+ $answercount=0 ;
+ $maxgrade = false;
+ $mandatorydatasets = array();
+ foreach ($question->answers as $key => $answer){
+ $mandatorydatasets += $this->find_dataset_names($answer);
+ }
+ if ( count($mandatorydatasets )==0){
+ // $errors['questiontext']=get_string('atleastonewildcard', 'qtype_datasetdependent');
+ // foreach ($answers as $key => $answer){
+ $calculatedmessages[] = get_string('atleastonewildcard', 'qtype_datasetdependent');
+// }
+ }
+ foreach ($question->answers as $key => $answer){
+ //check no of choices
+ // the * for everykind of answer not actually implemented
+ $trimmedanswer = trim($answer);
+ if (($trimmedanswer!='')||$answercount==0){
+ $eqerror = qtype_calculated_find_formula_errors($trimmedanswer);
+ if (FALSE !== $eqerror){
+ $calculatedmessages[] = $eqerror.":".$answer;
+ }
+ }
+
+ if ($trimmedanswer!=''){
+ /* if ('2' == $data['correctanswerformat'][$key]
+ && '0' == $data['correctanswerlength'][$key]) {
+ $errors['correctanswerlength['.$key.']'] = get_string('zerosignificantfiguresnotallowed','quiz');
+ }
+ if (!is_numeric($data['tolerance'][$key])){
+ $errors['tolerance['.$key.']'] = get_string('mustbenumeric', 'qtype_calculated');
+ }
+ if ($data['fraction'][$key] == 1) {
+ $maxgrade = true;
+ }
+*/
+ $answercount++;
+ }
+ }
+ if ($answercount == 0) {
+ $calculatedmessages[]=get_string('atleastoneanswer', 'qtype_calculated');
+ }
+ /* $calculatedmessages = array();
+ if (empty($form->name)) {
+ $calculatedmessages[] = get_string('missingname', 'quiz');
+ }
+ if (empty($form->questiontext)) {
+ $calculatedmessages[] = get_string('missingquestiontext', 'quiz');
+ }
+ // Verify formulas
+ foreach ($form->answers as $key => $answer) {
+ if ('' === trim($answer)) {
+ $calculatedmessages[] =
+ get_string('missingformula', 'quiz');
+ }
+ if ($formulaerrors =
+ qtype_calculated_find_formula_errors($answer)) {
+ $calculatedmessages[] = $formulaerrors;
+ }
+ if (! isset($form->tolerance[$key])) {
+ $form->tolerance[$key] = 0.0;
+ }
+ if (! is_numeric($form->tolerance[$key])) {
+ $calculatedmessages[] =
+ get_string('tolerancemustbenumeric', 'quiz');
+ }
+ }
+ if (!empty($calculatedmessages)) {
+ $errorstring = "The following errors were found:
";
+ foreach ($calculatedmessages as $msg) {
+ $errorstring .= $msg . '
';
+ }
+ error($errorstring);
+ }
+ */
+
+ }
if( isset($question->import_process)&&$question->import_process){
$this->import_datasets($question);
}
+ if (!empty($calculatedmessages)) {
+ $errorstring = "The following errors were found:
";
+ foreach ($calculatedmessages as $msg) {
+ $errorstring .= $msg . '
';
+ }
+ $result->notice=$errorstring;
+ }
+
// Report any problems.
if (!empty($result->notice)) {
return $result;
@@ -261,7 +386,7 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
$datasetitem->number = $dataitem->itemnumber ;
$datasetitem->value = $dataitem->value ;
if (!insert_record('question_dataset_items', $datasetitem)) {
- error("Unable to insert dataset item $item->itemnumber with $item->value for $datasetdef->name");
+ error("Unable to insert dataset item $datasetitem->number with $item->value for $datasetdef->name");
}
}
}
@@ -273,6 +398,7 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
$question->options->answers = array();
foreach ($form->answers as $key => $answer) {
$a->answer = trim($form->answer[$key]);
+ $a->fraction = $form->fraction[$key];//new
$a->tolerance = $form->tolerance[$key];
$a->tolerancetype = $form->tolerancetype[$key];
$a->correctanswerlength = $form->correctanswerlength[$key];
@@ -365,6 +491,25 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
}
$numericalquestion->questiontext = parent::substitute_variables(
$numericalquestion->questiontext, $state->options->dataset);
+ //evaluate the equations i.e {=5+4)
+ $qtext = "";
+ $qtextremaining = $numericalquestion->questiontext ;
+ while (ereg('\{=([^[:space:]}]*)}', $qtextremaining, $regs1)) {
+ $qtextsplits = explode($regs1[0], $qtextremaining, 2);
+ $qtext =$qtext.$qtextsplits[0];
+ $qtextremaining = $qtextsplits[1];
+ if (empty($regs1[1])) {
+ $str = '';
+ } else {
+ if( $formulaerrors = qtype_calculated_find_formula_errors($regs1[1])){
+ $str=$formulaerrors ;
+ }else {
+ eval('$str = '.$regs1[1].';');
+ }
+ }
+ $qtext = $qtext.$str ;
+ }
+ $numericalquestion->questiontext = $qtext.$qtextremaining ; // end replace equations
$virtualqtype->print_question_formulation_and_controls($numericalquestion, $state, $cmoptions, $options);
}
@@ -590,7 +735,7 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
function comment_header($question) {
//$this->get_question_options($question);
global $SESSION;
- $strheader = '';
+ $strheader = Array();
$delimiter = '';
if (empty($question->id)) {
$answers = $SESSION->datasetdependent->questionform->answers;
@@ -599,9 +744,9 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
}
foreach ($answers as $answer) {
if (is_string($answer)) {
- $strheader .= $delimiter.$answer;
+ $strheader[] = $answer;
} else {
- $strheader .= $delimiter.$answer->answer;
+ $strheader[]= $answer->answer;
}
$delimiter = ',';
}
@@ -624,6 +769,7 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
$errors = '';
$delimiter = ': ';
$virtualqtype = $this->get_virtual_qtype();
+ $column =Array();
foreach ($answers as $answer) {
$calculated = qtype_calculated_calculate_answer(
$answer->answer, $data, $answer->tolerance,
@@ -639,12 +785,13 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
$errors .= " -$calculated->answer";
$stranswers .= $delimiter;
} else {
- $stranswers .= $delimiter.$calculated->answer;
- $strmin .= $delimiter.$calculated->min;
- $strmax .= $delimiter.$calculated->max;
+ // $stranswers .= $delimiter.$calculated->answer;
+ // $strmin .= $delimiter.$calculated->min;
+ // $strmax .= $delimiter.$calculated->max;
+ $column[]=$stranswers.$delimiter.$calculated->answer.'
'.$strmin.$delimiter.$calculated->min.'
'.$strmax.$delimiter.$calculated->max ;
}
}
- return "$stranswers
$strmin
$strmax
$errors";
+ return $column;
}
function tolerance_types() {
@@ -653,18 +800,25 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
'3' => get_string('geometric', 'quiz'));
}
- function dataset_options($form, $name, $renameabledatasets=false) {
+ function dataset_options($form, $name, $mandatory=true,$renameabledatasets=false) {
// Takes datasets from the parent implementation but
// filters options that are currently not accepted by calculated
// It also determines a default selection...
- list($options, $selected) = parent::dataset_options($form, $name);
+ //$renameabledatasets not implemented anmywhere
+ list($options, $selected) = parent::dataset_options($form, $name,'','qtype_calculated');
+ // list($options, $selected) = $this->dataset_optionsa($form, $name);
+
foreach ($options as $key => $whatever) {
if (!ereg('^'.LITERAL.'-', $key) && $key != '0') {
unset($options[$key]);
}
}
if (!$selected) {
+ if ($mandatory){
$selected = LITERAL . "-0-$name"; // Default
+ }else {
+ $selected = "0"; // Default
+ }
}
return array($options, $selected);
}
@@ -721,6 +875,100 @@ class question_calculated_qtype extends question_dataset_dependent_questiontype
return $str;
}
+ /**
+ * This function retrieve the item count of the available category shareable
+ * wild cards that is added as a comment displayed when a wild card with
+ * the same name is displayed in datasetdefinitions_form.php
+ */
+ function get_dataset_definitions_category($form) {
+ global $CFG;
+ $datasetdefs = array();
+ $lnamemax = 30;
+ if (!empty($form->category)) {
+ $sql = "SELECT i.*,d.*
+ FROM {$CFG->prefix}question_datasets d,
+ {$CFG->prefix}question_dataset_definitions i
+ WHERE i.id = d.datasetdefinition
+ AND i.category = '$form->category'
+ ;
+ ";
+ if ($records = get_records_sql($sql)) {
+ foreach ($records as $r) {
+ if ( !isset ($datasetdefs["$r->name"])) $datasetdefs["$r->name"] = $r->itemcount;
+ }
+ }
+ }
+ return $datasetdefs ;
+ }
+
+ /**
+ * This function build a table showing the available category shareable
+ * wild cards, their name, their definition (Min, Max, Decimal) , the item count
+ * and the name of the question where they are used.
+ * This table is intended to be add before the question text to help the user use
+ * these wild cards
+ */
+
+ function print_dataset_definitions_category($form) {
+ global $CFG;
+ $datasetdefs = array();
+ $lnamemax = 22;
+ $namestr =get_string('name', 'quiz');
+ $minstr=get_string('min', 'quiz');
+ $maxstr=get_string('max', 'quiz');
+ $rangeofvaluestr=get_string('minmax','qtype_datasetdependent');
+ $questionusingstr = get_string('usedinquestion','qtype_calculated');
+ $wildcardstr = get_string('wildcard', 'qtype_calculated');
+ $itemscountstr = get_string('itemscount','qtype_datasetdependent');
+ $text ='';
+ if (!empty($form->category)) {
+ $sql = "SELECT i.*,d.*
+ FROM {$CFG->prefix}question_datasets d,
+ {$CFG->prefix}question_dataset_definitions i
+ WHERE i.id = d.datasetdefinition
+ AND i.category = '$form->category';
+ " ;
+ if ($records = get_records_sql($sql)) {
+ foreach ($records as $r) {
+ $sql1 = "SELECT q.*
+ FROM {$CFG->prefix}question q
+ WHERE q.id = $r->question
+ ";
+ if ( !isset ($datasetdefs["$r->type-$r->category-$r->name"])){
+ $datasetdefs["$r->type-$r->category-$r->name"]= $r;
+ }
+ if ($questionb = get_records_sql($sql1)) {
+ $datasetdefs["$r->type-$r->category-$r->name"]->questions[$r->question]->name =$questionb[$r->question]->name ;
+ }
+ }
+ }
+ }
+ if (!empty ($datasetdefs)){
+
+ $text ="| $namestr | $rangeofvaluestr | $itemscountstr | $questionusingstr |
|---|---|---|---|
| $datasetdef->name | $min - $max | $datasetdef->itemcount | ";
+ foreach ($datasetdef->questions as $qu) {
+ //limit the name length displayed
+ if (!empty($qu->name)) {
+ $qu->name = (strlen($qu->name) > $lnamemax) ?
+ substr($qu->name, 0, $lnamemax).'...' : $qu->name;
+ } else {
+ $qu->name = '';
+ }
+ $text .=" $qu->name "; + } + $text .=" |
Reuse an previously used record un".$addeditem->id."
"; + } else { + if ($this->supports_dataset_item_generation()) { + $addeditem->value = $this->generate_dataset_item($datasetdefs[$defid]->options); + } else { + $addeditem->value = ''; + } + } + //echo "update le dataset_items".$addeditem->id."
"; if (!update_record('question_dataset_items', $addeditem)) { error("Error: Unable to update dataset item"); } @@ -66,31 +82,79 @@ error("Error: Unable to insert dataset item"); } } - + } + $maxnumber = $addeditem->number; + $numbertoadd =0; + if ($form->selectadd > 1 && $maxnumber < $max100 ) { + $numbertoadd =$form->selectadd-1 ; + if ( $max100 - $maxnumber < $numbertoadd ) { + $numbertoadd = $max100 - $maxnumber ; + } + //add the other items. + // tout d'abord le définit + // Generate a new dataset item (or reuse an old one) + foreach ($datasetdefs as $defid => $datasetdef) { + if (isset($datasetdef->id)) { + $datasetdefs[$defid]->items = get_records_sql( // Use number as key!! + " SELECT number, definition, id, value + FROM {$CFG->prefix}question_dataset_items + WHERE definition = $datasetdef->id ORDER BY number"); + } + // echo ""; print_r($datasetdefs[$defid]->items);
+ for ($numberadded =$maxnumber+1 ; $numberadded <= $maxnumber+$numbertoadd ; $numberadded++){
+ if (isset($datasetdefs[$defid]->items[$numberadded]) && (
+ empty($form->forceregeneration)
+ // && isset($form->regenerateddefid) &&
+ // $form->regenerateddefid != $defid || no
+ || isset($form->deletebutton))) {
+ // echo "Reuse an previously used record".$numberadded."id".$datasetdef->id."
";
+ } else {
+ $datasetitem = new stdClass;
+ $datasetitem->definition = $datasetdef->id ;
+ $datasetitem->number = $numberadded;
+ if ($this->supports_dataset_item_generation()) {
+ $datasetitem->value = $this->generate_dataset_item($datasetdef->options);
+ } else {
+ $datasetitem->value = '';
+ }
+ //pp echo ""; print_r( $datasetitem );
+ //insere le nouveau
+ if (!insert_record('question_dataset_items', $datasetitem)) {
+ error("Error: Unable to insert new dataset item");
+ }
+ $datasetdefs[$defid]->items[$numberadded] = clone($datasetitem);
+ }
+ }//for number added
+ }// datasetsdefs end
+ }
+ $maxnumber += $numbertoadd ;
foreach ($datasetdefs as $key => $newdef) {
if (isset($newdef->id) && $newdef->itemcount <= $maxnumber) {
- $newdef->itemcount = $maxnumber+1;
+ $newdef->itemcount = $maxnumber;
// Save the new value for options
update_record('question_dataset_definitions', $newdef);
}
}
- }
- // else Success:
- $maxnumber = $addeditem->number;
+ //} // if select >
+
} else if (isset($form->deletebutton)
&& $maxnumber == $form->numbertodelete) {
// Simply decrease itemcount where == $maxnumber
+ // selectedelete
+ if(isset($form->selectdelete)) $newmaxnumber = $maxnumber-$form->selectdelete ;
+ else $newmaxnumber = $maxnumber-1 ;
+ if ($newmaxnumber < 0 ) $newmaxnumber = 0 ;
foreach ($datasetdefs as $datasetdef) {
if ($datasetdef->itemcount == $maxnumber) {
- $datasetdef->itemcount--;
+ $datasetdef->itemcount= $newmaxnumber ; //pp--;
if (!update_record('question_dataset_definitions',
$datasetdef)) {
error("Error: Unable to update itemcount");
}
}
}
- --$maxnumber;
+ $maxnumber= $newmaxnumber;
}
make_upload_directory("$course->id"); // Just in case
@@ -160,13 +224,17 @@
. '
' . $strforceregeneration;
}
+ //pp limit
+ if ($maxnumber < $max100) {
$addline[] = ''.$forceregeneration;
+ 'value="'.$stradd.'"/>'.'' .$forceregeneration;
$addline[] = $maxnumber+1;
-
-
+ } else {
+ $addline[] ='';
+ $addline[] = ">".$max100;
+ }
foreach ($datasetdefs as $defid => $datasetdef) {
if ($datasetdef->name) {
$table->head[] = $datasetdef->name;
@@ -197,8 +265,10 @@
}
if ($strquestionheader) {
- $table->head[] = $strquestionheader;
- $addtable->head[] = $strquestionheader;
+ foreach($strquestionheader as $header){
+ $table->head[] = $header;
+ $addtable->head[] = $header;
+ }
if (empty($question->id) &&
isset($SESSION->datasetdependent->questionform)) {
$tmp = &$SESSION->datasetdependent->questionform;
@@ -212,7 +282,10 @@
}
$question->options->answers = $answers;
}
- $addline[] = $this->comment_on_datasetitems($question, $data, $maxnumber + 1);
+ $comment =$this->comment_on_datasetitems($question, $data, $maxnumber + 1);
+ foreach($comment as $comm){
+ $addline[] = $comm ;
+ }
}
// Set up the table showing existing datasets
@@ -223,7 +296,7 @@
if ($maxnumber == $number) {
$columns[] =
"
- ";
+ ".'';
} else {
$columns[] = '';
}
@@ -237,7 +310,10 @@
($data[$datasetdef->name] = $datasetdef->items[$number]->value) ;
}
if ($strquestionheader) {
- $columns[] = $this->comment_on_datasetitems($question, $data, $number);
+ $comment =$this->comment_on_datasetitems($question, $data, $number);
+ foreach($comment as $comm){
+ $columns[] = $comm ;
+ }
}
$table->data[] = $columns;
}