/** * Copy given sco and its children. * * @param Scorm2004Sco $sco * @param Scorm2004Resource $resource * @param Scorm2004Sco $scoParent */ private function copySco(Scorm2004Sco $sco, Scorm2004Resource $resource, Scorm2004Sco $scoParent = null) { $scoCopy = new Scorm2004Sco(); $scoCopy->setScormResource($resource); $scoCopy->setScoParent($scoParent); $scoCopy->setEntryUrl($sco->getEntryUrl()); $scoCopy->setIdentifier($sco->getIdentifier()); $scoCopy->setIsBlock($sco->getIsBlock()); $scoCopy->setLaunchData($sco->getLaunchData()); $scoCopy->setParameters($sco->getParameters()); $scoCopy->setTimeLimitAction($sco->getTimeLimitAction()); $scoCopy->setTitle($sco->getTitle()); $scoCopy->setVisible($sco->isVisible()); $this->om->persist($scoCopy); foreach ($sco->getScoChildren() as $scoChild) { $this->copySco($scoChild, $resource, $scoCopy); } }
/** * @EXT\Route( * "/scorm/2004/render/sco/{scoId}", * name = "claro_render_scorm_2004_sco" * ) * @EXT\ParamConverter( * "scorm2004Sco", * class="ClarolineScormBundle:Scorm2004Sco", * options={"id" = "scoId", "strictId" = true} * ) * @EXT\Template("ClarolineScormBundle::scorm2004MenuSco.html.twig") * * @param Scorm2004Sco $scorm2004Sco * * @return Response */ public function renderScorm2004ScoAction(Scorm2004Sco $scorm2004Sco) { $user = $this->tokenStorage->getToken()->getUser(); $scorm = $scorm2004Sco->getScormResource(); $this->checkScorm2004ResourceAccess('OPEN', $scorm); $canEdit = $this->hasScorm2004Right($scorm, 'EDIT'); $isAnon = $user === 'anon.'; $scos = $scorm->getScos(); $entryUrl = $scorm2004Sco->getEntryUrl(); if (is_string($entryUrl) && preg_match('/^http/', $entryUrl)) { $scormPath = $entryUrl . $scorm2004Sco->getParameters(); } else { $scormPath = 'uploads/scormresources/' . $scorm->getHashName() . DIRECTORY_SEPARATOR . $scorm2004Sco->getEntryUrl() . $scorm2004Sco->getParameters(); } $rootScos = []; foreach ($scos as $sco) { if (is_null($sco->getScoParent())) { $rootScos[] = $sco; } } if ($isAnon) { $scoTracking = $this->scormManager->createEmptyScorm2004ScoTracking($scorm2004Sco); $details = []; $details['cmi.learner_id'] = -1; $details['cmi.learner_name'] = 'anon., anon.'; } else { $scoTracking = $this->scormManager->getScorm2004ScoTrackingByUserAndSco($user, $scorm2004Sco); if (is_null($scoTracking)) { $scoTracking = $this->scormManager->createScorm2004ScoTracking($user, $scorm2004Sco); } $details = !is_null($scoTracking->getDetails()) ? $scoTracking->getDetails() : []; $details['cmi.learner_id'] = $user->getId(); $details['cmi.learner_name'] = $user->getFirstName() . ', ' . $user->getLastName(); } $timeLimitAction = $scorm2004Sco->getTimeLimitAction(); $totalTime = $scoTracking->getTotalTime(); $completionThreshold = $scorm2004Sco->getCompletionThreshold(); $maxTimeAllowed = $scorm2004Sco->getMaxTimeAllowed(); $scaledPassingScore = $scorm2004Sco->getScaledPassingScore(); $details['cmi.time_limit_action'] = !is_null($timeLimitAction) ? $timeLimitAction : 'continue,no message'; $details['cmi.total_time'] = !is_null($totalTime) ? $totalTime : 'PT0S'; $details['cmi.launch_data'] = $scorm2004Sco->getLaunchData(); $details['cmi.completion_threshold'] = !is_null($completionThreshold) ? $completionThreshold : ''; $details['cmi.max_time_allowed'] = !is_null($maxTimeAllowed) ? $maxTimeAllowed : ''; $details['cmi.scaled_passing_score'] = !is_null($scaledPassingScore) ? $scaledPassingScore : ''; return ['resource' => $scorm, '_resource' => $scorm, 'currentSco' => $scorm2004Sco, 'scos' => $rootScos, 'scoTracking' => $scoTracking, 'scoTrackingDetails' => json_encode($details), 'scormUrl' => $scormPath, 'workspace' => $scorm->getResourceNode()->getWorkspace(), 'isAnon' => $isAnon, 'canEdit' => $canEdit]; }