Requires composer update to install new serializer.pull/2606/head
parent
2d4b5b8858
commit
9ce5eb789a
@ -0,0 +1,100 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* This class handles the SCORM export of matching questions. |
||||||
|
* |
||||||
|
* @package chamilo.exercise.scorm |
||||||
|
*/ |
||||||
|
class ScormAnswerMatching extends Answer |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Export the question part as a matrix-choice, with only one possible answer per line. |
||||||
|
* |
||||||
|
* @author Amand Tihon <amand@alrj.org> |
||||||
|
*/ |
||||||
|
public function export() |
||||||
|
{ |
||||||
|
$js = ''; |
||||||
|
// prepare list of right proposition to allow |
||||||
|
// - easiest display |
||||||
|
// - easiest randomisation if needed one day |
||||||
|
// (here I use array_values to change array keys from $code1 $code2 ... to 0 1 ...) |
||||||
|
// get max length of displayed array |
||||||
|
$nbrAnswers = $this->selectNbrAnswers(); |
||||||
|
$counter = 1; |
||||||
|
$questionId = $this->questionJSId; |
||||||
|
$jstmpw = 'questions_answers_ponderation['.$questionId.'] = new Array();'."\n"; |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.'][0] = 0;'."\n"; |
||||||
|
|
||||||
|
// Options (A, B, C, ...) that will be put into the list-box |
||||||
|
$options = []; |
||||||
|
$letter = 'A'; |
||||||
|
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) { |
||||||
|
$answerCorrect = $this->isCorrect($answerId); |
||||||
|
$answer = $this->selectAnswer($answerId); |
||||||
|
$realAnswerId = $this->selectAutoId($answerId); |
||||||
|
if (!$answerCorrect) { |
||||||
|
$options[$realAnswerId]['Lettre'] = $letter; |
||||||
|
// answers that will be shown at the right side |
||||||
|
$options[$realAnswerId]['Reponse'] = $answer; |
||||||
|
$letter++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$html = []; |
||||||
|
$jstmp = ''; |
||||||
|
$jstmpc = ''; |
||||||
|
|
||||||
|
// Answers |
||||||
|
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) { |
||||||
|
$identifier = 'question_'.$questionId.'_matching_'; |
||||||
|
$answer = $this->selectAnswer($answerId); |
||||||
|
$answerCorrect = $this->isCorrect($answerId); |
||||||
|
$weight = $this->selectWeighting($answerId); |
||||||
|
$jstmp .= $answerId.','; |
||||||
|
|
||||||
|
if ($answerCorrect) { |
||||||
|
$html[] = '<tr class="option_row">'; |
||||||
|
//$html[] = '<td width="40%" valign="top"><b>'.$counter.'</b>. '.$answer."</td>"; |
||||||
|
$html[] = '<td width="40%" valign="top"> '.$answer."</td>"; |
||||||
|
$html[] = '<td width="20%" align="center"> '; |
||||||
|
$html[] = '<select name="'.$identifier.$counter.'" id="'.$identifier.$counter.'">'; |
||||||
|
$html[] = ' <option value="0">--</option>'; |
||||||
|
// fills the list-box |
||||||
|
foreach ($options as $key => $val) { |
||||||
|
$html[] = '<option value="'.$key.'">'.$val['Lettre'].'</option>'; |
||||||
|
} |
||||||
|
|
||||||
|
$html[] = '</select> </td>'; |
||||||
|
$html[] = '<td width="40%" valign="top">'; |
||||||
|
foreach ($options as $key => $val) { |
||||||
|
$html[] = '<b>'.$val['Lettre'].'.</b> '.$val['Reponse'].'<br />'; |
||||||
|
} |
||||||
|
$html[] = '</td></tr>'; |
||||||
|
|
||||||
|
$jstmpc .= '['.$answerCorrect.','.$counter.'],'; |
||||||
|
|
||||||
|
$myWeight = explode('@', $weight); |
||||||
|
if (count($myWeight) == 2) { |
||||||
|
$weight = $myWeight[0]; |
||||||
|
} else { |
||||||
|
$weight = $myWeight[0]; |
||||||
|
} |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$counter.'] = '.$weight.";\n"; |
||||||
|
$counter++; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$js .= 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'."\n"; |
||||||
|
$js .= 'questions_answers_correct['.$questionId.'] = new Array('.substr($jstmpc, 0, -1).');'."\n"; |
||||||
|
$js .= 'questions_types['.$questionId.'] = \'matching\';'."\n"; |
||||||
|
$js .= $jstmpw; |
||||||
|
|
||||||
|
$htmlResult = '<tr><td colspan="2"><table id="question_'.$questionId.'" width="100%">'; |
||||||
|
$htmlResult .= implode("\n", $html); |
||||||
|
$htmlResult .= '</table></td></tr>'."\n"; |
||||||
|
|
||||||
|
return [$js, $htmlResult]; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,119 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* This class handles the export to SCORM of a multiple choice question |
||||||
|
* (be it single answer or multiple answers). |
||||||
|
* |
||||||
|
* @package chamilo.exercise.scorm |
||||||
|
*/ |
||||||
|
class ScormAnswerMultipleChoice extends Answer |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Return HTML code for possible answers. |
||||||
|
*/ |
||||||
|
public function export() |
||||||
|
{ |
||||||
|
$js = []; |
||||||
|
$type = $this->getQuestionType(); |
||||||
|
$questionId = $this->questionJSId; |
||||||
|
$jstmpw = 'questions_answers_ponderation['.$questionId.'] = new Array();'; |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.'][0] = 0;'; |
||||||
|
$jstmpw .= 'questions_answers_correct['.$questionId.'] = new Array();'; |
||||||
|
$html = []; |
||||||
|
|
||||||
|
//not sure if we are going to export also the MULTIPLE_ANSWER_COMBINATION to SCORM |
||||||
|
//if ($type == MCMA || $type == MULTIPLE_ANSWER_COMBINATION ) { |
||||||
|
if ($type == MCMA) { |
||||||
|
$id = 1; |
||||||
|
$jstmp = ''; |
||||||
|
$jstmpc = ''; |
||||||
|
foreach ($this->answer as $i => $answer) { |
||||||
|
$identifier = 'question_'.$questionId.'_multiple_'.$i; |
||||||
|
$html[] = |
||||||
|
'<tr> |
||||||
|
<td align="center" width="5%"> |
||||||
|
<input name="'.$identifier.'" id="'.$identifier.'" value="'.$i.'" type="checkbox" /> |
||||||
|
</td> |
||||||
|
<td width="95%"> |
||||||
|
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label> |
||||||
|
</td> |
||||||
|
</tr>'; |
||||||
|
|
||||||
|
$jstmp .= $i.','; |
||||||
|
if ($this->correct[$i]) { |
||||||
|
$jstmpc .= $i.','; |
||||||
|
} |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].";"; |
||||||
|
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';'; |
||||||
|
$id++; |
||||||
|
} |
||||||
|
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'."\n"; |
||||||
|
$js[] = 'questions_types['.$questionId.'] = \'mcma\';'."\n"; |
||||||
|
$js[] = $jstmpw; |
||||||
|
} elseif ($type == MULTIPLE_ANSWER_COMBINATION) { |
||||||
|
$js = ''; |
||||||
|
$id = 1; |
||||||
|
$jstmp = ''; |
||||||
|
$jstmpc = ''; |
||||||
|
foreach ($this->answer as $i => $answer) { |
||||||
|
$identifier = 'question_'.$questionId.'_exact_'.$i; |
||||||
|
$html[] = |
||||||
|
'<tr> |
||||||
|
<td align="center" width="5%"> |
||||||
|
<input name="'.$identifier.'" id="'.$identifier.'" value="'.$i.'" type="checkbox" /> |
||||||
|
</td> |
||||||
|
<td width="95%"> |
||||||
|
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label> |
||||||
|
</td> |
||||||
|
</tr>'; |
||||||
|
|
||||||
|
$jstmp .= $i.','; |
||||||
|
if ($this->correct[$i]) { |
||||||
|
$jstmpc .= $i.','; |
||||||
|
} |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].';'; |
||||||
|
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';'; |
||||||
|
$id++; |
||||||
|
} |
||||||
|
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'; |
||||||
|
$js[] = 'questions_types['.$questionId.'] = "exact";'; |
||||||
|
$js[] = $jstmpw; |
||||||
|
} else { |
||||||
|
$id = 1; |
||||||
|
$jstmp = ''; |
||||||
|
$jstmpc = ''; |
||||||
|
foreach ($this->answer as $i => $answer) { |
||||||
|
$identifier = 'question_'.$questionId.'_unique_'.$i; |
||||||
|
$identifier_name = 'question_'.$questionId.'_unique_answer'; |
||||||
|
$html[] = |
||||||
|
'<tr> |
||||||
|
<td align="center" width="5%"> |
||||||
|
<input name="'.$identifier_name.'" id="'.$identifier.'" value="'.$i.'" type="checkbox"/> |
||||||
|
</td> |
||||||
|
<td width="95%"> |
||||||
|
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label> |
||||||
|
</td> |
||||||
|
</tr>'; |
||||||
|
$jstmp .= $i.','; |
||||||
|
if ($this->correct[$i]) { |
||||||
|
$jstmpc .= $i; |
||||||
|
} |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].';'; |
||||||
|
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';'; |
||||||
|
$id++; |
||||||
|
} |
||||||
|
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'; |
||||||
|
$js[] = 'questions_types['.$questionId.'] = \'mcua\';'; |
||||||
|
$js[] = $jstmpw; |
||||||
|
} |
||||||
|
|
||||||
|
$htmlResult = '<tr><td colspan="2"><table id="question_'.$questionId.'" width="100%">'; |
||||||
|
$htmlResult .= implode("\n", $html); |
||||||
|
$htmlResult .= '</table></td></tr>'; |
||||||
|
|
||||||
|
$js = implode("\n", $js); |
||||||
|
|
||||||
|
return [$js, $htmlResult]; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,56 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* This class handles the SCORM export of true/false questions. |
||||||
|
* |
||||||
|
* @package chamilo.exercise.scorm |
||||||
|
*/ |
||||||
|
class ScormAnswerTrueFalse extends Answer |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Return the XML flow for the possible answers. |
||||||
|
* That's one <response_lid>, containing several <flow_label>. |
||||||
|
* |
||||||
|
* @author Amand Tihon <amand@alrj.org> |
||||||
|
*/ |
||||||
|
public function export() |
||||||
|
{ |
||||||
|
$js = ''; |
||||||
|
$html = '<tr><td colspan="2"><table width="100%">'; |
||||||
|
$identifier = 'question_'.$this->questionJSId.'_tf'; |
||||||
|
$identifier_true = $identifier.'_true'; |
||||||
|
$identifier_false = $identifier.'_false'; |
||||||
|
$html .= |
||||||
|
'<tr> |
||||||
|
<td align="center" width="5%"> |
||||||
|
<input name="'.$identifier_true.'" id="'.$identifier_true.'" value="'.$this->trueGrade.'" type="radio" /> |
||||||
|
</td> |
||||||
|
<td width="95%"> |
||||||
|
<label for="'.$identifier_true.'">'.get_lang('True').'</label> |
||||||
|
</td> |
||||||
|
</tr>'; |
||||||
|
$html .= |
||||||
|
'<tr> |
||||||
|
<td align="center" width="5%"> |
||||||
|
<input name="'.$identifier_false.'" id="'.$identifier_false.'" value="'.$this->falseGrade.'" type="radio" /> |
||||||
|
</td> |
||||||
|
<td width="95%"> |
||||||
|
<label for="'.$identifier_false.'">'.get_lang('False').'</label> |
||||||
|
</td> |
||||||
|
</tr></table></td></tr>'; |
||||||
|
$js .= 'questions_answers['.$this->questionJSId.'] = new Array(\'true\',\'false\');'."\n"; |
||||||
|
$js .= 'questions_types['.$this->questionJSId.'] = \'tf\';'."\n"; |
||||||
|
if ($this->response === 'TRUE') { |
||||||
|
$js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'true\');'."\n"; |
||||||
|
} else { |
||||||
|
$js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'false\');'."\n"; |
||||||
|
} |
||||||
|
$jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n"; |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n"; |
||||||
|
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][1] = '.$this->weighting[1].";\n"; |
||||||
|
$js .= $jstmpw; |
||||||
|
|
||||||
|
return [$js, $html]; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
var questions = new Array(); |
||||||
|
var questions_answers = new Array(); |
||||||
|
var questions_answers_correct = new Array(); |
||||||
|
var questions_types = new Array(); |
||||||
|
var questions_score_max = new Array(); |
||||||
|
var questions_answers_ponderation = new Array(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Adds the event listener |
||||||
|
*/ |
||||||
|
function addListeners(e) { |
||||||
|
loadPage(); |
||||||
|
var myButton = document.getElementById('chamilo_scorm_submit'); |
||||||
|
addEvent(myButton, 'click', doQuit, false); |
||||||
|
addEvent(myButton, 'click', disableButton, false); |
||||||
|
addEvent(window, 'unload', unloadPage, false); |
||||||
|
} |
||||||
|
|
||||||
|
/** Disables the submit button on SCORM result submission **/ |
||||||
|
function disableButton() { |
||||||
|
var mybtn = document.getElementById('chamilo_scorm_submit'); |
||||||
|
mybtn.setAttribute('disabled', 'disabled'); |
||||||
|
} |
||||||
|
|
||||||
|
addEvent(window,'load', addListeners, false); |
||||||
Loading…
Reference in new issue