diff options
author | Devian <devianleong@gmail.com> | 2021-04-22 17:03:46 +0800 |
---|---|---|
committer | Devian <devianleong@gmail.com> | 2021-04-22 17:03:46 +0800 |
commit | 745cf2431a71d0e6c5f08f8605839279b2f7496e (patch) | |
tree | 11e4c7a19ac9f9efc1bb253b29b1fa488c34238e /src/Entity |
Initiate commit
Diffstat (limited to 'src/Entity')
-rw-r--r-- | src/Entity/Sco.php | 270 | ||||
-rw-r--r-- | src/Entity/ScoTracking.php | 343 | ||||
-rw-r--r-- | src/Entity/Scorm.php | 146 |
3 files changed, 759 insertions, 0 deletions
diff --git a/src/Entity/Sco.php b/src/Entity/Sco.php new file mode 100644 index 0000000..75eec2b --- /dev/null +++ b/src/Entity/Sco.php @@ -0,0 +1,270 @@ +<?php + + +namespace Peopleaps\Scorm\Entity; + + +class Sco +{ + public $id; + public $uuid; + public $scorm; + public $scoParent; + public $scoChildren; + public $entryUrl; + public $identifier; + public $title; + public $visible; + public $parameters; + public $launchData; + public $maxTimeAllowed; + public $timeLimitAction; + public $block; + public $scoreToPassInt; + public $scoreToPassDecimal; + public $completionThreshold; + public $prerequisites; + + public function getData() { + return [ + 'id' => $this->getId(), + 'scorm' => $this->getScorm(), + 'scoParent' => $this->getScoParent(), + 'entryUrl' => $this->getEntryUrl(), + 'identifier' => $this->getIdentifier(), + + ]; + } + + public function getUuid() + { + return $this->uuid; + } + + public function setUuid($uuid) + { + $this->uuid = $uuid; + } + + public function getId() + { + return $this->id; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getScorm() + { + return $this->scorm; + } + + public function setScorm(Scorm $scorm = null) + { + $this->scorm = $scorm; + } + + public function getScoParent() + { + return $this->scoParent; + } + + public function setScoParent(Sco $scoParent = null) + { + $this->scoParent = $scoParent; + } + + public function getScoChildren() + { + return $this->scoChildren; + } + + public function setScoChildren($scoChildren) + { + $this->scoChildren = $scoChildren; + } + + public function getEntryUrl() + { + return $this->entryUrl; + } + + public function setEntryUrl($entryUrl) + { + $this->entryUrl = $entryUrl; + } + + public function getIdentifier() + { + return $this->identifier; + } + + public function setIdentifier($identifier) + { + $this->identifier = $identifier; + } + + public function getTitle() + { + return $this->title; + } + + public function setTitle($title) + { + $this->title = $title; + } + + public function isVisible() + { + return $this->visible; + } + + public function setVisible($visible) + { + $this->visible = $visible; + } + + public function getParameters() + { + return $this->parameters; + } + + public function setParameters($parameters) + { + $this->parameters = $parameters; + } + + public function getLaunchData() + { + return $this->launchData; + } + + public function setLaunchData($launchData) + { + $this->launchData = $launchData; + } + + public function getMaxTimeAllowed() + { + return $this->maxTimeAllowed; + } + + public function setMaxTimeAllowed($maxTimeAllowed) + { + $this->maxTimeAllowed = $maxTimeAllowed; + } + + public function getTimeLimitAction() + { + return $this->timeLimitAction; + } + + public function setTimeLimitAction($timeLimitAction) + { + $this->timeLimitAction = $timeLimitAction; + } + + public function isBlock() + { + return $this->block; + } + + public function setBlock($block) + { + $this->block = $block; + } + + public function getScoreToPass() + { + if (Scorm::SCORM_2004 === $this->scorm->getVersion()) { + return $this->scoreToPassDecimal; + } else { + return $this->scoreToPassInt; + } + } + + public function setScoreToPass($scoreToPass) + { + if (Scorm::SCORM_2004 === $this->scorm->getVersion()) { + $this->setScoreToPassDecimal($scoreToPass); + } else { + $this->setScoreToPassInt($scoreToPass); + } + } + + public function getScoreToPassInt() + { + return $this->scoreToPassInt; + } + + public function setScoreToPassInt($scoreToPassInt) + { + $this->scoreToPassInt = $scoreToPassInt; + } + + public function getScoreToPassDecimal() + { + return $this->scoreToPassDecimal; + } + + public function setScoreToPassDecimal($scoreToPassDecimal) + { + $this->scoreToPassDecimal = $scoreToPassDecimal; + } + + public function getCompletionThreshold() + { + return $this->completionThreshold; + } + + public function setCompletionThreshold($completionThreshold) + { + $this->completionThreshold = $completionThreshold; + } + + public function getPrerequisites() + { + return $this->prerequisites; + } + + public function setPrerequisites($prerequisites) + { + $this->prerequisites = $prerequisites; + } + + /** + * @return array + */ + public function serialize(Sco $sco) + { + $scorm = $sco->getScorm(); + $parent = $sco->getScoParent(); + + return [ + 'id' => $sco->getUuid(), + 'scorm' => !empty($scorm) ? ['id' => $scorm->getUuid()] : null, + 'data' => [ + 'entryUrl' => $sco->getEntryUrl(), + 'identifier' => $sco->getIdentifier(), + 'title' => $sco->getTitle(), + 'visible' => $sco->isVisible(), + 'parameters' => $sco->getParameters(), + 'launchData' => $sco->getLaunchData(), + 'maxTimeAllowed' => $sco->getMaxTimeAllowed(), + 'timeLimitAction' => $sco->getTimeLimitAction(), + 'block' => $sco->isBlock(), + 'scoreToPassInt' => $sco->getScoreToPassInt(), + 'scoreToPassDecimal' => $sco->getScoreToPassDecimal(), + 'scoreToPass' => !empty($scorm) ? $sco->getScoreToPass() : null, + 'completionThreshold' => $sco->getCompletionThreshold(), + 'prerequisites' => $sco->getPrerequisites(), + ], + 'parent' => !empty($parent) ? ['id' => $parent->getUuid()] : null, + 'children' => array_map(function (Sco $scoChild) { + return $this->serialize($scoChild); + }, is_array($sco->getScoChildren()) ? $sco->getScoChildren() : $sco->getScoChildren()->toArray()), + ]; + } +} diff --git a/src/Entity/ScoTracking.php b/src/Entity/ScoTracking.php new file mode 100644 index 0000000..c0b001d --- /dev/null +++ b/src/Entity/ScoTracking.php @@ -0,0 +1,343 @@ +<?php + + +namespace Peopleaps\Scorm\Entity; + + +class ScoTracking +{ + public $userId; + public $sco; + public $scoreRaw; + public $scoreMin; + public $scoreMax; + public $progression = 0; + public $scoreScaled; + public $lessonStatus; + public $completionStatus; + public $sessionTime; + public $totalTimeInt; + public $totalTimeString; + public $entry; + public $suspendData; + public $credit; + public $exitMode; + public $lessonLocation; + public $lessonMode; + public $isLocked; + public $details; + public $latestDate; + + public function getUserId() + { + return $this->userId; + } + + public function setUserId($userId) + { + $this->userId = $userId; + } + + /** + * @return Sco + */ + public function getSco() + { + return $this->sco; + } + + public function setSco($sco) + { + $this->sco = $sco; + } + + public function getScoreRaw() + { + return $this->scoreRaw; + } + + public function setScoreRaw($scoreRaw) + { + $this->scoreRaw = $scoreRaw; + } + + public function getScoreMin() + { + return $this->scoreMin; + } + + public function setScoreMin($scoreMin) + { + $this->scoreMin = $scoreMin; + } + + public function getScoreMax() + { + return $this->scoreMax; + } + + public function setScoreMax($scoreMax) + { + $this->scoreMax = $scoreMax; + } + + public function getScoreScaled() + { + return $this->scoreScaled; + } + + public function setScoreScaled($scoreScaled) + { + $this->scoreScaled = $scoreScaled; + } + + public function getLessonStatus() + { + return $this->lessonStatus; + } + + public function setLessonStatus($lessonStatus) + { + $this->lessonStatus = $lessonStatus; + } + + public function getCompletionStatus() + { + return $this->completionStatus; + } + + public function setCompletionStatus($completionStatus) + { + $this->completionStatus = $completionStatus; + } + + public function getSessionTime() + { + return $this->sessionTime; + } + + public function setSessionTime($sessionTime) + { + $this->sessionTime = $sessionTime; + } + + public function getTotalTime($scormVersion) + { + if (Scorm::SCORM_2004 === $scormVersion) { + return $this->totalTimeString; + } else { + return $this->totalTimeInt; + } + } + + public function setTotalTime($totalTime, $scormVersion) + { + if (Scorm::SCORM_2004 === $scormVersion) { + $this->setTotalTimeString($totalTime); + } else { + $this->setTotalTimeInt($totalTime); + } + } + + public function getTotalTimeInt() + { + return $this->totalTimeInt; + } + + public function setTotalTimeInt($totalTimeInt) + { + $this->totalTimeInt = $totalTimeInt; + } + + public function getTotalTimeString() + { + return $this->totalTimeString; + } + + public function setTotalTimeString($totalTimeString) + { + $this->totalTimeString = $totalTimeString; + } + + public function getEntry() + { + return $this->entry; + } + + public function setEntry($entry) + { + $this->entry = $entry; + } + + public function getSuspendData() + { + return $this->suspendData; + } + + public function setSuspendData($suspendData) + { + $this->suspendData = $suspendData; + } + + public function getCredit() + { + return $this->credit; + } + + public function setCredit($credit) + { + $this->credit = $credit; + } + + public function getExitMode() + { + return $this->exitMode; + } + + public function setExitMode($exitMode) + { + $this->exitMode = $exitMode; + } + + public function getLessonLocation() + { + return $this->lessonLocation; + } + + public function setLessonLocation($lessonLocation) + { + $this->lessonLocation = $lessonLocation; + } + + public function getLessonMode() + { + return $this->lessonMode; + } + + public function setLessonMode($lessonMode) + { + $this->lessonMode = $lessonMode; + } + + public function getIsLocked() + { + return $this->isLocked; + } + + public function setIsLocked($isLocked) + { + $this->isLocked = $isLocked; + } + + public function getDetails() + { + return $this->details; + } + + public function setDetails($details) + { + $this->details = $details; + } + + public function getLatestDate() + { + return $this->latestDate; + } + + public function setLatestDate(\DateTime $latestDate = null) + { + $this->latestDate = $latestDate; + } + + public function getProgression() + { + return $this->progression; + } + + public function setProgression($progression) + { + $this->progression = $progression; + } + + public function getFormattedTotalTime() + { + if (Scorm::SCORM_2004 === $this->sco->getScorm()->getVersion()) { + return $this->getFormattedTotalTimeString(); + } else { + return $this->getFormattedTotalTimeInt(); + } + } + + public function getFormattedTotalTimeInt() + { + $remainingTime = $this->totalTimeInt; + $hours = intval($remainingTime / 360000); + $remainingTime %= 360000; + $minutes = intval($remainingTime / 6000); + $remainingTime %= 6000; + $seconds = intval($remainingTime / 100); + $remainingTime %= 100; + + $formattedTime = ''; + + if ($hours < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $hours.':'; + + if ($minutes < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $minutes.':'; + + if ($seconds < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $seconds.'.'; + + if ($remainingTime < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $remainingTime; + + return $formattedTime; + } + + public function getFormattedTotalTimeString() + { + $pattern = '/^P([0-9]+Y)?([0-9]+M)?([0-9]+D)?T([0-9]+H)?([0-9]+M)?([0-9]+S)?$/'; + $formattedTime = ''; + + if (!empty($this->totalTimeString) && 'PT' !== $this->totalTimeString && preg_match($pattern, $this->totalTimeString)) { + $interval = new \DateInterval($this->totalTimeString); + $time = new \DateTime(); + $time->setTimestamp(0); + $time->add($interval); + $timeInSecond = $time->getTimestamp(); + + $hours = intval($timeInSecond / 3600); + $timeInSecond %= 3600; + $minutes = intval($timeInSecond / 60); + $timeInSecond %= 60; + + if ($hours < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $hours.':'; + + if ($minutes < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $minutes.':'; + + if ($timeInSecond < 10) { + $formattedTime .= '0'; + } + $formattedTime .= $timeInSecond; + } else { + $formattedTime .= '00:00:00'; + } + + return $formattedTime; + } +} diff --git a/src/Entity/Scorm.php b/src/Entity/Scorm.php new file mode 100644 index 0000000..4095986 --- /dev/null +++ b/src/Entity/Scorm.php @@ -0,0 +1,146 @@ +<?php + + +namespace Peopleaps\Scorm\Entity; + + +use Doctrine\Common\Collections\ArrayCollection; + +class Scorm +{ + const SCORM_12 = 'scorm_12'; + const SCORM_2004 = 'scorm_2004'; + + public $uuid; + public $id; + public $version; + public $hashName; + public $ratio = 56.25; + public $scos; + public $scoSerializer; + + /** + * @return string + */ + public function getUuid() + { + return $this->uuid; + } + + /** + * @param int $id + */ + public function setUuid($uuid) + { + $this->uuid = $uuid; + } + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @param int $id + */ + public function setId($id) + { + $this->id = $id; + } + + /** + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * @param string $version + */ + public function setVersion($version) + { + $this->version = $version; + } + + /** + * @return string + */ + public function getHashName() + { + return $this->hashName; + } + + /** + * @param string $hashName + */ + public function setHashName($hashName) + { + $this->hashName = $hashName; + } + + /** + * @return float + */ + public function getRatio() + { + return $this->ratio; + } + + /** + * @param float $ratio + */ + public function setRatio($ratio) + { + $this->ratio = $ratio; + } + + /** + * @return Sco[] + */ + public function getScos() + { + return $this->scos; + } + + /** + * @return Sco[] + */ + public function getRootScos() + { + $roots = []; + + if (!empty($this->scos)) { + foreach ($this->scos as $sco) { + if (is_null($sco->getScoParent())) { + // Root sco found + $roots[] = $sco; + } + } + } + + return $roots; + } + + public function serialize(Scorm $scorm) + { + return [ + 'id' => $scorm->getUuid(), + 'version' => $scorm->getVersion(), + 'hashName' => $scorm->getHashName(), + 'ratio' => $scorm->getRatio(), + 'scos' => $this->serializeScos($scorm), + ]; + } + + private function serializeScos(Scorm $scorm) + { + return array_map(function (Sco $sco) { + return $sco->serialize($sco); + }, $scorm->getRootScos()); + } +} |