180 lines
6.6 KiB
PHP
180 lines
6.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; under version 2
|
|
* of the License (non-upgradable).
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (c) 2013 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
|
*
|
|
*
|
|
*/
|
|
|
|
namespace oat\ltiDeliveryProvider\controller;
|
|
|
|
use oat\tao\helpers\UrlHelper;
|
|
use oat\tao\model\theme\ThemeServiceInterface;
|
|
use oat\taoDelivery\controller\DeliveryServer;
|
|
use oat\taoDelivery\model\execution\ServiceProxy;
|
|
use oat\taoLti\controller\traits\LtiModuleTrait;
|
|
use oat\taoLti\models\classes\LtiException;
|
|
use oat\taoLti\models\classes\LtiLaunchData;
|
|
use oat\taoLti\models\classes\LtiService;
|
|
use oat\taoLti\models\classes\theme\LtiHeadless;
|
|
use oat\ltiDeliveryProvider\model\LTIDeliveryTool;
|
|
use oat\taoLti\models\classes\LtiMessages\LtiErrorMessage;
|
|
use oat\taoDelivery\model\execution\DeliveryExecution;
|
|
use oat\taoDelivery\model\execution\StateServiceInterface;
|
|
use oat\ltiDeliveryProvider\model\navigation\LtiNavigationService;
|
|
|
|
/**
|
|
* Called by the DeliveryTool to override DeliveryServer settings
|
|
*
|
|
* @author CRP Henri Tudor - TAO Team - {@link http://www.tao.lu}
|
|
* @license GPLv2 http://www.opensource.org/licenses/gpl-2.0.php
|
|
* @package ltiDeliveryProvider
|
|
*/
|
|
class DeliveryRunner extends DeliveryServer
|
|
{
|
|
use LtiModuleTrait;
|
|
|
|
/**
|
|
* Defines if the top and bottom action menu should be displayed or not
|
|
*
|
|
* @return boolean
|
|
*/
|
|
protected function showControls()
|
|
{
|
|
$themeService = $this->getServiceManager()->get(ThemeServiceInterface::SERVICE_ID);
|
|
if ($themeService instanceof ThemeServiceInterface || $themeService instanceof LtiHeadless) {
|
|
return !$themeService->isHeadless();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected function getReturnUrl()
|
|
{
|
|
$deliveryExecution = $this->getCurrentDeliveryExecution();
|
|
return _url(
|
|
'ltiReturn',
|
|
'DeliveryRunner',
|
|
'ltiDeliveryProvider',
|
|
['deliveryExecution' => $deliveryExecution->getIdentifier()]
|
|
);
|
|
}
|
|
|
|
public function ltiReturn()
|
|
{
|
|
$navigation = $this->getServiceLocator()->get(LtiNavigationService::SERVICE_ID);
|
|
$deliveryExecution = $this->getCurrentDeliveryExecution();
|
|
$launchData = LtiService::singleton()->getLtiSession()->getLaunchData();
|
|
$this->redirect($navigation->getReturnUrl($launchData, $deliveryExecution));
|
|
}
|
|
|
|
/**
|
|
* Shown uppon returning to a finished delivery execution
|
|
*/
|
|
public function ltiOverview()
|
|
{
|
|
$this->setData('delivery', $this->getRequestParameter('delivery'));
|
|
$this->setData('allowRepeat', true);
|
|
$this->setView('learner/overview.tpl');
|
|
}
|
|
|
|
/**
|
|
* @throws LtiException
|
|
* @throws \InterruptedActionException
|
|
* @throws \ResolverException
|
|
* @throws \common_exception_Error
|
|
* @throws \common_exception_IsAjaxAction
|
|
* @throws \oat\taoLti\models\classes\LtiVariableMissingException
|
|
*/
|
|
public function repeat()
|
|
{
|
|
$delivery = new \core_kernel_classes_Resource($this->getRequestParameter('delivery'));
|
|
|
|
$remoteLink = LtiService::singleton()->getLtiSession()->getLtiLinkResource();
|
|
$user = \common_session_SessionManager::getSession()->getUser();
|
|
|
|
try {
|
|
$newExecution = $this->getServiceLocator()->get(LTIDeliveryTool::class)->startDelivery(
|
|
$delivery,
|
|
$remoteLink,
|
|
$user
|
|
);
|
|
$deliveryExecutionStateService = $this->getServiceLocator()->get(StateServiceInterface::SERVICE_ID);
|
|
$deliveryExecutionStateService->pause($newExecution);
|
|
|
|
$runDeliveryExecutionUrl = $this->getServiceLocator()->get(UrlHelper::class)->buildUrl(
|
|
'runDeliveryExecution',
|
|
null,
|
|
null,
|
|
['deliveryExecution' => $newExecution->getIdentifier()]
|
|
);
|
|
$this->redirect($runDeliveryExecutionUrl);
|
|
} catch (\common_exception_Unauthorized $e) {
|
|
$ltiException = new LtiException(
|
|
$e->getMessage(),
|
|
LtiErrorMessage::ERROR_LAUNCH_FORBIDDEN
|
|
);
|
|
$this->returnLtiError($ltiException);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws LtiException
|
|
* @throws \common_exception_Error
|
|
* @throws \oat\taoLti\models\classes\LtiVariableMissingException
|
|
*/
|
|
public function thankYou()
|
|
{
|
|
$launchData = LtiService::singleton()->getLtiSession()->getLaunchData();
|
|
|
|
if ($launchData->hasVariable(LtiLaunchData::TOOL_CONSUMER_INSTANCE_NAME)) {
|
|
$this->setData('consumerLabel', $launchData->getVariable(LtiLaunchData::TOOL_CONSUMER_INSTANCE_NAME));
|
|
} elseif ($launchData->hasVariable(LtiLaunchData::TOOL_CONSUMER_INSTANCE_DESCRIPTION)) {
|
|
$this->setData('consumerLabel', $launchData->getVariable(LtiLaunchData::TOOL_CONSUMER_INSTANCE_DESCRIPTION));
|
|
}
|
|
|
|
if ($launchData->hasReturnUrl()) {
|
|
$this->setData('returnUrl', $launchData->getReturnUrl());
|
|
}
|
|
|
|
if ($launchData->hasVariable(DeliveryTool::PARAM_THANKYOU_MESSAGE)) {
|
|
$this->setData('message', $launchData->getVariable(DeliveryTool::PARAM_THANKYOU_MESSAGE));
|
|
}
|
|
|
|
$this->setData('allowRepeat', false);
|
|
$this->setView('learner/thankYou.tpl');
|
|
}
|
|
|
|
/**
|
|
* Redirect user to return URL
|
|
*/
|
|
public function finishDeliveryExecution()
|
|
{
|
|
$deliveryExecution = null;
|
|
if ($this->hasRequestParameter('deliveryExecution')) {
|
|
$deliveryExecution = ServiceProxy::singleton()->getDeliveryExecution(
|
|
$this->getRequestParameter('deliveryExecution')
|
|
);
|
|
if ($deliveryExecution->getState() !== DeliveryExecution::STATE_FINISHIED) {
|
|
$stateService = $this->getServiceLocator()->get(StateServiceInterface::SERVICE_ID);
|
|
$stateService->finish($deliveryExecution);
|
|
}
|
|
}
|
|
$redirectUrl = $this->getServiceLocator()->get(LTIDeliveryTool::class)->getFinishUrl($deliveryExecution);
|
|
$this->redirect($redirectUrl);
|
|
}
|
|
}
|