izumi-kun / yii2-lti-tool-provider
LTI Tool Provider module for Yii2
Installs: 252
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 3
Type:yii2-extension
Requires
- php: >=5.4.0
- izumi-kun/lti: ~1.2.0
- yiisoft/yii2: ~2.0.14
- yiisoft/yii2-httpclient: ~2.0.0
README
LTI Tool Provider module for Yii2.
Installation
composer require izumi-kun/yii2-lti-tool-provider
Usage
Migrations
Add namespaced migrations: izumi\yii2lti\migrations
. Apply new migrations.
Application config
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']], ], ], ], ], ];
Event handlers
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); } }
Outcome
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'); }
Sample app
https://github.com/Izumi-kun/yii2-lti-tool-provider-sample