xhtml validity fix for static element type

qtype calculated form - started
This commit is contained in:
jamiesensei
2007-01-10 05:05:26 +00:00
parent 4f61eea0bf
commit 9aa022feef
4 changed files with 177 additions and 60 deletions
+12
View File
@@ -0,0 +1,12 @@
<?php
$string['correctanswershows'] = 'Correct answer shows';
$string['correctanswershowsformat'] = 'Format';
$string['tolerance'] = 'Tolerance &plusmn;';
$string['addmoreanswerblanks'] = 'Add another answer blank.';
$string['addmoreunitblanks'] = 'Blanks for $a More Units';
$string['answerhdr'] = 'Answer $a';
$string['atleastoneanswer'] = 'You need to provide at least one answer.';
$string['mustbenumeric'] = 'You must enter a number here.';
$string['mustnotbenumeric'] = 'This can\'t be a number.';
$string['youmustenteramultiplierhere'] = 'You must enter a multiplier here.';
?>
+5
View File
@@ -8,6 +8,7 @@ require_once("HTML/QuickForm/static.php");
* @access public
*/
class MoodleQuickForm_static extends HTML_QuickForm_static{
var $_elementTemplateType='static';
/**
* html for help button, if empty then no help
*
@@ -44,5 +45,9 @@ class MoodleQuickForm_static extends HTML_QuickForm_static{
function getHelpButton(){
return $this->_helpbutton;
}
function getElementTemplateType(){
return $this->_elementTemplateType;
}
}
?>
+18 -11
View File
@@ -295,7 +295,9 @@ class moodleform {
static $validated = null; // one validation is enough
$mform =& $this->_form;
if ($validated === null) {
if ($this->no_submit_button_pressed()){
return false;
} elseif ($validated === null) {
$internal_val = $mform->validate();
$moodle_val = $this->validation($mform->exportValues(null, true));
if ($moodle_val !== true) {
@@ -319,11 +321,7 @@ class moodleform {
}
$validated = ($internal_val and $moodle_val and $file_val);
}
if ($this->no_submit_button_pressed()){
return false;
} else {
return $validated;
}
return $validated;
}
/**
@@ -506,7 +504,15 @@ class moodleform {
$mform->setHelpButton($realelementname, $params);
break;
case 'disabledif' :
$mform->disabledIf($realelementname, $params[0], $params[1], $params[2]);
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'disabledIf'), $params);
break;
case 'rule' :
if (is_string($params)){
$params = array(null, $params, null, 'client');
}
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'addRule'), $params);
break;
}
@@ -1279,8 +1285,10 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
function MoodleQuickForm_Renderer(){
// switch next two lines for ol li containers for form items.
// $this->_elementTemplates=array('default'=>"\n\t\t<li class=\"fitem\"><label>{label}{help}<!-- BEGIN required -->{req}<!-- END required --></label><div class=\"qfelement<!-- BEGIN error --> error<!-- END error --> {type}\"><!-- BEGIN error --><span class=\"error\">{error}</span><br /><!-- END error -->{element}</div></li>");
$this->_elementTemplates = array('default'=>"\n\t\t<div class=\"fitem {advanced}<!-- BEGIN required --> required<!-- END required -->\"><span class=\"fitemtitle\"><label>{label}<!-- BEGIN required -->{req}<!-- END required -->{advancedimg}</label>{help}</span><div class=\"felement {type}<!-- BEGIN error --> error<!-- END error -->\"><!-- BEGIN error --><span class=\"error\" id=\"id_error_{name}\">{error}</span><br /><!-- END error -->{element}</div></div>",
'fieldset'=>"\n\t\t<div class=\"fitem {advanced}<!-- BEGIN required --> required<!-- END required -->\"><span class=\"fitemtitle\"><div class=\"fgrouplabel\">{label}<!-- BEGIN required -->{req}<!-- END required -->{advancedimg}</div>{help}</span><fieldset class=\"felement {type}<!-- BEGIN error --> error<!-- END error -->\"><!-- BEGIN error --><span class=\"error\" id=\"id_error_{name}\">{error}</span><br /><!-- END error -->{element}</fieldset></div>");
$this->_elementTemplates = array(
'default'=>"\n\t\t<div class=\"fitem {advanced}<!-- BEGIN required --> required<!-- END required -->\"><span class=\"fitemtitle\"><label>{label}<!-- BEGIN required -->{req}<!-- END required -->{advancedimg}</label>{help}</span><div class=\"felement {type}<!-- BEGIN error --> error<!-- END error -->\"><!-- BEGIN error --><span class=\"error\">{error}</span><br /><!-- END error -->{element}</div></div>",
'fieldset'=>"\n\t\t<div class=\"fitem {advanced}<!-- BEGIN required --> required<!-- END required -->\"><span class=\"fitemtitle\"><div class=\"fgrouplabel\">{label}<!-- BEGIN required -->{req}<!-- END required -->{advancedimg}</div>{help}</span><fieldset class=\"felement {type}<!-- BEGIN error --> error<!-- END error -->\"><!-- BEGIN error --><span class=\"error\">{error}</span><br /><!-- END error -->{element}</fieldset></div>",
'static'=>"\n\t\t<div class=\"fitem {advanced}<!-- BEGIN required --> required<!-- END required -->\"><span class=\"fitemtitle\"><div class=\"fstaticlabel\">{label}<!-- BEGIN required -->{req}<!-- END required -->{advancedimg}</div>{help}</span><div class=\"felement {type}<!-- BEGIN error --> error<!-- END error -->\"><!-- BEGIN error --><span class=\"error\">{error}</span><br /><!-- END error -->{element}</div></div>");
parent::HTML_QuickForm_Renderer_Tableless();
}
@@ -1492,5 +1500,4 @@ MoodleQuickForm::registerElementType('header', "$CFG->libdir/form/header.php", '
MoodleQuickForm::registerElementType('submit', "$CFG->libdir/form/submit.php", 'MoodleQuickForm_submit');
MoodleQuickForm::registerElementType('questioncategory', "$CFG->libdir/form/questioncategory.php", 'MoodleQuickForm_questioncategory');
MoodleQuickForm::registerElementType('advcheckbox', "$CFG->libdir/form/advcheckbox.php", 'MoodleQuickForm_advcheckbox');
?>
?>
+142 -49
View File
@@ -12,56 +12,81 @@
* calculated editing form definition.
*/
class question_edit_calculated_form extends question_edit_form {
/**
* Handle to the question type for this question.
*
* @var question_calculated_qtype
*/
var $qtypeobj;
/**
* Add question-type specific form fields.
*
* @param object $mform the form being built.
* @param MoodleQuickForm $mform the form being built.
*/
function definition_inner(&$mform) {
$mform->addElement('text', 'answers[0]', get_string("correctanswerformula", "quiz"));
$mform->setType('answers[0]', PARAM_NOTAGS);
global $QTYPES;
$this->qtypeobj = $QTYPES['calculated'];
$mform->addElement('hidden', 'fraction[0]', '1.0');
$mform->addElement('text', 'tolerance[0]', get_string("tolerance", "quiz"));
$mform->setType('tolerance[0]', PARAM_NOTAGS);
$mform->addElement('select', 'shuffleanswers', get_string('shuffleanswers', 'qtype_calculated') );
$mform->setHelpButton('shuffleanswers', array('calculatedshuffle', get_string('shuffleanswers','qtype_calculated'), 'quiz'));
/* $mform->addElement('static', 'answersinstruct', get_string('choices', 'qtype_calculated'), get_string('fillouttwochoices', 'qtype_calculated'));
$mform->closeHeaderBefore('answersinstruct');
*/
$creategrades = get_grade_options();
$gradeoptions = $creategrades->gradeoptionsfull;
//------------------------------------------------------------------------------------------
$repeated = array();
$repeated[] =& $mform->createElement('header', 'choicehdr', get_string('choiceno', 'qtype_calculated', '{no}'));
$repeated[] =& $mform->createElement('text', 'answer', get_string('answer', 'quiz'));
$repeated[] =& $mform->createElement('header', 'answerhdr', get_string('answerhdr', 'qtype_calculated', '{no}'));
$repeated[] =& $mform->createElement('text', 'answers', get_string('correctanswerformula', 'quiz'));
$repeatedoptions['answers']['type'] = PARAM_NOTAGS;
$creategrades = get_grade_options();
$gradeoptions = $creategrades->gradeoptions;
$repeated[] =& $mform->createElement('select', 'fraction', get_string('grade'), $gradeoptions);
$repeated[] =& $mform->createElement('htmleditor', 'feedback', get_string('feedback', 'quiz'));
$repeatedoptions['fraction']['default'] = 0;
$repeated[] =& $mform->createElement('text', 'tolerance', get_string('tolerance', 'qtype_calculated'));
$repeatedoptions['tolerance']['type'] = PARAM_NUMBER;
$repeatedoptions['tolerance']['default'] = 0.01;
$repeated[] =& $mform->createElement('select', 'tolerancetype', get_string('tolerancetype', 'quiz'), $this->qtypeobj->tolerance_types());
$repeated[] =& $mform->createElement('select', 'correctanswerlength', get_string('correctanswershows', 'qtype_calculated'), range(0, 9));
$repeatedoptions['correctanswerlength']['default'] = 2;
$answerlengthformats = array('1' => get_string('decimalformat', 'quiz'), '2' => get_string('significantfiguresformat', 'quiz'));
$repeated[] =& $mform->createElement('select', 'correctanswerformat', get_string('correctanswershowsformat', 'qtype_calculated'), $answerlengthformats);
$repeated[] =& $mform->createElement('htmleditor', 'feedback', get_string('feedback', 'quiz'));
$repeatedoptions['feedback']['type'] = PARAM_RAW;
if (isset($this->question->options)){
$countanswers = count($this->question->options->answers);
$count = count($this->question->options->answers);
} else {
$countanswers = 0;
$count = 0;
}
$repeatsatstart = (QUESTION_NUMANS_START > ($countanswers + QUESTION_NUMANS_ADD))?
QUESTION_NUMANS_START : ($countanswers + QUESTION_NUMANS_ADD);
$repeatsatstart = $count + 1;
$this->repeat_elements($repeated, $repeatsatstart, $repeatedoptions, 'noanswers', 'addanswers', 1, get_string('addmoreanswerblanks', 'qtype_calculated'));
//------------------------------------------------------------------------------------------
$repeated = array();
$repeatedoptions = array();
$repeatedoptions['answer']['type'] = PARAM_TEXT;
$repeatedoptions['fraction']['default'] = 0;
$this->repeat_elements($repeated, $repeatsatstart, $repeatedoptions, 'noanswers', 'addanswers', QUESTION_NUMANS_ADD, get_string('addmorechoiceblanks', 'qtype_calculated'));
$repeated[] =& $mform->createElement('header', 'unithdr', get_string('unithdr', 'qtype_numerical', '{no}'));
$mform->addElement('header', 'overallfeedbackhdr', get_string('overallfeedback', 'qtype_calculated'));
$repeated[] =& $mform->createElement('text', 'unit', get_string('unit', 'quiz'));
$repeatedoptions['unit']['type'] = PARAM_NOTAGS;
$mform->addElement('htmleditor', 'correctfeedback', get_string('correctfeedback', 'qtype_calculated'));
$mform->setType('correctfeedback', PARAM_RAW);
$repeated[] =& $mform->createElement('text', 'multiplier', get_string('multiplier', 'quiz'));
$repeatedoptions['multiplier']['type'] = PARAM_NUMBER;
$mform->addElement('htmleditor', 'partiallycorrectfeedback', get_string('partiallycorrectfeedback', 'qtype_calculated'));
$mform->setType('partiallycorrectfeedback', PARAM_RAW);
if (isset($this->question->options)){
$countunits = count($this->question->options->units);
} else {
$countunits = 0;
}
$repeatsatstart = $countunits + 1;
$this->repeat_elements($repeated, $repeatsatstart, $repeatedoptions, 'nounits', 'addunits', 2, get_string('addmoreunitblanks', 'qtype_calculated', '{no}'));
$mform->addElement('htmleditor', 'incorrectfeedback', get_string('incorrectfeedback', 'qtype_calculated'));
$mform->setType('incorrectfeedback', PARAM_RAW);
$firstunit = $mform->getElement('multiplier[0]');
$firstunit->freeze();
$firstunit->setValue('1.0');
$firstunit->setPersistantFreeze(true);
//hidden elements
$mform->addElement('hidden', 'wizardpage', 'question');
}
@@ -71,19 +96,29 @@ class question_edit_calculated_form extends question_edit_form {
if (count($answers)) {
$key = 0;
foreach ($answers as $answer){
$default_values['answer['.$key.']'] = $answer->answer;
$default_values['fraction['.$key.']'] = $answer->fraction;
$default_values['answers['.$key.']'] = $answers->answer;
$default_values['fraction['.$key.']'] = $answers->fraction;
$default_values['tolerance['.$key.']'] = $answers->tolerance;
$default_values['correctanswerlength['.$key.']'] = $answers->correctanswerlength;
$default_values['correctanswerformat['.$key.']'] = $answer->correctanswerformat;
$default_values['feedback['.$key.']'] = $answer->feedback;
$key++;
}
}
$default_values['single'] = $question->options->single;
$default_values['shuffleanswers'] = $question->options->shuffleanswers;
$default_values['correctfeedback'] = $question->options->correctfeedback;
$default_values['partiallycorrectfeedback'] = $question->options->partiallycorrectfeedback;
$default_values['overallincorrectfeedback'] = $question->options->overallincorrectfeedback;
$question = (object)((array)$question + $default_values);
}
$units = array_values($question->options->units);
// make sure the default unit is at index 0
usort($units, create_function('$a, $b', // make sure the default unit is at index 0
'if (1.0 === (float)$a->multiplier) { return -1; } else '.
'if (1.0 === (float)$b->multiplier) { return 1; } else { return 0; }'));
if (count($units)) {
$key = 0;
foreach ($units as $unit){
$default_values['unit['.$key.']'] = $unit->unit;
$default_values['multiplier['.$key.']'] = $unit->multiplier;
$key++;
}
}
$question = (object)((array)$question + $default_values); }
parent::set_defaults($question);
}
@@ -93,21 +128,79 @@ class question_edit_calculated_form extends question_edit_form {
function validation($data){
$errors = array();
$answers = $data['answer'];
$answers = $data['answers'];
$answercount = 0;
foreach ($answers as $answer){
//check grades
/*$totalfraction = 0;
$maxfraction = -1;*/
foreach ($answers as $key => $answer){
//check no of choices
$trimmedanswer = trim($answer);
if (!empty($trimmedanswer)){
$eqerror = qtype_calculated_find_formula_errors($trimmedanswer);
if (FALSE !== $eqerror){
$errors['answers['.$key.']'] = $eqerror;
}
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');
}
$answercount++;
}
//check grades
//TODO how should grade checking work here??
/*if ($answer != '') {
if ($data['fraction'][$key] > 0) {
$totalfraction += $data['fraction'][$key];
}
if ($data['fraction'][$key] > $maxfraction) {
$maxfraction = $data['fraction'][$key];
}
}*/
}
//grade checking :
/// Perform sanity checks on fractional grades
/*if ( ) {
if ($maxfraction != 1) {
$maxfraction = $maxfraction * 100;
$errors['fraction[0]'] = get_string('errfractionsnomax', 'qtype_multichoice', $maxfraction);
}
} else {
$totalfraction = round($totalfraction,2);
if ($totalfraction != 1) {
$totalfraction = $totalfraction * 100;
$errors['fraction[0]'] = get_string('errfractionsaddwrong', 'qtype_multichoice', $totalfraction);
}
}*/
$units = $data['unit'];
if (count($units)) {
foreach ($units as $key => $unit){
if (is_numeric($unit)){
$errors['unit['.$key.']'] = get_string('mustnotbenumeric', 'qtype_calculated');
}
$trimmedunit = trim($unit);
$trimmedmultiplier = trim($data['multiplier'][$key]);
if (!empty($trimmedunit)){
if (empty($trimmedmultiplier)){
$errors['multiplier['.$key.']'] = get_string('youmustenteramultiplierhere', 'qtype_calculated');
}
if (!is_numeric($trimmedmultiplier)){
$errors['multiplier['.$key.']'] = get_string('mustbenumeric', 'qtype_calculated');
}
}
}
}
if ($answercount==0){
$errors['answer[0]'] = get_string('notenoughanswers', 'qtype_calculated', 2);
$errors['answer[1]'] = get_string('notenoughanswers', 'qtype_calculated', 2);
} elseif ($answercount==1){
$errors['answer[1]'] = get_string('notenoughanswers', 'qtype_calculated', 2);
$errors['answers[0]'] = get_string('atleastoneanswer', 'qtype_calculated');
}
return $errors;
}
}