diff options
-rw-r--r-- | db/install.xml | 43 | ||||
-rw-r--r-- | edit_algebra_form.php | 191 | ||||
-rw-r--r-- | lang/en/qtype_algebra.php | 5 | ||||
-rw-r--r-- | question.php | 7 | ||||
-rw-r--r-- | settings.php | 27 | ||||
-rw-r--r-- | version.php | 9 |
6 files changed, 139 insertions, 143 deletions
diff --git a/db/install.xml b/db/install.xml index 51b8d85..07985fd 100644 --- a/db/install.xml +++ b/db/install.xml @@ -1,42 +1,29 @@ <?xml version="1.0" encoding="UTF-8" ?> <XMLDB PATH="question/type/symbollic/db" VERSION="20080516" COMMENT="XMLDB file for Moodle question/type/algebra"> <TABLES> - <TABLE NAME="question_algebra" COMMENT="Options for algebra questions" NEXT="question_algebra_variables"> + <TABLE NAME="question_algebra" COMMENT="Options for algebra questions" NEXT="question_algebra_variables"> <FIELDS> - <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" - NEXT="questionid"/> - <FIELD NAME="questionid" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" - SEQUENCE="false" PREVIOUS="id" NEXT="compareby"/> - <FIELD NAME="compareby" TYPE="char" LENGTH="20" NOTNULL="true" UNSIGNED="false" DEFAULT="evaluated" - SEQUENCE="false" PREVIOUS="questionid" NEXT="nchecks"/> - <FIELD NAME="nchecks" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="10" - SEQUENCE="false" PREVIOUS="compareby" NEXT="tolerance"/> - <FIELD NAME="tolerance" TYPE="float" NOTNULL="true" UNSIGNED="false" - SEQUENCE="false" PREVIOUS="nchecks" NEXT="disallow"/> - <FIELD NAME="disallow" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" - SEQUENCE="false" PREVIOUS="tolerance" NEXT="allowedfuncs"/> - <FIELD NAME="allowedfuncs" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" - SEQUENCE="false" PREVIOUS="disallow" NEXT="answerprefix"/> - <FIELD NAME="answerprefix" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" - SEQUENCE="false" PREVIOUS="allowedfuncs"/> + <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="questionid"/> + <FIELD NAME="questionid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="id" NEXT="compareby"/> + <FIELD NAME="compareby" TYPE="char" LENGTH="20" NOTNULL="true" DEFAULT="evaluated" SEQUENCE="false" PREVIOUS="questionid" NEXT="nchecks"/> + <FIELD NAME="nchecks" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="10" SEQUENCE="false" PREVIOUS="compareby" NEXT="tolerance"/> + <FIELD NAME="tolerance" TYPE="float" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" PREVIOUS="nchecks" NEXT="disallow"/> + <FIELD NAME="disallow" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" PREVIOUS="tolerance" NEXT="allowedfuncs"/> + <FIELD NAME="allowedfuncs" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" PREVIOUS="disallow" NEXT="answerprefix"/> + <FIELD NAME="answerprefix" TYPE="text" LENGTH="small" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" PREVIOUS="allowedfuncs"/> </FIELDS> <KEYS> <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="questionid"/> <KEY NAME="questionid" TYPE="foreign" FIELDS="questionid" REFTABLE="question" REFFIELDS="id" PREVIOUS="primary"/> </KEYS> </TABLE> - <TABLE NAME="question_algebra_variables" COMMENT="Variables for algebra questions" PREVIOUS="question_algebra"> + <TABLE NAME="question_algebra_variables" COMMENT="Variables for algebra questions" PREVIOUS="question_algebra"> <FIELDS> - <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" - NEXT="question"/> - <FIELD NAME="question" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" - SEQUENCE="false" PREVIOUS="id" NEXT="name"/> - <FIELD NAME="name" TYPE="char" LENGTH="30" NOTNULL="true" UNSIGNED="false" - SEQUENCE="false" PREVIOUS="question" NEXT="min"/> - <FIELD NAME="min" TYPE="char" LENGTH="30" NOTNULL="true" UNSIGNED="false" DEFAULT="-" - SEQUENCE="false" PREVIOUS="name" NEXT="max"/> - <FIELD NAME="max" TYPE="char" LENGTH="30" NOTNULL="true" UNSIGNED="false" DEFAULT="-" - SEQUENCE="false" PREVIOUS="min"/> + <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="question"/> + <FIELD NAME="question" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="id" NEXT="name"/> + <FIELD NAME="name" TYPE="char" LENGTH="30" NOTNULL="true" UNSIGNED="false" SEQUENCE="false" PREVIOUS="question" NEXT="min"/> + <FIELD NAME="min" TYPE="char" LENGTH="30" NOTNULL="true" DEFAULT="-" SEQUENCE="false" PREVIOUS="name" NEXT="max"/> + <FIELD NAME="max" TYPE="char" LENGTH="30" NOTNULL="true" DEFAULT="-" SEQUENCE="false" PREVIOUS="min"/> </FIELDS> <KEYS> <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="question"/> diff --git a/edit_algebra_form.php b/edit_algebra_form.php index eae12bf..033cb84 100644 --- a/edit_algebra_form.php +++ b/edit_algebra_form.php @@ -12,7 +12,7 @@ require_once($CFG->dirroot . '/question/type/edit_question_form.php'); require_once($CFG->dirroot . '/question/type/algebra/questiontype.php'); require_once($CFG->dirroot . '/question/type/algebra/parser.php'); - + // Override the default number of answers and the number to add to avoid clutter. // Algebra questions will likely not have huge number of different answers... define("SYMB_QUESTION_NUMANS_START", 2); @@ -33,17 +33,17 @@ class qtype_algebra_edit_form extends question_edit_form { * @param MoodleQuickForm $mform the form being built. */ protected function definition_inner($mform) { - // Add the select control which will select the comparison type to use - $mform->addElement('select', 'compareby', get_string('compareby','qtype_algebra'), - array( "sage" => get_string('comparesage', 'qtype_algebra'), - "eval" => get_string('compareeval', 'qtype_algebra'), - "equiv" => get_string('compareequiv','qtype_algebra') - )); + global $CFG; + // Add the select control which will select the comparison type to use + $mform->addElement('select', 'compareby', get_string('compareby','qtype_algebra'), + array( "sage" => get_string('comparesage', 'qtype_algebra'), + "eval" => get_string('compareeval', 'qtype_algebra'), + "equiv" => get_string('compareequiv','qtype_algebra') + )); $mform->addHelpButton('compareby', 'compareby', 'qtype_algebra'); - $mform->setDefault('compareby','eval'); - + $mform->setDefault('compareby',$CFG->qtype_algebra_method); - // Add the control to select the number of checks to perform + // Add the control to select the number of checks to perform // First create an array with all the allowed values. We will then use this array // with the array_combine function to create a single array where the keys are the // same as the array values @@ -51,29 +51,29 @@ class qtype_algebra_edit_form extends question_edit_form { '10', '20', '30', '50', '70', '100', '200', '300', '500', '700', '1000'); // Add the select element using the array_combine method discussed above - $mform->addElement('select', 'nchecks', get_string('nchecks','qtype_algebra'), + $mform->addElement('select', 'nchecks', get_string('nchecks','qtype_algebra'), array_combine($chk_array,$chk_array)); $mform->addHelpButton('nchecks', 'nchecks', 'qtype_algebra'); - // Set the default number of checks to perform + // Set the default number of checks to perform $mform->setDefault('nchecks','10'); - + // Add the box to set the tolerance to use when performing evaluation checks $mform->addElement('text', 'tolerance', get_string('tolerance','qtype_algebra')); - $mform->addHelpButton('tolerance', 'tolerance', 'qtype_algebra'); + $mform->addHelpButton('tolerance', 'tolerance', 'qtype_algebra'); $mform->setType('tolerance', PARAM_NUMBER); $mform->setDefault('tolerance','0.001'); - + // Add an entry for the answer box prefix $mform->addElement('text', 'answerprefix', get_string('answerprefix','qtype_algebra'),array('size'=>55)); - $mform->addHelpButton('answerprefix', 'answerprefix', 'qtype_algebra'); + $mform->addHelpButton('answerprefix', 'answerprefix', 'qtype_algebra'); $mform->setType('answerprefix', PARAM_RAW); - + // Add an entry for a disallowed expression $mform->addElement('text', 'disallow', get_string('disallow','qtype_algebra'),array('size'=>55)); - $mform->addHelpButton('disallow', 'disallow', 'qtype_algebra'); + $mform->addHelpButton('disallow', 'disallow', 'qtype_algebra'); $mform->setType('disallow', PARAM_RAW); - + // Create an array which will store the function checkboxes $func_group=array(); // Create an array to add spacers between the boxes @@ -90,50 +90,50 @@ class qtype_algebra_edit_form extends question_edit_form { $spacers[]=str_repeat(' ',8-strlen($func)); } } - // Create and add the group of function controls to the form + // Create and add the group of function controls to the form $mform->addGroup($func_group,'allowedfuncs',get_string('allowedfuncs','qtype_algebra'),$spacers,true); - $mform->addHelpButton('allowedfuncs', 'allowedfuncs', 'qtype_algebra'); + $mform->addHelpButton('allowedfuncs', 'allowedfuncs', 'qtype_algebra'); $mform->disabledIf('allowedfuncs','allowedfuncs[all]','checked'); $mform->setDefault('allowedfuncs[all]','checked'); - - $mform->addElement('static', 'variablesinstruct', + + $mform->addElement('static', 'variablesinstruct', get_string('variables', 'qtype_algebra'), get_string('filloutonevariable', 'qtype_algebra')); - $mform->closeHeaderBefore('variablesinstruct'); - // Create the array for the list of variables used in the question - $repeated=array(); - // Create the array for the list of repeated options used by the variable subforms + $mform->closeHeaderBefore('variablesinstruct'); + // Create the array for the list of variables used in the question + $repeated=array(); + // Create the array for the list of repeated options used by the variable subforms $repeatedoptions = array(); - - // Add the form elements to enter the variables + + // Add the form elements to enter the variables $repeated[] =& $mform->createElement('header','variablehdr',get_string('variableno','qtype_algebra','{no}')); //$repeatedoptions['variablehdr']['helpbutton'] = array('variable',get_string('variable','qtype_algebra'), // 'qtype_algebra'); - $repeated[] =& $mform->createElement('text','variable',get_string('variablename','qtype_algebra'),array('size'=>20)); + $repeated[] =& $mform->createElement('text','variable',get_string('variablename','qtype_algebra'),array('size'=>20)); $mform->setType('variable', PARAM_RAW); - $repeated[] =& $mform->createElement('text','varmin',get_string('varmin','qtype_algebra'),array('size'=>20)); - $mform->setType('varmin', PARAM_RAW); + $repeated[] =& $mform->createElement('text','varmin',get_string('varmin','qtype_algebra'),array('size'=>20)); + $mform->setType('varmin', PARAM_RAW); $repeatedoptions['varmin']['default'] = ''; - $repeated[] =& $mform->createElement('text','varmax',get_string('varmax','qtype_algebra'),array('size'=>20)); - $mform->setType('varmax', PARAM_RAW); + $repeated[] =& $mform->createElement('text','varmax',get_string('varmax','qtype_algebra'),array('size'=>20)); + $mform->setType('varmax', PARAM_RAW); $repeatedoptions['varmax']['default'] = ''; - // Get the current number of variables defined, if any - if (isset($this->question->options)) { + // Get the current number of variables defined, if any + if (isset($this->question->options)) { $countvars = count($this->question->options->variables); } else { $countvars = 0; } - // Come up with the number of variable entries to add to the form at the start + // Come up with the number of variable entries to add to the form at the start if ($this->question->formoptions->repeatelements){ $repeatsatstart = (SYMB_QUESTION_NUMVAR_START > ($countvars + SYMB_QUESTION_NUMVAR_ADD))? - SYMB_QUESTION_NUMVAR_START : ($countvars + SYMB_QUESTION_NUMVAR_ADD); + SYMB_QUESTION_NUMVAR_START : ($countvars + SYMB_QUESTION_NUMVAR_ADD); } else { $repeatsatstart = $countvars; } $this->repeat_elements($repeated, $repeatsatstart, $repeatedoptions, 'novariables', 'addvariables', - SYMB_QUESTION_NUMVAR_ADD, get_string('addmorevariableblanks', 'qtype_algebra')); - + SYMB_QUESTION_NUMVAR_ADD, get_string('addmorevariableblanks', 'qtype_algebra')); + $mform->addElement('static', 'answersinstruct', get_string('correctanswers', 'qtype_algebra'), get_string('filloutoneanswer', 'qtype_algebra')); @@ -146,55 +146,55 @@ class qtype_algebra_edit_form extends question_edit_form { } - protected function data_preprocessing($question) { + protected function data_preprocessing($question) { $question = parent::data_preprocessing($question); $question = $this->data_preprocessing_answers($question); $question = $this->data_preprocessing_hints($question); if (!empty($question->options)) { $question->compareby = $question->options->compareby; - $question->nchecks = $question->options->nchecks; - $question->tolerance = $question->options->tolerance; - $question->allowedfuncs = $question->options->allowedfuncs; - $question->disallow = $question->options->disallow; - $question->answerprefix = $question->options->answerprefix; + $question->nchecks = $question->options->nchecks; + $question->tolerance = $question->options->tolerance; + $question->allowedfuncs = $question->options->allowedfuncs; + $question->disallow = $question->options->disallow; + $question->answerprefix = $question->options->answerprefix; } return $question; } /** * Sets the existing values into the form for the question specific data. - * - * This method copies the data from the existing database record into the form fields as default - * values for the various elements. + * + * This method copies the data from the existing database record into the form fields as default + * values for the various elements. * * @param $question the question object from the database being used to fill the form */ function set_data($question) { - // Check to see if there are any existing question options, if not then just call - // the base class set data method and exit + // Check to see if there are any existing question options, if not then just call + // the base class set data method and exit if (!isset($question->options)) { - return parent::set_data($question); - } - - // Now we do exactly the same for the variables... - $vars = $question->options->variables; - // If we found any variables then loop over them using a numerical key to provide an index - // to the arrays we need to access in the form - if (count($vars)) { - $key = 0; - foreach ($vars as $var) { - // For every variable set the default values - $default_values['variable['.$key.']'] = $var->name; - // Only set the min and max defaults if this variable has a range - if($var->min!='') { - $default_values['varmin['.$key.']'] = $var->min; - $default_values['varmax['.$key.']'] = $var->max; - } - $key++; - } - } - + return parent::set_data($question); + } + + // Now we do exactly the same for the variables... + $vars = $question->options->variables; + // If we found any variables then loop over them using a numerical key to provide an index + // to the arrays we need to access in the form + if (count($vars)) { + $key = 0; + foreach ($vars as $var) { + // For every variable set the default values + $default_values['variable['.$key.']'] = $var->name; + // Only set the min and max defaults if this variable has a range + if($var->min!='') { + $default_values['varmin['.$key.']'] = $var->min; + $default_values['varmax['.$key.']'] = $var->max; + } + $key++; + } + } + // Add the default values for the allowed functions controls // First check to see if there are any allowed functions defined if(count($question->options->allowedfuncs)>0) { @@ -215,40 +215,40 @@ class qtype_algebra_edit_form extends question_edit_form { else { $default_values['allowedfuncs[all]']=1; } - - // Add the default values to the question object in a form which the parent - // set data method will be able to use to find the default values - $question = (object)((array)$question + $default_values); - - // Finally call the parent set data method to handle everything else + + // Add the default values to the question object in a form which the parent + // set data method will be able to use to find the default values + $question = (object)((array)$question + $default_values); + + // Finally call the parent set data method to handle everything else parent::set_data($question); } - + /** * Validates the form data ensuring there are no obvious errors in the submitted data. - * - * This method performs some basic sanity checks on the form data before it gets converted - * into a database record. + * + * This method performs some basic sanity checks on the form data before it gets converted + * into a database record. * * @param $data the data from the form which needs to be checked - * @param $files some files - I don't know what this is for! - files defined in the form?? + * @param $files some files - I don't know what this is for! - files defined in the form?? */ public function validation($data, $files) { - // Call the base class validation method and keep any errors it generates + // Call the base class validation method and keep any errors it generates $errors = parent::validation($data, $files); - + // Regular expression string to match a number $renumber='/([+-]*(([0-9]+\.[0-9]*)|([0-9]+)|(\.[0-9]+))|'. '(([0-9]+\.[0-9]*)|([0-9]+)|(\.[0-9]+))E([-+]?\d+))/A'; - - // Perform sanity checks on the variables. + + // Perform sanity checks on the variables. $vars = $data['variable']; // Create an array of defined variables $varlist=array(); foreach ($vars as $key => $var) { $trimvar = trim($var); - $trimmin = trim($data['varmin'][$key]); - $trimmax = trim($data['varmax'][$key]); + $trimmin = trim($data['varmin'][$key]); + $trimmax = trim($data['varmax'][$key]); // Check that there is a valid variable name otherwise skip if ($trimvar == '') { continue; @@ -294,7 +294,7 @@ class qtype_algebra_edit_form extends question_edit_form { $errors['variable[0]'] = get_string('notenoughvars', 'qtype_algebra'); } - // Now perform the sanity checks on the answers + // Now perform the sanity checks on the answers // Create a parser which we will use to check that the answers are understandable $p = new qtype_algebra_parser; $answers = $data['answer']; @@ -321,7 +321,7 @@ class qtype_algebra_edit_form extends question_edit_form { // Do this by looking for a non-empty array to be returned from the array_diff // between the list of all declared variables and the variables in this answer if($d=array_diff($tmpvars,$varlist)) { - $errors['answer['.$key.']'] = get_string('undefinedvar','qtype_algebra',"'".implode("', '",$d)."'"); + $errors['answer['.$key.']'] = get_string('undefinedvar','qtype_algebra',"'".implode("', '",$d)."'"); } // Do the same for functions which we did for variables $ansfuncs=array_merge($ansfuncs,array_diff($expr->get_functions(),$ansfuncs)); @@ -349,7 +349,7 @@ class qtype_algebra_edit_form extends question_edit_form { if ($maxgrade == false) { $errors['fraction[0]'] = get_string('fractionsnomax', 'question'); } - + // Check for variables which are defined but never used. // Do this by looking for a non-empty array to be returned from array_diff. if($d=array_diff($varlist,$ansvars)) { @@ -362,17 +362,16 @@ class qtype_algebra_edit_form extends question_edit_form { } } } - + // Check that the tolerance is greater than or equal to zero if($data['tolerance']<0) { $errors['tolerance']=get_string('toleranceltzero','qtype_algebra'); } - + return $errors; } - + public function qtype() { return 'algebra'; } } - diff --git a/lang/en/qtype_algebra.php b/lang/en/qtype_algebra.php index 814aea8..dd09a97 100644 --- a/lang/en/qtype_algebra.php +++ b/lang/en/qtype_algebra.php @@ -29,15 +29,16 @@ $string['compareby_help'] = 'This selects the method by which the students\' res to all the questions answers. The different possibilities are: SAGE: uses the Open Source <a href="http://www.sagemath.org/">SAGE</a> -mathematics software to perform a full symbolic algebraic comparison. +mathematics software to perform a full symbolic algebraic comparison. Evaluation: This method generates random numbers for the question variables and then evaluates both the student response and the question\'s answer for that set of values. -Equivalence: +Equivalence: This is the simplest of all the methods. It will only perform the most basic of comparisons between expressions.'; +$string['defaultmethod'] = 'Default comparison method'; $string['compareby'] = 'Comparison Algorithm'; $string['comparesage'] = 'SAGE'; $string['compareeval'] = 'Evaluation'; diff --git a/question.php b/question.php index 12d27dd..a3c7dfa 100644 --- a/question.php +++ b/question.php @@ -217,11 +217,10 @@ class qtype_algebra_question extends question_graded_by_strategy * @return boolean true if the response matches the answer, false otherwise */ function test_response_by_sage($response, $answer) { - // TODO: Store server information in the Moodle configuration $request=array( - 'host' => 'localhost', - 'port' => 7777, - 'uri' => '' + 'host' => $CFG->qtype_algebra_host, + 'port' => $CFG->qtype_algebra_port, + 'uri' => $CFG->qtype_algebra_uri, ); // Sets the name of the method to call to full_symbolic_compare $request['method']='full_symbolic_compare'; diff --git a/settings.php b/settings.php index a0f5423..43b4ffa 100644 --- a/settings.php +++ b/settings.php @@ -1,11 +1,16 @@ -<?php
-defined('MOODLE_INTERNAL') || die;
-
-if ($ADMIN->fulltree) {
- //host
- $settings->add(new admin_setting_configtext('qtype_algebra_host', get_string('host', 'qtype_algebra'), '', 'localhost', PARAM_TEXT));
- //port
- $settings->add(new admin_setting_configtext('qtype_algebra_port', get_string('port', 'qtype_algebra'), '', 7777, PARAM_INT));
- //host
- $settings->add(new admin_setting_configtext('qtype_algebra_uri', get_string('uri', 'qtype_algebra'), '', '', PARAM_TEXT));
-}
+<?php +defined('MOODLE_INTERNAL') || die; + +if ($ADMIN->fulltree) { + // Default evaluation method. + $settings->add(new admin_setting_configselect('qtype_algebra_method', new lang_string('defaultmethod', 'qtype_algebra'), new lang_string('compareby', 'qtype_algebra'), 'eval', + array('sage' => new lang_string('comparesage', 'qtype_algebra'), + 'eval' => new lang_string('compareeval', 'qtype_algebra'), + 'equiv' => new lang_string('compareequiv', 'qtype_algebra')))); + // SAGE server connection host. + $settings->add(new admin_setting_configtext('qtype_algebra_host', get_string('host', 'qtype_algebra'), '', 'localhost', PARAM_TEXT)); + // SAGE server connection port. + $settings->add(new admin_setting_configtext('qtype_algebra_port', get_string('port', 'qtype_algebra'), '', 7777, PARAM_INT)); + // SAGE server connection uri. + $settings->add(new admin_setting_configtext('qtype_algebra_uri', get_string('uri', 'qtype_algebra'), '', '', PARAM_TEXT)); +} diff --git a/version.php b/version.php index 81af712..61844b5 100644 --- a/version.php +++ b/version.php @@ -1,5 +1,10 @@ <?php defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2011072800; -$plugin->requires = 2011060313; +$plugin->component = 'qtype_algebra'; +$plugin->version = 2012061700; + +$plugin->requires = 2012061700; + +$plugin->maturity = MATURITY_STABLE; + |