|
@@ -218,6 +218,7 @@ class MoodleImport
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
+ removeDir($destinationDir);
|
|
|
return false;
|
|
|
}
|
|
|
} else {
|
|
@@ -521,11 +522,12 @@ class MoodleImport
|
|
|
case 'match':
|
|
|
return FILL_IN_BLANKS;
|
|
|
break;
|
|
|
+ case 'match':
|
|
|
case 'essay':
|
|
|
return FREE_ANSWER;
|
|
|
break;
|
|
|
case 'truefalse':
|
|
|
- return MULTIPLE_ANSWER_TRUE_FALSE;
|
|
|
+ return UNIQUE_ANSWER_NO_OPTION;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -566,7 +568,7 @@ class MoodleImport
|
|
|
|
|
|
foreach ($questionList as $slot => $subQuestion) {
|
|
|
$qtype = $subQuestion['qtype'];
|
|
|
- $optionsValues[] = $this->processFillBlanks($objAnswer, $subQuestion, $subQuestion['plugin_qtype_'.$qtype.'_question'], $placeholder, $slot + 1);
|
|
|
+ $optionsValues[] = $this->processFillBlanks($objAnswer, $qtype, $subQuestion['plugin_qtype_'.$qtype.'_question'], $placeholder, $slot + 1);
|
|
|
}
|
|
|
|
|
|
$answerOptionsWeight = '::';
|
|
@@ -581,34 +583,77 @@ class MoodleImport
|
|
|
$answerOptionsWeight = substr($answerOptionsWeight, 0, -1);
|
|
|
$answerOptionsSize = substr($answerOptionsSize, 0, -1);
|
|
|
|
|
|
- $suffleAnswers = isset($subQuestion[$qtype.'_values']['shuffleanswers']) ? $subQuestion[$qtype.'_values']['shuffleanswers'] : false;
|
|
|
+ $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@';
|
|
|
+
|
|
|
+ $placeholder = $placeholder.PHP_EOL.$answerOptions;
|
|
|
+
|
|
|
+ // This is a minor trick to clean the question description that in a multianswer is the main placeholder
|
|
|
+ $questionInstance->updateDescription('');
|
|
|
+ // sets the total weighting of the question
|
|
|
+ $questionInstance->updateWeighting($questionWeighting);
|
|
|
+ $questionInstance->save();
|
|
|
+ // saves the answers into the data base
|
|
|
+ $objAnswer->createAnswer($placeholder, 0, '', 0, 1);
|
|
|
+ $objAnswer->save();
|
|
|
+
|
|
|
+ return true;
|
|
|
+ case 'match':
|
|
|
+ $objAnswer = new Answer($questionInstance->id);
|
|
|
+ $placeholder = '';
|
|
|
+
|
|
|
+ $optionsValues = $this->processFillBlanks($objAnswer, 'match', $questionList, $placeholder, 0);
|
|
|
|
|
|
- if ($suffleAnswers) {
|
|
|
- $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@'.$suffleAnswers;
|
|
|
- } else {
|
|
|
- $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@';
|
|
|
+ $answerOptionsWeight = '::';
|
|
|
+ $answerOptionsSize = '';
|
|
|
+ $questionWeighting = 0;
|
|
|
+ foreach ($optionsValues as $index => $value) {
|
|
|
+ $questionWeighting += $value['weight'];
|
|
|
+ $answerOptionsWeight .= $value['weight'].',';
|
|
|
+ $answerOptionsSize .= $value['size'].',';
|
|
|
}
|
|
|
|
|
|
- $placeholder = $placeholder.$answerOptions;
|
|
|
+ $answerOptionsWeight = substr($answerOptionsWeight, 0, -1);
|
|
|
+ $answerOptionsSize = substr($answerOptionsSize, 0, -1);
|
|
|
|
|
|
+ $answerOptions = $answerOptionsWeight.':'.$answerOptionsSize.':0@';
|
|
|
+
|
|
|
+ $placeholder = $placeholder.PHP_EOL.$answerOptions;
|
|
|
+
|
|
|
+ // sets the total weighting of the question
|
|
|
$questionInstance->updateWeighting($questionWeighting);
|
|
|
- $questionInstance->updateDescription('');
|
|
|
$questionInstance->save();
|
|
|
+ // saves the answers into the data base
|
|
|
$objAnswer->createAnswer($placeholder, 0, '', 0, 1);
|
|
|
$objAnswer->save();
|
|
|
+
|
|
|
+ return true;
|
|
|
+ break;
|
|
|
case 'shortanswer':
|
|
|
- case 'match':
|
|
|
case 'ddmatch':
|
|
|
- // Not Supported Yet
|
|
|
+ $questionWeighting = $currentQuestion['defaultmark'];
|
|
|
+ $questionInstance->updateWeighting($questionWeighting);
|
|
|
+ $questionInstance->updateDescription(get_lang('ThisQuestionIsNotSupportedYet'));
|
|
|
+ $questionInstance->save();
|
|
|
return false;
|
|
|
break;
|
|
|
case 'essay':
|
|
|
$questionWeighting = $currentQuestion['defaultmark'];
|
|
|
$questionInstance->updateWeighting($questionWeighting);
|
|
|
$questionInstance->save();
|
|
|
+ return true;
|
|
|
break;
|
|
|
case 'truefalse':
|
|
|
- // Not Supported Yet
|
|
|
+ $objAnswer = new Answer($questionInstance->id);
|
|
|
+ $questionWeighting = 0;
|
|
|
+ foreach ($questionList as $slot => $answer) {
|
|
|
+ $this->processTrueFalse($objAnswer, $answer, $slot + 1, $questionWeighting);
|
|
|
+ }
|
|
|
+
|
|
|
+ // saves the answers into the data base
|
|
|
+ $objAnswer->save();
|
|
|
+ // sets the total weighting of the question
|
|
|
+ $questionInstance->updateWeighting($questionWeighting);
|
|
|
+ $questionInstance->save();
|
|
|
return false;
|
|
|
break;
|
|
|
default:
|
|
@@ -650,19 +695,52 @@ class MoodleImport
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Process Chamilo True False
|
|
|
+ *
|
|
|
+ * @param object $objAnswer
|
|
|
+ * @param array $answerValues
|
|
|
+ * @param integer $position
|
|
|
+ * @param integer $questionWeighting
|
|
|
+ * @return integer db response
|
|
|
+ */
|
|
|
+ public function processTrueFalse($objAnswer, $answerValues, $position, &$questionWeighting)
|
|
|
+ {
|
|
|
+ $correct = intval($answerValues['fraction']) ? intval($answerValues['fraction']) : 0;
|
|
|
+ $answer = $answerValues['answertext'];
|
|
|
+ $comment = $answerValues['feedback'];
|
|
|
+ $weighting = $answerValues['fraction'];
|
|
|
+ $weighting = abs($weighting);
|
|
|
+ if ($weighting > 0) {
|
|
|
+ $questionWeighting += $weighting;
|
|
|
+ }
|
|
|
+ $goodAnswer = $correct ? true : false;
|
|
|
+
|
|
|
+ $objAnswer->createAnswer(
|
|
|
+ $answer,
|
|
|
+ $goodAnswer,
|
|
|
+ $comment,
|
|
|
+ $weighting,
|
|
|
+ $position,
|
|
|
+ null,
|
|
|
+ null,
|
|
|
+ ''
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Process Chamilo FillBlanks
|
|
|
*
|
|
|
* @param object $objAnswer
|
|
|
- * @param array $question
|
|
|
+ * @param array $questionType
|
|
|
* @param array $answerValues
|
|
|
* @param string $placeholder
|
|
|
* @param integer $position
|
|
|
* @return integer db response
|
|
|
*/
|
|
|
- public function processFillBlanks($objAnswer, $question, $answerValues, &$placeholder, $position)
|
|
|
+ public function processFillBlanks($objAnswer, $questionType, $answerValues, &$placeholder, $position)
|
|
|
{
|
|
|
- switch ($question['qtype']) {
|
|
|
+ switch ($questionType) {
|
|
|
case 'multichoice':
|
|
|
$optionsValues = [];
|
|
|
|
|
@@ -704,6 +782,38 @@ class MoodleImport
|
|
|
|
|
|
return $optionsValues;
|
|
|
|
|
|
+ break;
|
|
|
+ case 'match':
|
|
|
+ $answers = [];
|
|
|
+ // Here first we need to extract all the possible answers
|
|
|
+ foreach ($answerValues as $slot => $answer) {
|
|
|
+ $answers[$slot] = $answer['answertext'];
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now we set the order of the values matching the correct answer and set it to the first element
|
|
|
+ $optionsValues = [];
|
|
|
+ foreach ($answerValues as $slot => $answer) {
|
|
|
+ $correctAnswer = '';
|
|
|
+ $othersAnswers = '';
|
|
|
+ $correctAnswer .= $answer['answertext'].'|';
|
|
|
+
|
|
|
+ foreach ($answers as $other) {
|
|
|
+ if ($other !== $answer['answertext']) {
|
|
|
+ $othersAnswers .= $other.'|';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $optionsValues[$slot]['weight'] = 1;
|
|
|
+ $optionsValues[$slot]['size'] = '200';
|
|
|
+
|
|
|
+ $currentAnswers = $correctAnswer.$othersAnswers;
|
|
|
+ $currentAnswers = '['.substr($currentAnswers, 0, -1).'] ';
|
|
|
+
|
|
|
+ $placeholder .= '<p> ' . strip_tags($answer['questiontext']).' '.$currentAnswers . ' </p>';
|
|
|
+ }
|
|
|
+
|
|
|
+ return $optionsValues;
|
|
|
+
|
|
|
break;
|
|
|
default:
|
|
|
return false;
|
|
@@ -718,7 +828,8 @@ class MoodleImport
|
|
|
* @param $array
|
|
|
* @param $keys
|
|
|
*/
|
|
|
- public function traverseArray(&$array, $keys) {
|
|
|
+ public function traverseArray(&$array, $keys)
|
|
|
+ {
|
|
|
foreach ($array as $key => &$value) {
|
|
|
if (is_array($value)) {
|
|
|
$this->traverseArray($value, $keys);
|