MigrationMoodle: Add task for gapselect questions - refs BT#15992

pull/3127/head
Angel Fernando Quiroz Campos 6 years ago
parent a27e48a739
commit a5503611ad
  1. 1
      plugin/migrationmoodle/admin.php
  2. 1
      plugin/migrationmoodle/lang/english.php
  3. 37
      plugin/migrationmoodle/src/Loader/QuestionGapselectLoader.php
  4. 89
      plugin/migrationmoodle/src/Task/QuestionGapselectTask.php
  5. 77
      plugin/migrationmoodle/src/Transformer/Property/QuestionGapselectAnswer.php
  6. 2
      plugin/migrationmoodle/src/Transformer/Property/QuestionType.php

@ -74,6 +74,7 @@ $menu = [
'question_multi_choice_multiple',
'questions_true_false',
'question_short_answer',
'question_gapselect',
],
'course_modules_scorm' => [
'scorm_scoes',

@ -60,3 +60,4 @@ $strings['UsersScormsProgressTask'] = 'Scorm progress';
$strings['UsersLearnPathsTask'] = 'Learn paths views of users';
$strings['UsersLearnPathsSectionsTask'] = 'Learn paths sections views of users';
$strings['QuizzesScoresTask'] = 'Update quiz scores in learn path';
$strings['QuestionGapselectTask'] = 'Answers for gapselect questions';

@ -0,0 +1,37 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Loader;
use Chamilo\PluginBundle\MigrationMoodle\Interfaces\LoaderInterface;
/**
* Class QuestionGapselectLoader.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Loader
*/
class QuestionGapselectLoader implements LoaderInterface
{
/**
* @inheritDoc
*/
public function load(array $incomingData)
{
$courseInfo = api_get_course_info_by_id($incomingData['c_id']);
$exercise = new \Exercise($incomingData['c_id']);
$exercise->read($incomingData['quiz_id']);
$question = \Question::read($incomingData['question_id'], $courseInfo);
$question->setTitle(get_lang('FillBlanks'));
$question->weighting = $incomingData['score'];
$answer = new \Answer($incomingData['question_id'], $incomingData['c_id'], $exercise);
$answer->createAnswer($incomingData['answer'], 0, $incomingData['comment'], 0, 1);
$answer->save();
$question->save($exercise);
return $question->id;
}
}

@ -0,0 +1,89 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Task;
use Chamilo\PluginBundle\MigrationMoodle\Extractor\LoadedCoursesFilterExtractor;
use Chamilo\PluginBundle\MigrationMoodle\Loader\QuestionGapselectLoader;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\BaseTransformer;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedCourseLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedQuestionLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedQuizLookup;
use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\QuestionGapselectAnswer;
/**
* Class QuestionGapselectTask.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Task
*/
class QuestionGapselectTask extends BaseTask
{
/**
* @inheritDoc
*/
public function getExtractConfiguration()
{
return [
'class' => LoadedCoursesFilterExtractor::class,
'query' => "SELECT
qa.id,
qa.question,
GROUP_CONCAT(
CONCAT(qa.feedback, '==>>', qa.answer) ORDER BY qa.id ASC SEPARATOR '@||@'
) answers,
qq.questiontext,
qs.maxmark,
qg.correctfeedback,
q.id quiz_id,
q.course
FROM mdl_question_answers qa
INNER JOIN mdl_question qq ON qa.question = qq.id
INNER JOIN mdl_question_gapselect qg ON qq.id = qg.questionid
INNER JOIN mdl_quiz_slots qs ON qq.id = qs.questionid
INNER JOIN mdl_quiz q ON qs.quizid = q.id
WHERE qq.qtype = 'gapselect'
GROUP BY q.id, qq.id
ORDER BY q.id, qq.id"
];
}
/**
* @inheritDoc
*/
public function getTransformConfiguration()
{
return [
'class' => BaseTransformer::class,
'map' => [
'c_id' => [
'class' => LoadedCourseLookup::class,
'properties' => ['course'],
],
'quiz_id' => [
'class' => LoadedQuizLookup::class,
'properties' => ['quiz_id'],
],
'question_id' => [
'class' => LoadedQuestionLookup::class,
'properties' => ['question'],
],
'answer' => [
'class' => QuestionGapselectAnswer::class,
'properties' => ['answers', 'questiontext', 'maxmark'],
],
'score' => 'maxmark',
'comment' => 'correctfeedback',
],
];
}
/**
* @inheritDoc
*/
public function getLoadConfiguration()
{
return [
'class' => QuestionGapselectLoader::class,
];
}
}

@ -0,0 +1,77 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\MigrationMoodle\Transformer\Property;
use Chamilo\PluginBundle\MigrationMoodle\Interfaces\TransformPropertyInterface;
/**
* Class QuestionGapselectAnswer.
*
* @package Chamilo\PluginBundle\MigrationMoodle\Transformer\Property
*/
class QuestionGapselectAnswer implements TransformPropertyInterface
{
/**
* @inheritDoc
*/
public function transform(array $data)
{
list($answers, $questionText, $score) = array_values($data);
$groupsAndOptions = explode('@||@', $answers);
$groups = [];
$positionsByGroup = [];
foreach ($groupsAndOptions as $zeroPosition => $groupAndOption) {
$position = $zeroPosition + 1;
list($group, $option) = explode('==>>', $groupAndOption);
$positionsByGroup[$position] = $group;
$groups[$group][$position] = $option;
}
$blanks = [];
foreach ($positionsByGroup as $option => $group) {
if ($option === 1) {
$blanks[] = '['.implode($groups[$group], '|').']';
continue;
}
$baz = $groups[$group];
unset($baz[$option]);
$baz = [$groups[$group][$option]] + $baz;
$blanks[] = '['.implode($baz, '|').']';
}
$countBlanks = 0;
foreach ($blanks as $zeroPosition => $blank) {
$countBlank = 0;
$position = $zeroPosition + 1;
$questionText = str_replace("[[$position]]", $blank, $questionText, $countBlank);
$countBlanks += $countBlank;
}
$individualScore = $score / $countBlanks;
$scores = [];
for ($i = 0; $i < $countBlanks - 1; $i++) {
$scores[] = $individualScore;
}
$scores[] = $score - array_sum($scores);
$inputs = str_repeat('300,', $countBlanks - 1).'300';
return "$questionText::".implode(',', $scores).":$inputs:0@";
}
}

@ -36,6 +36,7 @@ class QuestionType implements TransformPropertyInterface
return MATCHING_DRAGGABLE;
case 'shortanswer':
case 'numerical':
case 'gapselect':
return FILL_IN_BLANKS;
case 'essay':
return FREE_ANSWER;
@ -48,7 +49,6 @@ class QuestionType implements TransformPropertyInterface
case 'ddimageortext':
case 'multianswer':
case 'randomsamatch':
case 'gapselect':
case 'description':
throw new \Exception("Question type \"$qtype\" not supported in question \"$id\".");
}

Loading…
Cancel
Save