Test launch works
authorChris Scribner <scriby@gmail.com>
Mon, 29 Aug 2011 20:27:41 +0000 (16:27 -0400)
committerChris Scribner <scriby@gmail.com>
Mon, 7 Nov 2011 01:41:45 +0000 (20:41 -0500)
mod/blti/db/install.xml
mod/blti/locallib.php
mod/blti/settings.php
mod/blti/typessettings.php
mod/blti/view.php

index a0a84d8..2836791 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="mod/blti/db" VERSION="20110826" COMMENT="XMLDB file for Moodle mod/blti"
+<XMLDB PATH="mod/blti/db" VERSION="20110829" COMMENT="XMLDB file for Moodle mod/blti"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
 >
@@ -38,8 +38,9 @@
       <FIELDS>
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="true" NEXT="name"/>
         <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" DEFAULT="basiclti Activity" SEQUENCE="false" COMMENT="Activity name" PREVIOUS="id" NEXT="baseurl"/>
-        <FIELD NAME="baseurl" TYPE="text" LENGTH="small" NOTNULL="true" SEQUENCE="false" PREVIOUS="name" NEXT="state"/>
-        <FIELD NAME="state" TYPE="int" LENGTH="2" NOTNULL="true" UNSIGNED="true" DEFAULT="2" SEQUENCE="false" COMMENT="Active = 1, Pending = 2, Rejected = 3" PREVIOUS="baseurl" NEXT="course"/>
+        <FIELD NAME="baseurl" TYPE="text" LENGTH="small" NOTNULL="true" SEQUENCE="false" PREVIOUS="name" NEXT="tooldomain"/>
+        <FIELD NAME="tooldomain" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" PREVIOUS="baseurl" NEXT="state"/>
+        <FIELD NAME="state" TYPE="int" LENGTH="2" NOTNULL="true" UNSIGNED="true" DEFAULT="2" SEQUENCE="false" COMMENT="Active = 1, Pending = 2, Rejected = 3" PREVIOUS="tooldomain" NEXT="course"/>
         <FIELD NAME="course" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="state" NEXT="coursevisible"/>
         <FIELD NAME="coursevisible" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="course" NEXT="createdby"/>
         <FIELD NAME="createdby" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="coursevisible" NEXT="timecreated"/>
@@ -50,7 +51,8 @@
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
       </KEYS>
       <INDEXES>
-        <INDEX NAME="course" UNIQUE="false" FIELDS="course"/>
+        <INDEX NAME="course" UNIQUE="false" FIELDS="course" NEXT="tooldomain"/>
+        <INDEX NAME="tooldomain" UNIQUE="false" FIELDS="tooldomain" PREVIOUS="course"/>
       </INDEXES>
     </TABLE>
     <TABLE NAME="blti_types_config" COMMENT="Basic LTI types configuration" PREVIOUS="blti_types">
index 1885cb1..8e616f1 100644 (file)
@@ -49,6 +49,8 @@ defined('MOODLE_INTERNAL') || die;
 \r
 require_once($CFG->dirroot.'/mod/blti/OAuth.php');\r
 \r
+define('BLTI_URL_DOMAIN_REGEX', '/(?:https?:\/\/)?(?:www\.)?([^\/]+)(?:\/|$)/i');\r
+\r
 /**\r
  * Prints a Basic LTI activity\r
  *\r
@@ -57,10 +59,21 @@ require_once($CFG->dirroot.'/mod/blti/OAuth.php');
 function blti_view($instance, $makeobject=false) {\r
     global $PAGE;\r
 \r
-    $typeconfig = blti_get_type_config($instance->typeid);\r
-    $endpoint = $typeconfig['toolurl'];\r
-    $key = $typeconfig['resourcekey'];\r
-    $secret = $typeconfig['password'];\r
+    if(empty($instance->typeid)){\r
+        $tool = blti_get_tool_by_url_match($instance->toolurl);\r
+        if($tool){\r
+            $typeid = $tool->id;\r
+        } else {\r
+            //Tool not found\r
+        }\r
+    } else {\r
+        $typeid = $instance->typeid;\r
+    }\r
+    \r
+    $typeconfig = blti_get_type_config($typeid);\r
+    $endpoint = !empty($instance->toolurl) ? $instance->toolurl : $typeconfig['toolurl'];\r
+    $key = !empty($instance->resourcekey) ? $instance->resourcekey : $typeconfig['resourcekey'];\r
+    $secret = !empty($instance->password) ? $instance->password : $typeconfig['password'];\r
     $orgid = $typeconfig['organizationid'];\r
     /* Suppress this for now - Chuck\r
     $orgdesc = $typeconfig['organizationdescr'];\r
@@ -80,11 +93,8 @@ function blti_view($instance, $makeobject=false) {
 \r
     $debuglaunch = ( $instance->debuglaunch == 1 );\r
     if ( $makeobject ) {\r
-        // TODO: Need frame height\r
-        $height = $instance->preferheight;\r
-        if ((!$height) || ($height == 0)) {\r
-            $height = 400;\r
-        }\r
+        $height = 600;\r
+        \r
         $content = post_launch_html($parms, $endpoint, $debuglaunch, $height);\r
     } else {\r
         $content = post_launch_html($parms, $endpoint, $debuglaunch, false);\r
@@ -126,7 +136,7 @@ function blti_build_request($instance, $typeconfig, $course) {
         "launch_presentation_locale" => $locale,\r
     );\r
 \r
-    $placementsecret = $instance->placementsecret;\r
+    $placementsecret = $typeconfig['servicesalt'];\r
     if ( isset($placementsecret) ) {\r
         $suffix = ':::' . $USER->id . ':::' . $instance->id;\r
         $plaintext = $placementsecret . $suffix;\r
@@ -148,17 +158,6 @@ function blti_build_request($instance, $typeconfig, $course) {
         $requestparams["ext_ims_lis_memberships_url"] = $CFG->wwwroot.'/mod/blti/service.php';\r
     }\r
 \r
-    if ( isset($placementsecret) &&\r
-         ( $typeconfig['allowsetting'] == 1 ||\r
-         ( $typeconfig['allowsetting'] == 2 && $instance->instructorchoiceallowsetting == 1 ) ) ) {\r
-        $requestparams["ext_ims_lti_tool_setting_id"] = $sourcedid;\r
-        $requestparams["ext_ims_lti_tool_setting_url"] = $CFG->wwwroot.'/mod/blti/service.php';\r
-        $setting = $instance->setting;\r
-        if ( isset($setting) ) {\r
-             $requestparams["ext_ims_lti_tool_setting"] = $setting;\r
-        }\r
-    }\r
-\r
     // Send user's name and email data if appropriate\r
     if ( $typeconfig['sendname'] == 1 ||\r
          ( $typeconfig['sendname'] == 2 && $instance->instructorchoicesendname == 1 ) ) {\r
@@ -299,16 +298,10 @@ function blti_get_type_config($typeid) {
     return $typeconfig;\r
 }\r
 \r
-/**\r
- * Returns all tool instances with a typeid of 0 that\r
- * marks them as unconfigured. These tools usually proceed from a\r
- * backup - restore process.\r
- *\r
- */\r
-function blti_get_unconfigured_tools() {\r
+function blti_get_tools_by_domain($domain){\r
     global $DB;\r
-\r
-    return $DB->get_records('blti', array('typeid' => 0));\r
+    \r
+    return $DB->get_records('blti_types', array('tooldomain' => $domain));\r
 }\r
 \r
 /**\r
@@ -334,6 +327,53 @@ function blti_get_types_for_add_instance(){
     return $types;\r
 }\r
 \r
+function blti_get_domain_from_url($url){\r
+    $matches = array();\r
+    \r
+    if(preg_match(BLTI_URL_DOMAIN_REGEX, $url, $matches)){\r
+        return $matches[1];\r
+    }\r
+}\r
+\r
+function blti_get_tool_by_url_match($url){\r
+    $domain = blti_get_domain_from_url($url);\r
+    \r
+    $possibletools = blti_get_tools_by_domain($domain);\r
+    \r
+    return blti_get_best_tool_by_url($url, $possibletools);\r
+}\r
+\r
+function blti_get_best_tool_by_url($url, $tools){\r
+    if(count($tools) === 0){\r
+        return null;\r
+    }\r
+    \r
+    $urllower = strtolower($url);\r
+    \r
+    foreach($tools as $tool){\r
+        $tool->_matchscore = 0;\r
+        \r
+        $toolbaseurllower = strtolower($tool->baseurl);\r
+        \r
+        if($urllower === $toolbaseurllower){\r
+            $tool->_matchscore += 100;\r
+        } else if(strstr($urllower, $toolbaseurllower) >= 0){\r
+            $tool->_matchscore += 50;\r
+        }\r
+    }\r
+    \r
+    $bestmatch = array_reduce($tools, function($value, $tool){\r
+        if($tool->_matchscore > $value->_matchscore){\r
+            return $tool;\r
+        } else {\r
+            return $value;\r
+        }\r
+        \r
+    }, (object)array('_matchscore' => -1));\r
+    \r
+    return $bestmatch;\r
+}\r
+\r
 /**\r
  * Prints the various configured tool types\r
  *\r
@@ -554,7 +594,9 @@ function blti_update_config($config) {
     global $DB;\r
 \r
     $return = true;\r
-    if ($old = $DB->get_record('blti_types_config', array('typeid' => $config->typeid, 'name' => $config->name))) {\r
+    $old = $DB->get_record('blti_types_config', array('typeid' => $config->typeid, 'name' => $config->name));\r
+    \r
+    if ($old) {\r
         $config->id = $old->id;\r
         $return = $DB->update_record('blti_types_config', $config);\r
     } else {\r
@@ -563,52 +605,6 @@ function blti_update_config($config) {
     return $return;\r
 }\r
 \r
-/**\r
- * Prints the screen that handles misconfigured objects due to\r
- * an incomplete backup - restore process\r
- *\r
- * @param int $id ID of the misconfigured tool\r
- *\r
- */\r
-function blti_fix_misconfigured_choice($id) {\r
-    global $CFG, $USER, $OUTPUT;\r
-\r
-    echo $OUTPUT->box_start('generalbox');\r
-    echo '<div>';\r
-    $types = blti_filter_get_types();\r
-    if (!empty($types)) {\r
-        echo '<h4 class="main">'.get_string('fixexistingconf', 'blti').'</h4></br>';\r
-        echo '<form action='.$CFG->wwwroot.'/mod/blti/typessettings.php?action=fix&amp;sesskey='.$USER->sesskey.' method="post">';\r
-\r
-        foreach ($types as $type) {\r
-            echo '<input type="radio" name="useexisting" value="'.$type->id.'" />'.$type->name.'<br />';\r
-        }\r
-        echo '<input type="hidden" name="id" value="'.$id.'"/>';\r
-        echo '<br />';\r
-        echo '<div class="message"><input type="submit" value="'.get_string('fixold', 'blti').'"></div>';\r
-        echo '</form>';\r
-    } else {\r
-        echo '<div class="message">';\r
-        echo get_string('notypes', 'blti');\r
-        echo '</div>';\r
-    }\r
-    echo '</div>';\r
-    echo $OUTPUT->box_end();\r
-\r
-    echo $OUTPUT->box_start("generalbox");\r
-    echo '<div>';\r
-    echo '<h4 class="main">'.get_string('fixnewconf', 'blti').'</h4></br>';\r
-    echo '<form action='.$CFG->wwwroot.'/mod/blti/typessettings.php?action=fix&amp;sesskey='.$USER->sesskey.' method="post">';\r
-    echo '<input type="hidden" name="id" value="'.$id.'"/>';\r
-    echo '<input type="hidden" name="definenew" value="1"/>';\r
-    echo '<div class="message"><input type="submit" value="'.get_string('fixnew', 'blti').'"></div>';\r
-    echo '</form>';\r
-    echo '</div>';\r
-    echo $OUTPUT->box_end();\r
-\r
-}\r
-\r
-\r
 /**\r
  * Signs the petition to launch the external tool using OAuth\r
  *\r
index c730ce1..c0a7d71 100644 (file)
@@ -79,22 +79,5 @@ if ($ADMIN->fulltree) {
 \r
 \r
     $settings->add(new admin_setting_heading('blti_types', get_string('configuredtools', 'blti'), $str));\r
-\r
-    $unconfigured = blti_get_unconfigured_tools();\r
-    if (!empty($unconfigured)) {\r
-        $newstr = '<table>';\r
-        $newstr .= '<tr> <th>Course</th> <th>Tool Name</th> </tr>';\r
-\r
-        foreach ($unconfigured as $unconf) {\r
-            $coursename = $DB->get_field('course', 'shortname', array('id' => $unconf->course));\r
-            $newstr .= '<tr>'.\r
-                       '<td>'.$coursename.'</td><td>'.$unconf->name.'</td>'.\r
-                       '<td align="center"><a class="editing_update" href="'.$CFG->wwwroot.'/mod/blti/typessettings.php?action=fix&amp;id='.$unconf->id.'&amp;sesskey='.$USER->sesskey.'" title="Fix">'.\r
-                       '<img class="iconsmall" alt="Update" src="'.$CFG->wwwroot.'/pix/t/edit.gif"/></a>'.'&nbsp;&nbsp;'.'</td>'.\r
-                       '</tr>';\r
-        }\r
-        $newstr .= '</table>';\r
-\r
-        $settings->add(new admin_setting_heading('blti_mis_types', get_string('misconfiguredtools', 'blti'), $newstr));\r
-    }\r
+    \r
 }\r
index 4421401..670e2a3 100644 (file)
@@ -77,6 +77,7 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->submitbutton
     $type = new StdClass();\r
     $type->name = $data->lti_typename;\r
     $type->baseurl = $data->lti_toolurl;\r
+    $type->tooldomain = blti_get_domain_from_url($data->lti_toolurl);\r
     $type->course = $SITE->id;\r
     $type->coursevisible = 1;\r
     $type->timemodified = time();\r
@@ -86,7 +87,7 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->submitbutton
         \r
         if ($DB->update_record('blti_types', $type)) {\r
             unset ($data->lti_typename);\r
-            //@TODO: update work\r
+            \r
             foreach ($data as $key => $value) {\r
                 if (substr($key, 0, 4)=='lti_' && !is_null($value)) {\r
                     $record = new StdClass();\r
@@ -107,14 +108,12 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->submitbutton
         $type->createdby = $USER->id;\r
         $type->timecreated = time();\r
         \r
-        if ($id = $DB->insert_record('blti_types', $type)) {\r
-            if (!empty($data->lti_fix)) {\r
-                $instance = $DB->get_record('blti', array('id' => $data->lti_fix));\r
-                $instance->typeid = $id;\r
-                $DB->update_record('blti', $instance);\r
-            }\r
-            unset ($data->lti_fix);\r
-\r
+        //Create a salt value to be used for signing passed data to extension services\r
+        $data->lti_servicesalt = uniqid('', true);\r
+        \r
+        $id = $DB->insert_record('blti_types', $type);\r
+        \r
+        if ($id) {\r
             unset ($data->lti_typename);\r
             foreach ($data as $key => $value) {\r
                 if (substr($key, 0, 4)=='lti_' && !is_null($value)) {\r
@@ -135,18 +134,6 @@ if ($data = data_submitted() and confirm_sesskey() and isset($data->submitbutton
         redirect("$CFG->wwwroot/$CFG->admin/settings.php?section=modsettingblti");\r
         die;\r
     }\r
-    if (empty($adminroot->errors)) {\r
-        switch ($return) {\r
-            case 'site':  redirect("$CFG->wwwroot/");\r
-            case 'admin': redirect("$CFG->wwwroot/$CFG->admin/");\r
-        }\r
-    } else {\r
-        $errormsg = get_string('errorwithsettings', 'admin');\r
-        $firsterror = reset($adminroot->errors);\r
-        $focus = $firsterror->id;\r
-    }\r
-    $adminroot =& admin_get_root(true); //reload tree\r
-    $page      =& $adminroot->locate($section);\r
 }\r
 \r
 if ($action == 'delete') {\r
@@ -236,15 +223,6 @@ if (empty($SITE->fullname)) {
         $type = blti_get_type_type_config($id);\r
         $form->set_data($type);\r
         $form->display();\r
-    } else if ($action == 'fix') {\r
-        if (!isset($definenew) && !isset($useexisting)) {\r
-            blti_fix_misconfigured_choice($id);\r
-        } else if (isset($definenew)) {\r
-            $form = new mod_blti_edit_types_form();\r
-            $type = blti_get_type_config_from_instance($id);\r
-            $form->set_data($type);\r
-            $form->display();\r
-        }\r
     }\r
 \r
     echo $OUTPUT->box_end();\r
index 0484070..47364bf 100644 (file)
@@ -99,10 +99,6 @@ echo $OUTPUT->header();
 echo $OUTPUT->heading(format_string($basiclti->name));\r
 echo $OUTPUT->box($basiclti->intro, 'generalbox description', 'intro');\r
 \r
-if ($basiclti->typeid == 0) {\r
-    print_error('errormisconfig', 'blti');\r
-}\r
-\r
 if ($basiclti->instructorchoiceacceptgrades == 1) {\r
     echo '<div class="reportlink">'.submittedlink($cm).'</div>';\r
 }\r
@@ -110,7 +106,7 @@ if ($basiclti->instructorchoiceacceptgrades == 1) {
 echo $OUTPUT->box_start('generalbox activity');\r
 \r
 \r
-if ( $basiclti->launchinpopup > 0 ) {\r
+if ( false /*$basiclti->launchinpopup > 0*/ ) {\r
     print "<script language=\"javascript\">//<![CDATA[\n";\r
     print "window.open('launch.php?id=".$cm->id."','window name');";\r
     print "//]]\n";\r
@@ -118,10 +114,11 @@ if ( $basiclti->launchinpopup > 0 ) {
     print "<p>".get_string("basiclti_in_new_window", "blti")."</p>\n";\r
 } else {\r
     // Request the launch content with an object tag\r
-    $height = $basiclti->preferheight;\r
+    /*$height = $basiclti->preferheight;\r
     if ((!$height) || ($height == 0)) {\r
         $height = 400;\r
-    }\r
+    }*/\r
+    $height=600;\r
     print '<object height="'.$height.'" width="100%" data="launch.php?id='.$cm->id.'&amp;withobject=true"></object>';\r
 \r
 }\r