MigrationMoodle: Fix user views for scorm - refs BT#15992

pull/3138/head
Angel Fernando Quiroz Campos 6 years ago
parent 62d90bd043
commit f79bcfe268
  1. 29
      plugin/migrationmoodle/src/Loader/UsersScormsViewLoader.php
  2. 41
      plugin/migrationmoodle/src/Transformer/Property/ScormScoTrackData.php

@ -29,6 +29,8 @@ class UsersScormsViewLoader implements LoaderInterface
$sessionId
);
$lpItemViewId = $this->getLpItemView($lpViewId, $incomingData['lp_item_id']);
$itemView = [
'c_id' => $incomingData['c_id'],
'lp_item_id' => $incomingData['lp_item_id'],
@ -47,8 +49,12 @@ class UsersScormsViewLoader implements LoaderInterface
}
}
$lpItemViewId = \Database::insert($tblLpItemView, $itemView);
\Database::query("UPDATE $tblLpItemView SET id = iid WHERE iid = $lpItemViewId");
if (empty($lpItemViewId)) {
$lpItemViewId = \Database::insert($tblLpItemView, $itemView);
\Database::query("UPDATE $tblLpItemView SET id = iid WHERE iid = $lpItemViewId");
} else {
\Database::update($tblLpItemView, $itemView, ['iid = ?' => [$lpItemViewId]]);
}
\Database::query(
"UPDATE $tblLpView
@ -135,4 +141,23 @@ class UsersScormsViewLoader implements LoaderInterface
return $lpView['iid'];
}
/**
* @param int $lpViewId
* @param int $lpItemId
*
* @return int
*/
private function getLpItemView($lpViewId, $lpItemId)
{
$lpItemView = \Database::fetch_assoc(
\Database::query("SELECT iid FROM c_lp_item_view WHERE lp_view_id = $lpViewId AND lp_item_id = $lpItemId")
);
if (empty($lpItemView)) {
return 0;
}
return $lpItemView['iid'];
}
}

@ -23,7 +23,13 @@ class ScormScoTrackData implements TransformPropertyInterface
$trackData = current($data);
$strComponents = explode(self::SEPARATOR_COMPONENTS, $trackData);
$itemData = [];
$trackData = [];
foreach ($strComponents as $strComponent) {
list($component, $value) = explode(self::SEPARATOR_VALUES, $strComponent);
$trackData[$component] = $value;
}
$elements = [
'x.start.time' => 'start_time',
@ -33,22 +39,25 @@ class ScormScoTrackData implements TransformPropertyInterface
'cmi.suspend_data' => 'suspend_data',
'cmi.core.score.raw' => 'score',
'cmi.core.score.max' => 'max_score',
'cmi.total_time' => 'total_time',
];
foreach ($strComponents as $strComponent) {
list($component, $value) = explode(self::SEPARATOR_VALUES, $strComponent);
$itemData = [];
foreach ($trackData as $component => $value) {
if ('cmi.core.total_time' === $component) {
$value = $this->hmsToSeconds($value);
} elseif ('cmi.core.exit' === $component) {
$value = $this->coreExit($value);
} elseif ('cmi.total_time' === $component && !empty($trackData['x.start.time'])) {
$value = $this->cmiTotalTime($trackData['x.start.time'], $value);
}
if (isset($elements[$component])) {
$component = $elements[$component];
}
$variable = $elements[$component];
$itemData[$component] = $value;
$itemData[$variable] = $value;
}
}
return $itemData;
@ -83,4 +92,24 @@ class ScormScoTrackData implements TransformPropertyInterface
$value;
}
/**
* @param int $startTimeValue
* @param string $value
*
* @throws \Exception
*
* @return int
*/
private function cmiTotalTime($startTimeValue, $value)
{
$startTime = new \DateTime();
$startTime->setTimestamp($startTimeValue);
$startTime->setTimezone(new \DateTimeZone('UTC'));
$endTime = clone $startTime;
$endTime->add(new \DateInterval($value));
return $endTime->getTimestamp() - $startTime->getTimestamp();
}
}

Loading…
Cancel
Save