/** * Given a coursemodule object, this function returns the extra * information needed to print this activity in various places. * For this module we just need to support external urls as * activity icons * * @param stdClass $coursemodule * @return cached_cm_info info */ function lti_get_coursemodule_info($coursemodule) { global $DB, $CFG; require_once $CFG->dirroot . '/mod/lti/locallib.php'; if (!($lti = $DB->get_record('lti', array('id' => $coursemodule->instance), 'icon, secureicon, intro, introformat, name, typeid, toolurl, launchcontainer'))) { return null; } $info = new cached_cm_info(); if ($coursemodule->showdescription) { // Convert intro to html. Do not filter cached version, filters run at display time. $info->content = format_module_intro('lti', $lti, $coursemodule->id, false); } if (!empty($lti->typeid)) { $toolconfig = lti_get_type_config($lti->typeid); } else { if ($tool = lti_get_tool_by_url_match($lti->toolurl)) { $toolconfig = lti_get_type_config($tool->id); } else { $toolconfig = array(); } } // We want to use the right icon based on whether the // current page is being requested over http or https. if (lti_request_is_using_ssl() && (!empty($lti->secureicon) || isset($toolconfig['secureicon']) && !empty($toolconfig['secureicon']))) { if (!empty($lti->secureicon)) { $info->iconurl = new moodle_url($lti->secureicon); } else { $info->iconurl = new moodle_url($toolconfig['secureicon']); } } else { if (!empty($lti->icon)) { $info->iconurl = new moodle_url($lti->icon); } else { if (isset($toolconfig['icon']) && !empty($toolconfig['icon'])) { $info->iconurl = new moodle_url($toolconfig['icon']); } } } // Does the link open in a new window? $launchcontainer = lti_get_launch_container($lti, $toolconfig); if ($launchcontainer == LTI_LAUNCH_CONTAINER_WINDOW) { $launchurl = new moodle_url('/mod/lti/launch.php', array('id' => $coursemodule->id)); $info->onclick = "window.open('" . $launchurl->out(false) . "', 'lti'); return false;"; } $info->name = $lti->name; return $info; }
$pageurl->param('id', $id); } $PAGE->set_url($pageurl); admin_externalpage_setup('managemodules'); // Hacky solution for printing the admin page. $redirect = "{$CFG->wwwroot}/{$CFG->admin}/settings.php?section=modsettinglti&tab={$tab}"; if ($action == 'accept') { lti_set_state_for_type($id, LTI_TOOL_STATE_CONFIGURED); redirect($redirect); } else { if ($action == 'reject' || $action == 'delete') { lti_set_state_for_type($id, LTI_TOOL_STATE_REJECTED); redirect($redirect); } } if (lti_request_is_using_ssl() && !empty($type->lti_secureicon)) { $type->oldicon = $type->lti_secureicon; } else { $type->oldicon = $type->lti_icon; } $form = new mod_lti_edit_types_form($pageurl, (object) array('isadmin' => true, 'istool' => true)); if ($data = $form->get_data()) { $type = new stdClass(); if (!empty($id)) { $type->id = $id; lti_update_type($type, $data); } else { $type->state = LTI_TOOL_STATE_CONFIGURED; lti_add_type($type, $data); } redirect($redirect);
/** * Given a coursemodule object, this function returns the extra * information needed to print this activity in various places. * For this module we just need to support external urls as * activity icons * * @param cm_info $coursemodule * @return cached_cm_info info */ function lti_get_coursemodule_info($coursemodule) { global $DB, $CFG; require_once($CFG->dirroot.'/mod/lti/locallib.php'); if (!$lti = $DB->get_record('lti', array('id' => $coursemodule->instance), 'icon, secureicon, intro, introformat, name')) { return null; } $info = new cached_cm_info(); // We want to use the right icon based on whether the // current page is being requested over http or https. if (lti_request_is_using_ssl() && !empty($lti->secureicon)) { $info->iconurl = new moodle_url($lti->secureicon); } else if (!empty($lti->icon)) { $info->iconurl = new moodle_url($lti->icon); } if ($coursemodule->showdescription) { // Convert intro to html. Do not filter cached version, filters run at display time. $info->content = format_module_intro('lti', $lti, $coursemodule->id, false); } $info->name = $lti->name; return $info; }
/** * Prints a Basic LTI activity * * $param int $basicltiid Basic LTI activity id */ function lti_view($instance) { global $PAGE, $CFG; if (empty($instance->typeid)) { $tool = lti_get_tool_by_url_match($instance->toolurl, $instance->course); if ($tool) { $typeid = $tool->id; } else { $typeid = null; } } else { $typeid = $instance->typeid; } if ($typeid) { $typeconfig = lti_get_type_config($typeid); } else { //There is no admin configuration for this tool. Use configuration in the lti instance record plus some defaults. $typeconfig = (array)$instance; $typeconfig['sendname'] = $instance->instructorchoicesendname; $typeconfig['sendemailaddr'] = $instance->instructorchoicesendemailaddr; $typeconfig['customparameters'] = $instance->instructorcustomparameters; $typeconfig['acceptgrades'] = $instance->instructorchoiceacceptgrades; $typeconfig['allowroster'] = $instance->instructorchoiceallowroster; $typeconfig['forcessl'] = '0'; } //Default the organizationid if not specified if (empty($typeconfig['organizationid'])) { $urlparts = parse_url($CFG->wwwroot); $typeconfig['organizationid'] = $urlparts['host']; } if (!empty($instance->resourcekey)) { $key = $instance->resourcekey; } else if (!empty($typeconfig['resourcekey'])) { $key = $typeconfig['resourcekey']; } else { $key = ''; } if (!empty($instance->password)) { $secret = $instance->password; } else if (!empty($typeconfig['password'])) { $secret = $typeconfig['password']; } else { $secret = ''; } $endpoint = !empty($instance->toolurl) ? $instance->toolurl : $typeconfig['toolurl']; $endpoint = trim($endpoint); //If the current request is using SSL and a secure tool URL is specified, use it if (lti_request_is_using_ssl() && !empty($instance->securetoolurl)) { $endpoint = trim($instance->securetoolurl); } //If SSL is forced, use the secure tool url if specified. Otherwise, make sure https is on the normal launch URL. if ($typeconfig['forcessl'] == '1') { if (!empty($instance->securetoolurl)) { $endpoint = trim($instance->securetoolurl); } $endpoint = lti_ensure_url_is_https($endpoint); } else { if (!strstr($endpoint, '://')) { $endpoint = 'http://' . $endpoint; } } $orgid = $typeconfig['organizationid']; $course = $PAGE->course; $requestparams = lti_build_request($instance, $typeconfig, $course); $launchcontainer = lti_get_launch_container($instance, $typeconfig); $returnurlparams = array('course' => $course->id, 'launch_container' => $launchcontainer, 'instanceid' => $instance->id); if ( $orgid ) { $requestparams["tool_consumer_instance_guid"] = $orgid; } if (empty($key) || empty($secret)) { $returnurlparams['unsigned'] = '1'; //Add the return URL. We send the launch container along to help us avoid frames-within-frames when the user returns $url = new moodle_url('/mod/lti/return.php', $returnurlparams); $returnurl = $url->out(false); if ($typeconfig['forcessl'] == '1') { $returnurl = lti_ensure_url_is_https($returnurl); } $requestparams['launch_presentation_return_url'] = $returnurl; } if (!empty($key) && !empty($secret)) { $parms = lti_sign_parameters($requestparams, $endpoint, "POST", $key, $secret); } else { //If no key and secret, do the launch unsigned. $parms = $requestparams; } $debuglaunch = ( $instance->debuglaunch == 1 ); $content = lti_post_launch_html($parms, $endpoint, $debuglaunch); echo $content; }
function lti_update_type($type, $config) { global $DB, $CFG; lti_prepare_type_for_save($type, $config); $clearcache = false; if (lti_request_is_using_ssl() && !empty($type->secureicon)) { $clearcache = !isset($config->oldicon) || $config->oldicon !== $type->secureicon; } else { $clearcache = isset($type->icon) && (!isset($config->oldicon) || $config->oldicon !== $type->icon); } unset($config->oldicon); if ($DB->update_record('lti_types', $type)) { foreach ($config as $key => $value) { if (substr($key, 0, 4) == 'lti_' && !is_null($value)) { $record = new \StdClass(); $record->typeid = $type->id; $record->name = substr($key, 4); $record->value = $value; lti_update_config($record); } } require_once $CFG->libdir . '/modinfolib.php'; if ($clearcache) { rebuild_course_cache(); } } }
/** * Prints a Basic LTI activity * * $param int $basicltiid Basic LTI activity id */ function lti_view($instance) { global $PAGE, $CFG; if (empty($instance->typeid)) { $tool = lti_get_tool_by_url_match($instance->toolurl, $instance->course); if ($tool) { $typeid = $tool->id; } else { $typeid = null; } } else { $typeid = $instance->typeid; } if ($typeid) { $typeconfig = lti_get_type_config($typeid); } else { //There is no admin configuration for this tool. Use configuration in the lti instance record plus some defaults. $typeconfig = (array) $instance; $typeconfig['sendname'] = $instance->instructorchoicesendname; $typeconfig['sendemailaddr'] = $instance->instructorchoicesendemailaddr; $typeconfig['customparameters'] = $instance->instructorcustomparameters; $typeconfig['acceptgrades'] = $instance->instructorchoiceacceptgrades; $typeconfig['allowroster'] = $instance->instructorchoiceallowroster; $typeconfig['forcessl'] = '0'; } //Default the organizationid if not specified if (empty($typeconfig['organizationid'])) { $urlparts = parse_url($CFG->wwwroot); $typeconfig['organizationid'] = $urlparts['host']; } if (!empty($instance->resourcekey)) { $key = $instance->resourcekey; } else { if (!empty($typeconfig['resourcekey'])) { $key = $typeconfig['resourcekey']; } else { $key = ''; } } if (!empty($instance->password)) { $secret = $instance->password; } else { if (!empty($typeconfig['password'])) { $secret = $typeconfig['password']; } else { $secret = ''; } } $endpoint = !empty($instance->toolurl) ? $instance->toolurl : $typeconfig['toolurl']; $endpoint = trim($endpoint); //If the current request is using SSL and a secure tool URL is specified, use it if (lti_request_is_using_ssl() && !empty($instance->securetoolurl)) { $endpoint = trim($instance->securetoolurl); } //If SSL is forced, use the secure tool url if specified. Otherwise, make sure https is on the normal launch URL. if ($typeconfig['forcessl'] == '1') { if (!empty($instance->securetoolurl)) { $endpoint = trim($instance->securetoolurl); } $endpoint = lti_ensure_url_is_https($endpoint); } else { if (!strstr($endpoint, '://')) { $endpoint = 'http://' . $endpoint; } } $orgid = $typeconfig['organizationid']; $course = $PAGE->course; $requestparams = lti_build_request($instance, $typeconfig, $course, $typeid); $launchcontainer = lti_get_launch_container($instance, $typeconfig); $returnurlparams = array('course' => $course->id, 'launch_container' => $launchcontainer, 'instanceid' => $instance->id); if ($orgid) { $requestparams["tool_consumer_instance_guid"] = $orgid; } if (!empty($CFG->mod_lti_institution_name)) { $requestparams['tool_consumer_instance_name'] = $CFG->mod_lti_institution_name; } else { $requestparams['tool_consumer_instance_name'] = get_site()->fullname; } if (empty($key) || empty($secret)) { $returnurlparams['unsigned'] = '1'; } // Add the return URL. We send the launch container along to help us avoid frames-within-frames when the user returns. $url = new moodle_url('/mod/lti/return.php', $returnurlparams); $returnurl = $url->out(false); if ($typeconfig['forcessl'] == '1') { $returnurl = lti_ensure_url_is_https($returnurl); } $target = null; switch ($launchcontainer) { case LTI_LAUNCH_CONTAINER_EMBED: case LTI_LAUNCH_CONTAINER_EMBED_NO_BLOCKS: $target = 'iframe'; break; case LTI_LAUNCH_CONTAINER_REPLACE_MOODLE_WINDOW: $target = 'frame'; break; case LTI_LAUNCH_CONTAINER_WINDOW: $target = 'window'; break; } if (!is_null($target)) { $requestparams['launch_presentation_document_target'] = $target; } $requestparams['launch_presentation_return_url'] = $returnurl; // Allow request params to be updated by sub-plugins. $plugins = core_component::get_plugin_list('ltisource'); foreach (array_keys($plugins) as $plugin) { $pluginparams = component_callback('ltisource_' . $plugin, 'before_launch', array($instance, $endpoint, $requestparams), array()); if (!empty($pluginparams) && is_array($pluginparams)) { $requestparams = array_merge($requestparams, $pluginparams); } } if (!empty($key) && !empty($secret)) { $parms = lti_sign_parameters($requestparams, $endpoint, "POST", $key, $secret); $endpointurl = new moodle_url($endpoint); $endpointparams = $endpointurl->params(); // Strip querystring params in endpoint url from $parms to avoid duplication. if (!empty($endpointparams) && !empty($parms)) { foreach (array_keys($endpointparams) as $paramname) { if (isset($parms[$paramname])) { unset($parms[$paramname]); } } } } else { //If no key and secret, do the launch unsigned. $parms = $requestparams; } $debuglaunch = $instance->debuglaunch == 1; $content = lti_post_launch_html($parms, $endpoint, $debuglaunch); echo $content; }
function lti_update_type($type, $config) { global $DB, $CFG; lti_prepare_type_for_save($type, $config); $clearcache = false; if (lti_request_is_using_ssl() && !empty($type->secureicon)) { $clearcache = !isset($config->oldicon) || ($config->oldicon !== $type->secureicon); } else { $clearcache = isset($type->icon) && (!isset($config->oldicon) || ($config->oldicon !== $type->icon)); } unset($config->oldicon); if ($DB->update_record('lti_types', $type)) { foreach ($config as $key => $value) { if (substr($key, 0, 4) == 'lti_' && !is_null($value)) { $record = new \StdClass(); $record->typeid = $type->id; $record->name = substr($key, 4); $record->value = $value; lti_update_config($record); } } require_once($CFG->libdir.'/modinfolib.php'); if ($clearcache) { $sql = "SELECT DISTINCT course FROM {lti} WHERE typeid = ?"; $courses = $DB->get_fieldset_sql($sql, array($type->id)); foreach ($courses as $courseid) { rebuild_course_cache($courseid, true); } } } }