LTI Tool Provider module for Yii2.
composer require izumi-kun/yii2-lti-tool-provider
Add namespaced migrations: izumi\yii2lti\migrations
. Apply new migrations.
Add module to web config and configure. The module has three main events for handling messages from Tool Consumers:
launch
forbasic-lti-launch-request
message typecontentItem
forContentItemSelectionRequest
message typeregister
forToolProxyRegistrationRequest
message type
Make sure to configure access to lti/consumer
controller actions.
All messages from Tool Consumers handles by lti/connect
controller and there is no access restrictions.
$config = [
'modules' => [
'lti' => [
'class' => '\izumi\yii2lti\Module',
'on launch' => ['\app\controllers\SiteController', 'ltiLaunch'],
'on error' => ['\app\controllers\SiteController', 'ltiError'],
'as access' => [
'class' => '\yii\filters\AccessControl',
'rules' => [
['allow' => true, 'controllers' => ['lti/connect']],
['allow' => true, 'controllers' => ['lti/consumer'], 'roles' => ['admin']],
],
],
],
],
];
Create event handlers to respect module config.
namespace app\controllers;
use izumi\yii2lti\ToolProviderEvent;
use Yii;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
class SiteController extends Controller
{
/**
* basic-lti-launch-request handler
* @param ToolProviderEvent $event
*/
public static function ltiLaunch(ToolProviderEvent $event)
{
$tool = $event->sender;
// $userPk can be used for user identity
$userPk = $tool->user->getRecordId();
$isAdmin = $tool->user->isStaff() || $tool->user->isAdmin();
Yii::$app->session->set('isAdmin', $isAdmin);
Yii::$app->session->set('isLtiSession', true);
Yii::$app->session->set('userPk', $userPk);
Yii::$app->controller->redirect(['/site/index']);
$tool->ok = true;
}
/**
* LTI error handler
* @param ToolProviderEvent $event
* @throws BadRequestHttpException
*/
public static function ltiError(ToolProviderEvent $event)
{
$tool = $event->sender;
$msg = $tool->message;
if (!empty($tool->reason)) {
Yii::error($tool->reason);
if ($tool->isDebugMode()) {
$msg = $tool->reason;
}
}
throw new BadRequestHttpException($msg);
}
}
use IMSGlobal\LTI\ToolProvider;
/* @var \izumi\yii2lti\Module $module */
$module = Yii::$app->getModule('lti');
$user = ToolProvider\User::fromRecordId(Yii::$app->session->get('userPk'), $module->toolProvider->dataConnector);
$result = '0.8';
$outcome = new ToolProvider\Outcome($result);
if ($user->getResourceLink()->doOutcomesService(ToolProvider\ResourceLink::EXT_WRITE, $outcome, $user)) {
Yii::$app->session->addFlash('success', 'Result sent successfully');
}