/**
  * Prepares the form before data are set
  *
  * Additional wysiwyg editors are prepared here
  * along with the stopbutton switch, type and text
  *
  * @param array $data to be set
  * @return void
  */
 function data_preprocessing(&$data)
 {
     // Note: if you call "file_prepare_draft_area()" without setting itemid
     // (the first argument), then it will be assigned automatically, and the files
     // for this context will be transferred automatically, which is what we want
     $data['sourceitemid'] = 0;
     if ($this->is_add()) {
         $contextid = null;
     } else {
         $contextid = $this->context->id;
     }
     $options = hotpot::sourcefile_options();
     // array('subdirs' => 1, 'maxbytes' => 0, 'maxfiles' => -1);
     file_prepare_draft_area($data['sourceitemid'], $contextid, 'mod_hotpot', 'sourcefile', 0, $options);
     if ($this->is_add()) {
         // set fields from user preferences, where possible
         foreach (hotpot::user_preferences_fieldnames() as $fieldname) {
             if (!isset($data[$fieldname])) {
                 $data[$fieldname] = get_user_preferences('hotpot_' . $fieldname, '');
             }
         }
     }
     // set entry/exit page settings
     foreach (hotpot::text_page_types() as $type) {
         // extract boolean switches for page options
         foreach (hotpot::text_page_options($type) as $name => $mask) {
             $data[$type . '_' . $name] = $data[$type . 'options'] & $mask;
         }
         // setup custom wysiwyg editor
         $draftitemid = 0;
         if ($this->is_add()) {
             // adding a new hotpot instance
             $data[$type . 'editor'] = array('text' => file_prepare_draft_area($draftitemid, $contextid, 'mod_hotpot', $type, 0), 'format' => editors_get_preferred_format(), 'itemid' => file_get_submitted_draft_itemid($type));
         } else {
             // editing an existing hotpot
             $data[$type . 'editor'] = array('text' => file_prepare_draft_area($draftitemid, $contextid, 'mod_hotpot', $type, 0, $options, $data[$type . 'text']), 'format' => $data[$type . 'format'], 'itemid' => file_get_submitted_draft_itemid($type));
         }
     }
     // timelimit
     if ($data['timelimit'] > 0) {
         $data['timelimitspecific'] = $data['timelimit'];
         $data['timelimit'] = hotpot::TIME_SPECIFIC;
     } else {
         $data['timelimitspecific'] = 0;
     }
     // delay3
     if ($data['delay3'] > 0) {
         $data['delay3specific'] = $data['delay3'];
         $data['delay3'] = hotpot::TIME_SPECIFIC;
     } else {
         $data['delay3specific'] = 0;
     }
     // set stopbutton options
     switch ($data['stopbutton']) {
         case hotpot::STOPBUTTON_SPECIFIC:
             $data['stopbutton_yesno'] = 1;
             $data['stopbutton_type'] = 'specific';
             $data['stopbutton_text'] = $data['stoptext'];
             break;
         case hotpot::STOPBUTTON_LANGPACK:
             $data['stopbutton_yesno'] = 1;
             $data['stopbutton_type'] = $data['stoptext'];
             $data['stopbutton_text'] = '';
             break;
         case hotpot::STOPBUTTON_NONE:
         default:
             $data['stopbutton_yesno'] = 0;
             $data['stopbutton_type'] = '';
             $data['stopbutton_text'] = '';
     }
     // set review options
     if (empty($data['reviewoptions'])) {
         $default = 0;
     } else {
         $default = $data['reviewoptions'];
     }
     list($times, $items) = hotpot::reviewoptions_times_items();
     foreach ($times as $timename => $timevalue) {
         foreach ($items as $itemname => $itemvalue) {
             $data[$timename . $itemname] = min(1, $default & $timevalue & $itemvalue);
         }
     }
 }
Beispiel #2
0
    $cm = get_coursemodule_from_id('hotpot', $id, 0, false, MUST_EXIST);
    $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
    $hotpot = $DB->get_record('hotpot', array('id' => $cm->instance), '*', MUST_EXIST);
} else {
    $hotpot = $DB->get_record('hotpot', array('id' => $hp), '*', MUST_EXIST);
    $course = $DB->get_record('course', array('id' => $hotpot->course), '*', MUST_EXIST);
    $cm = get_coursemodule_from_instance('hotpot', $hotpot->id, $course->id, false, MUST_EXIST);
}
// check login
require_login($course, true, $cm);
if (!has_capability('mod/hotpot:reviewallattempts', $PAGE->context)) {
    require_capability('mod/hotpot:reviewmyattempts', $PAGE->context);
}
add_to_log($course->id, 'hotpot', 'report', 'report.php?id=' . $cm->id, $hotpot->id, $cm->id);
// Create an object to represent the current HotPot activity
$hotpot = hotpot::create($hotpot, $cm, $course, $PAGE->context);
// delete attempts, if requested
$action = optional_param('action', '', PARAM_ALPHA);
$confirmed = optional_param('confirmed', 0, PARAM_INT);
if (function_exists('optional_param_array')) {
    $selected = optional_param_array('selected', 0, PARAM_INT);
} else {
    $selected = optional_param('selected', 0, PARAM_INT);
}
if ($action == 'deleteselected') {
    require_sesskey();
    if ($confirmed) {
        $hotpot->delete_attempts($selected, false);
    } else {
        // show a confirm button ?
    }
 /**
  * print_legend
  */
 function print_legend()
 {
     if (empty($this->legend)) {
         return false;
     }
     $stringids = array();
     foreach ($this->legend as $column => $responses) {
         foreach ($responses as $i => $stringid) {
             $stringids[$stringid] = true;
         }
     }
     $strings = hotpot::get_strings(array_keys($stringids));
     unset($stringids, $column, $responses, $i, $stringid);
     foreach ($this->legend as $column => $responses) {
         echo html_writer::start_tag('table');
         echo html_writer::start_tag('tbody');
         foreach ($responses as $i => $response) {
             if (isset($strings[$response])) {
                 $response_string = $strings[$response]->string;
             } else {
                 $response_string = 'Unrecognized string id: ' . $response;
             }
             echo html_writer::tag('tr', html_writer::tag('td', $this->format_header($column)) . html_writer::tag('td', $this->format_legend_index($i)) . html_writer::tag('td', $response_string));
             $column = ' ';
         }
         echo html_writer::end_tag('tbody');
         echo html_writer::end_tag('table');
     }
 }
/**
 * xmldb_hotpot_upgrade
 *
 * @param xxx $oldversion
 * @return xxx
 */
function xmldb_hotpot_upgrade($oldversion)
{
    global $CFG, $DB;
    // this flag will be set to true if any upgrade needs to empty the HotPot cache
    $empty_cache = false;
    $dbman = $DB->get_manager();
    //===== 1.9.0 upgrade line ======//
    // update hotpot grades from sites earlier than Moodle 1.9, 27th March 2008
    $newversion = 2007101511;
    if ($oldversion < $newversion) {
        // ensure "hotpot_upgrade_grades" function is available
        require_once $CFG->dirroot . '/mod/hotpot/lib.php';
        hotpot_upgrade_grades();
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2008011200;
    if ($oldversion < $newversion) {
        // remove unused config setting
        unset_config('hotpot_initialdisable');
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080301;
    if ($oldversion < $newversion) {
        // remove unused config settings
        unset_config('hotpot_showtimes');
        unset_config('hotpot_excelencodings');
        // modify table: hotpot
        $table = new xmldb_table('hotpot');
        // expected structure of hotpot table when we start this upgrade:
        // (i.e. this is how things were at the end of Moodle 1.9)
        //   id, course, name, summary, timeopen, timeclose, location, reference,
        //   outputformat, navigation, studentfeedback, studentfeedbackurl,
        //   forceplugins, shownextquiz, review, grade, grademethod, attempts,
        //   password, subnet, clickreporting, timecreated, timemodified
        // convert, move and rename fields ($newname => $oldfield)
        $fields = array('outputformat' => new xmldb_field('outputformat', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL), 'timeopen' => new xmldb_field('timeopen', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'studentfeedbackurl'), 'timeclose' => new xmldb_field('timeclose', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'timeopen'), 'grademethod' => new xmldb_field('grademethod', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'grade'), 'sourcefile' => new xmldb_field('reference', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'name'), 'sourcelocation' => new xmldb_field('location', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'sourcefile'), 'entrytext' => new xmldb_field('summary', XMLDB_TYPE_TEXT, 'small', null, null, null, null, 'sourcelocation'), 'reviewoptions' => new xmldb_field('review', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), 'attemptlimit' => new xmldb_field('attempts', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'reviewoptions'), 'gradeweighting' => new xmldb_field('grade', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'attemptlimit'));
        foreach ($fields as $newname => $field) {
            if ($dbman->field_exists($table, $field)) {
                xmldb_hotpot_fix_previous_field($dbman, $table, $field);
                $dbman->change_field_type($table, $field);
                if ($field->getName() != $newname) {
                    $dbman->rename_field($table, $field, $newname);
                }
            }
        }
        // add fields
        $fields = array(new xmldb_field('sourcefile', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'name'), new xmldb_field('sourcetype', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'sourcefile'), new xmldb_field('sourceitemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'sourcetype'), new xmldb_field('sourcelocation', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'sourceitemid'), new xmldb_field('configfile', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'sourcelocation'), new xmldb_field('configitemid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'configfile'), new xmldb_field('configlocation', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'configitemid'), new xmldb_field('entrycm', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'configlocation'), new xmldb_field('entrygrade', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '100', 'entrycm'), new xmldb_field('entrypage', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'entrygrade'), new xmldb_field('entrytext', XMLDB_TYPE_TEXT, 'small', null, null, null, null, 'entrypage'), new xmldb_field('entryformat', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'entrytext'), new xmldb_field('entryoptions', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'entryformat'), new xmldb_field('exitpage', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'entryoptions'), new xmldb_field('exittext', XMLDB_TYPE_TEXT, 'small', null, null, null, null, 'exitpage'), new xmldb_field('exitformat', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'exittext'), new xmldb_field('exitoptions', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'exitformat'), new xmldb_field('exitcm', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'exitoptions'), new xmldb_field('title', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '3', 'navigation'), new xmldb_field('stopbutton', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'title'), new xmldb_field('stoptext', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'stopbutton'), new xmldb_field('usefilters', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'stoptext'), new xmldb_field('useglossary', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'usefilters'), new xmldb_field('usemediafilter', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'useglossary'), new xmldb_field('timelimit', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'timeclose'), new xmldb_field('delay1', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'timelimit'), new xmldb_field('delay2', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'delay1'), new xmldb_field('delay3', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '2', 'delay2'), new xmldb_field('discarddetails', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'clickreporting'));
        foreach ($fields as $field) {
            if (!$dbman->field_exists($table, $field)) {
                xmldb_hotpot_fix_previous_field($dbman, $table, $field);
                $dbman->add_field($table, $field);
            }
        }
        // remove field: forceplugins (replaced by "usemediafilter")
        $field = new xmldb_field('forceplugins', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
        if ($dbman->field_exists($table, $field)) {
            $DB->execute('UPDATE {hotpot} SET ' . "usemediafilter='moodle'" . ' WHERE forceplugins=1');
            $dbman->drop_field($table, $field);
        }
        // remove field: shownextquiz (replaced by "exitcm")
        $field = new xmldb_field('shownextquiz', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
        if ($dbman->field_exists($table, $field)) {
            // set exitcm to show next HotPot: -4 = hotpot::ACTIVITY_SECTION_HOTPOT
            $DB->execute('UPDATE {hotpot} SET exitcm=-4 WHERE shownextquiz=1');
            $dbman->drop_field($table, $field);
        }
        // append "id" to fields that are foreign keys in other hotpot tables
        $fields = array('hotpot_attempts' => array('hotpot'), 'hotpot_details' => array('attempt'), 'hotpot_questions' => array('hotpot'), 'hotpot_responses' => array('attempt', 'question'));
        foreach ($fields as $tablename => $fieldnames) {
            $table = new xmldb_table($tablename);
            foreach ($fieldnames as $fieldname) {
                $field = new xmldb_field($fieldname, XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
                if ($dbman->field_exists($table, $field)) {
                    // maybe we should remove all indexes and keys
                    // using this $fieldname before we rename the field
                    $dbman->rename_field($table, $field, $fieldname . 'id');
                }
            }
        }
        // create new table: hotpot_cache
        $table = new xmldb_table('hotpot_cache');
        if (!$dbman->table_exists($table)) {
            $table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
            $table->add_field('hotpotid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
            $table->add_field('slasharguments', XMLDB_TYPE_CHAR, '1', null, XMLDB_NOTNULL);
            $table->add_field('hotpot_enableobfuscate', XMLDB_TYPE_CHAR, '1', null, XMLDB_NOTNULL);
            $table->add_field('hotpot_enableswf', XMLDB_TYPE_CHAR, '1', null, XMLDB_NOTNULL);
            $table->add_field('name', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('sourcefile', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('sourcetype', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('sourcelocation', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL);
            $table->add_field('sourcelastmodified', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('sourceetag', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('configfile', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('configlocation', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
            $table->add_field('configlastmodified', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('configetag', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('navigation', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
            $table->add_field('title', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
            $table->add_field('stopbutton', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, null, null, '0');
            $table->add_field('stoptext', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('usefilters', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, null, null, '0');
            $table->add_field('useglossary', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, null, null, '0');
            $table->add_field('usemediafilter', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, '0');
            $table->add_field('studentfeedback', XMLDB_TYPE_INTEGER, '4', null, XMLDB_NOTNULL, null, '0');
            $table->add_field('studentfeedbackurl', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL);
            $table->add_field('timelimit', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0');
            $table->add_field('delay3', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '-1');
            $table->add_field('clickreporting', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
            $table->add_field('content', XMLDB_TYPE_TEXT, 'medium', null, XMLDB_NOTNULL);
            $table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL);
            $table->add_field('md5key', XMLDB_TYPE_CHAR, '32', null, XMLDB_NOTNULL);
            // Add keys to table hotpot_cache
            $table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
            $table->add_key('hotpotid', XMLDB_KEY_FOREIGN, array('hotpotid'), 'hotpot', array('id'));
            // Add indexes to table hotpot_cache
            $table->add_index('hotpotid-md5key', XMLDB_INDEX_NOTUNIQUE, array('hotpotid', 'md5key'));
            $dbman->create_table($table);
        }
        // add new logging actions
        log_update_descriptions('mod/hotpot');
        // hotpot savepoint reached
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080302;
    if ($oldversion < $newversion) {
        // navigation setting of "none" is now "0" (was "6")
        $DB->execute('UPDATE {hotpot} SET navigation=0 WHERE navigation=6');
        // navigation's "give up" button, is replaced by the "stopbutton" field
        $DB->execute('UPDATE {hotpot} SET stopbutton=0 WHERE navigation=5');
        $DB->execute('UPDATE {hotpot} SET navigation=0 WHERE navigation=5');
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080303;
    if ($oldversion < $newversion) {
        // modify table: hotpot_attempts
        $table = new xmldb_table('hotpot_attempts');
        // add field: timemodified
        $field = new xmldb_field('timemodified', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
        if (!$dbman->field_exists($table, $field)) {
            $dbman->add_field($table, $field);
            $DB->execute('UPDATE {hotpot_attempts} SET timemodified = timefinish WHERE timemodified=0');
            $DB->execute('UPDATE {hotpot_attempts} SET timemodified = timestart  WHERE timemodified=0');
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080305;
    if ($oldversion < $newversion) {
        // modify table: hotpot
        $table = new xmldb_table('hotpot');
        // change fields
        //  - entrycm         (-> signed)
        //  - outputformat    (-> varchar)
        //  - timelimit       (-> signed)
        //  - delay3          (-> signed)
        //  - attemptlimit    (-> unsigned)
        //  - gradeweighting  (-> unsigned)
        //  - grademethod     (-> unsigned)
        $fields = array(new xmldb_field('entrycm', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'), new xmldb_field('outputformat', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL), new xmldb_field('timelimit', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'), new xmldb_field('delay3', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '2'), new xmldb_field('attemptlimit', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), new xmldb_field('gradeweighting', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), new xmldb_field('grademethod', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'));
        foreach ($fields as $field) {
            if ($dbman->field_exists($table, $field)) {
                xmldb_hotpot_fix_previous_field($dbman, $table, $field);
                $dbman->change_field_type($table, $field);
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080306;
    if ($oldversion < $newversion) {
        // modify table: hotpot
        $table = new xmldb_table('hotpot');
        // rename field: gradelimit -> gradeweighting
        $field = new xmldb_field('gradelimit', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
        if ($dbman->field_exists($table, $field)) {
            $dbman->rename_field($table, $field, 'gradeweighting');
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080308;
    if ($oldversion < $newversion) {
        // add display fields to hotpot
        // (these fields were missing from access.xml so won't be on new sites)
        $tables = array('hotpot' => array(new xmldb_field('title', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '3', 'navigation'), new xmldb_field('stopbutton', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'title'), new xmldb_field('stoptext', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'stopbutton'), new xmldb_field('usefilters', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'stoptext'), new xmldb_field('useglossary', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'usefilters'), new xmldb_field('usemediafilter', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'useglossary')));
        foreach ($tables as $tablename => $fields) {
            $table = new xmldb_table($tablename);
            foreach ($fields as $field) {
                xmldb_hotpot_fix_previous_field($dbman, $table, $field);
                if ($dbman->field_exists($table, $field)) {
                    $dbman->change_field_type($table, $field);
                } else {
                    $dbman->add_field($table, $field);
                }
            }
        }
        $table = new xmldb_table('hotpot');
        $field = new xmldb_field('forceplugins', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0');
        if ($dbman->field_exists($table, $field)) {
            $DB->execute('UPDATE {hotpot} SET ' . "usemediafilter='moodle'" . ' WHERE forceplugins=1');
            $dbman->drop_field($table, $field);
        }
        // force certain fields to be not null
        $tables = array('hotpot' => array(new xmldb_field('entrygrade', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '100')), 'hotpot_cache' => array(new xmldb_field('stopbutton', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), new xmldb_field('usefilters', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), new xmldb_field('useglossary', XMLDB_TYPE_INTEGER, '2', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0'), new xmldb_field('studentfeedback', XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0')));
        foreach ($tables as $tablename => $fields) {
            $table = new xmldb_table($tablename);
            foreach ($fields as $field) {
                if ($dbman->field_exists($table, $field)) {
                    $dbman->change_field_type($table, $field);
                }
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080309;
    if ($oldversion < $newversion) {
        // force certain text fields to be not null
        $tables = array('hotpot' => array(new xmldb_field('sourcefile', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL), new xmldb_field('entrytext', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL), new xmldb_field('exittext', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL), new xmldb_field('stoptext', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL)));
        foreach ($tables as $tablename => $fields) {
            $table = new xmldb_table($tablename);
            foreach ($fields as $field) {
                if ($dbman->field_exists($table, $field)) {
                    $fieldname = $field->getName();
                    $DB->set_field_select($tablename, $fieldname, '', "{$fieldname} IS NULL");
                    $dbman->change_field_type($table, $field);
                }
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080311;
    if ($oldversion < $newversion) {
        require_once $CFG->dirroot . '/mod/hotpot/locallib.php';
        /////////////////////////////////////
        /// new file storage migrate code ///
        /////////////////////////////////////
        // set up sql strings to select HotPots with Moodle 1.x file paths (i.e. no leading slash)
        $strupdating = get_string('migratingfiles', 'hotpot');
        $select = 'h.*, cm.id AS cmid';
        $from = '{hotpot} h, {course_modules} cm, {modules} m';
        $where = 'm.name=? AND m.id=cm.module AND cm.instance=h.id AND h.sourcefile<>?' . ' AND ' . $DB->sql_like('h.sourcefile', '?', false, false, true);
        // NOT LIKE
        $params = array('hotpot', '', '/%', 0);
        $orderby = 'h.course, h.id';
        // get HotPot records that need to be updated
        if ($count = $DB->count_records_sql("SELECT COUNT('x') FROM {$from} WHERE {$where}", $params)) {
            $rs = $DB->get_recordset_sql("SELECT {$select} FROM {$from} WHERE {$where} ORDER BY {$orderby}", $params);
        } else {
            $rs = false;
        }
        if ($rs) {
            $i = 0;
            $bar = new progress_bar('hotpotmigratefiles', 500, true);
            // get file storage object
            $fs = get_file_storage();
            if (class_exists('context_course')) {
                $sitecontext = context_course::instance(SITEID);
            } else {
                $sitecontext = get_context_instance(CONTEXT_COURSE, SITEID);
            }
            $coursecontext = null;
            $modulecontext = null;
            foreach ($rs as $hotpot) {
                // apply for more script execution time (3 mins)
                upgrade_set_timeout();
                // get course context for this $hotpot
                if ($coursecontext === null || $coursecontext->instanceid != $hotpot->course) {
                    if (class_exists('context_course')) {
                        $coursecontext = context_course::instance($hotpot->course);
                    } else {
                        $coursecontext = get_context_instance(CONTEXT_COURSE, $hotpot->course);
                    }
                }
                // get module context for this $hotpot/$task
                if ($modulecontext === null || $modulecontext->instanceid != $hotpot->cmid) {
                    if (class_exists('context_module')) {
                        $modulecontext = context_module::instance($hotpot->cmid);
                    } else {
                        $modulecontext = get_context_instance(CONTEXT_MODULE, $hotpot->cmid);
                    }
                }
                // actually there shouldn't be any urls in HotPot activities,
                // but this code will also be used to convert QuizPort to TaskChain
                if (preg_match('/^https?:\\/\\//i', $hotpot->sourcefile)) {
                    $url = $hotpot->sourcefile;
                    $path = parse_url($url, PHP_URL_PATH);
                } else {
                    $url = '';
                    $path = $hotpot->sourcefile;
                }
                $path = clean_param($path, PARAM_PATH);
                // this information should be enough to access the file
                // if it has been migrated into Moodle 2.0 file system
                $old_filename = basename($path);
                $old_filepath = dirname($path);
                if ($old_filepath == '.' || $old_filepath == '') {
                    $old_filepath = '/';
                } else {
                    $old_filepath = '/' . ltrim($old_filepath, '/');
                    // require leading slash
                    $old_filepath = rtrim($old_filepath, '/') . '/';
                    // require trailing slash
                }
                // update $hotpot->sourcefile, if necessary
                if ($hotpot->sourcefile != $old_filepath . $old_filename) {
                    $hotpot->sourcefile = $old_filepath . $old_filename;
                    $DB->set_field('hotpot', 'sourcefile', $hotpot->sourcefile, array('id' => $hotpot->id));
                }
                // set $courseid and $contextid from $task->$location
                // of where we expect to find the $file
                //   0 : HOTPOT_LOCATION_COURSEFILES
                //   1 : HOTPOT_LOCATION_SITEFILES
                //   2 : HOTPOT_LOCATION_WWW (not used)
                if ($hotpot->sourcelocation) {
                    $courseid = SITEID;
                    $contextid = $sitecontext->id;
                } else {
                    $courseid = $hotpot->course;
                    $contextid = $coursecontext->id;
                }
                // we expect to need the $filehash to get a file that has been migrated
                $filehash = sha1('/' . $contextid . '/course/legacy/0' . $old_filepath . $old_filename);
                // we might also need the old file path, if the file has not been migrated
                $oldfilepath = $CFG->dataroot . '/' . $courseid . $old_filepath . $old_filename;
                // set parameters used to add file to filearea
                // (sortorder=1 siginifies the "mainfile" in this filearea)
                $file_record = array('contextid' => $modulecontext->id, 'component' => 'mod_hotpot', 'filearea' => 'sourcefile', 'sortorder' => 1, 'itemid' => 0, 'filepath' => $old_filepath, 'filename' => $old_filename);
                // initialize sourcefile settings
                $hotpot->sourcefile = $old_filepath . $old_filename;
                $hotpot->sourcetype = '';
                $hotpot->sourceitemid = 0;
                if ($file = $fs->get_file($modulecontext->id, 'mod_hotpot', 'sourcefile', 0, $old_filepath, $old_filename)) {
                    // file already exists for this context - shouldn't happen !!
                    // maybe an earlier upgrade failed for some reason ?
                    // anyway we must do this check, so that create_file_from_xxx() does not abort
                } else {
                    if ($url) {
                        // file is on an external url - unusual ?!
                        $file = false;
                        // $fs->create_file_from_url($file_record, $url);
                    } else {
                        if ($file = $fs->get_file_by_hash($filehash)) {
                            // $file has already been migrated to Moodle's file system
                            // this is the route we expect most people to come :-)
                            $file = $fs->create_file_from_storedfile($file_record, $file);
                        } else {
                            if (file_exists($oldfilepath)) {
                                // $file still exists on server's filesystem - unusual ?!
                                $file = $fs->create_file_from_pathname($file_record, $oldfilepath);
                            } else {
                                // file was not migrated and is not on server's filesystem
                                $file = false;
                            }
                        }
                    }
                }
                // if source file did not exist, notify user of the problem
                if (empty($file)) {
                    if ($url) {
                        $msg = "course_modules.id={$hotpot->cmid}, url={$url}";
                    } else {
                        $msg = "course_modules.id={$hotpot->cmid}, path={$path}";
                    }
                    $params = array('update' => $hotpot->cmid, 'onclick' => 'this.target="_blank"');
                    $msg = html_writer::link(new moodle_url('/course/modedit.php', $params), $msg);
                    $msg = get_string('sourcefilenotfound', 'hotpot', $msg);
                    echo html_writer::tag('div', $msg, array('class' => 'notifyproblem'));
                }
                // set $hotpot->sourcetype
                if ($pos = strrpos($hotpot->sourcefile, '.')) {
                    $filetype = substr($hotpot->sourcefile, $pos + 1);
                    switch ($filetype) {
                        case 'jcl':
                            $hotpot->sourcetype = 'hp_6_jcloze_xml';
                            break;
                        case 'jcw':
                            $hotpot->sourcetype = 'hp_6_jcross_xml';
                            break;
                        case 'jmt':
                            $hotpot->sourcetype = 'hp_6_jmatch_xml';
                            break;
                        case 'jmx':
                            $hotpot->sourcetype = 'hp_6_jmix_xml';
                            break;
                        case 'jqz':
                            $hotpot->sourcetype = 'hp_6_jquiz_xml';
                            break;
                        case 'rhb':
                            $hotpot->sourcetype = 'hp_6_rhubarb_xml';
                            break;
                        case 'sqt':
                            $hotpot->sourcetype = 'hp_6_sequitur_xml';
                            break;
                        case 'htm':
                        case 'html':
                        default:
                            if ($file) {
                                $pathnamehash = $fs->get_pathname_hash($modulecontext->id, 'mod_hotpot', 'sourcefile', 0, $old_filepath, $old_filename);
                                if ($contenthash = $DB->get_field('files', 'contenthash', array('pathnamehash' => $pathnamehash))) {
                                    $l1 = $contenthash[0] . $contenthash[1];
                                    $l2 = $contenthash[2] . $contenthash[3];
                                    if (file_exists("{$CFG->dataroot}/filedir/{$l1}/{$l2}/{$contenthash}")) {
                                        $hotpot->sourcetype = hotpot::get_sourcetype($file);
                                    } else {
                                        $msg = html_writer::link(new moodle_url('/course/modedit.php', array('update' => $hotpot->cmid)), "course_modules.id={$hotpot->cmid}, path={$path}");
                                        $msg .= html_writer::empty_tag('br');
                                        $msg .= "filedir path={$l1}/{$l2}/{$contenthash}";
                                        $msg = get_string('sourcefilenotfound', 'hotpot', $msg);
                                        echo html_writer::tag('div', $msg, array('class' => 'notifyproblem'));
                                    }
                                }
                            }
                    }
                }
                // JMatch has 2 output formats
                //     14 : v6  : drop down menus : hp_6_jmatch_xml_v6
                //     15 : v6+ : drag-and-drop   : hp_6_jmatch_xml_v6_plus
                // JMix has 2 output formats
                //     14 : v6  : links           : hp_6_jmix_xml_v6
                //     15 : v6+ : drag-and-drop   : hp_6_jmix_xml_v6_plus
                // since drag-and-drop is the "best" outputformat for both types of quiz,
                // we only need to worry about HotPots whose outputformat was 14 (="v6")
                // set $hotpot->outputformat
                if ($hotpot->outputformat == 14 && ($hotpot->sourcetype == 'hp_6_jmatch_xml' || $hotpot->sourcetype == 'hp_6_jmix_xml')) {
                    $hotpot->outputformat = $hotpot->sourcetype . '_v6';
                } else {
                    $hotpot->outputformat = '';
                    //  = "best" output format
                }
                $DB->update_record('hotpot', $hotpot);
                // update progress bar
                $i++;
                $bar->update($i, $count, $strupdating . ": ({$i}/{$count})");
            }
            $rs->close();
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080316;
    if ($oldversion < $newversion) {
        // because the HotPot activities were probably hidden until now
        // we need to reset the course caches (using "course/lib.php")
        require_once $CFG->dirroot . '/course/lib.php';
        $courseids = array();
        if ($hotpots = $DB->get_records('hotpot', null, '', 'id,course')) {
            foreach ($hotpots as $hotpot) {
                $courseids[$hotpot->course] = true;
            }
            $courseids = array_keys($courseids);
        }
        unset($hotpots, $hotpot);
        foreach ($courseids as $courseid) {
            rebuild_course_cache($courseid, true);
        }
        unset($courseids, $courseid);
        // reset theme cache to force inclusion of new hotpot css
        theme_reset_all_caches();
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080325;
    if ($oldversion < $newversion) {
        $table = new xmldb_table('hotpot');
        $fieldnames = array('sourceitemid', 'configitemid');
        foreach ($fieldnames as $fieldname) {
            $field = new xmldb_field($fieldname);
            if ($dbman->field_exists($table, $field)) {
                $dbman->drop_field($table, $field);
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080330;
    if ($oldversion < $newversion) {
        require_once $CFG->dirroot . '/mod/hotpot/lib.php';
        hotpot_refresh_events();
    }
    $newversion = 2010080333;
    if ($oldversion < $newversion) {
        update_capabilities('mod/hotpot');
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080339;
    if ($oldversion < $newversion) {
        $table = new xmldb_table('hotpot');
        $field = new xmldb_field('exitgrade', XMLDB_TYPE_INTEGER, '6', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'exitcm');
        xmldb_hotpot_fix_previous_field($dbman, $table, $field);
        if (!$dbman->field_exists($table, $field)) {
            $dbman->add_field($table, $field);
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080340;
    if ($oldversion < $newversion) {
        // force all text fields to be long text, the default for Moodle 2.3 and later
        $tables = array('hotpot' => array(new xmldb_field('entrytext', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL), new xmldb_field('exittext', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL)), 'hotpot_cache' => array(new xmldb_field('content', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL)), 'hotpot_details' => array(new xmldb_field('details', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL)), 'hotpot_questions' => array(new xmldb_field('name', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL)), 'hotpot_strings' => array(new xmldb_field('string', XMLDB_TYPE_TEXT, 'long', null, XMLDB_NOTNULL)));
        foreach ($tables as $tablename => $fields) {
            $table = new xmldb_table($tablename);
            foreach ($fields as $field) {
                if ($dbman->field_exists($table, $field)) {
                    $fieldname = $field->getName();
                    $DB->set_field_select($tablename, $fieldname, '', "{$fieldname} IS NULL");
                    $dbman->change_field_type($table, $field);
                }
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080342;
    if ($oldversion < $newversion) {
        // force all MySQL integer fields to be signed, the default for Moodle 2.3 and later
        if ($DB->get_dbfamily() == 'mysql') {
            $prefix = $DB->get_prefix();
            $tables = $DB->get_tables();
            foreach ($tables as $table) {
                if (substr($table, 0, 6) == 'hotpot') {
                    $rs = $DB->get_recordset_sql("SHOW COLUMNS FROM {$CFG->prefix}{$table} WHERE type LIKE '%unsigned%'");
                    foreach ($rs as $column) {
                        // copied from as "lib/db/upgradelib.php"
                        $type = preg_replace('/\\s*unsigned/i', 'signed', $column->type);
                        $notnull = $column->null === 'NO' ? 'NOT NULL' : 'NULL';
                        $default = is_null($column->default) || $column->default === '' ? '' : "DEFAULT '{$column->default}'";
                        $autoinc = stripos($column->extra, 'auto_increment') === false ? '' : 'AUTO_INCREMENT';
                        $sql = "ALTER TABLE `{$prefix}{$table}` MODIFY COLUMN `{$column->field}` {$type} {$notnull} {$default} {$autoinc}";
                        $DB->change_database_structure($sql);
                    }
                }
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080353;
    if ($oldversion < $newversion) {
        // remove any unwanted "course_files" folders that may have been created
        // when restoring Moodle 1.9 HotPot activities to a Moodle 2.x site
        // select all HotPot activities which have a "course_files" folder
        // but whose "sourcefile" path does not require such a folder
        $select = 'f.*,' . 'h.id AS hotpotid,' . 'h.sourcefile AS sourcefile';
        $from = '{hotpot} h,' . '{course_modules} cm,' . '{context} c,' . '{files} f';
        $where = $DB->sql_like('h.sourcefile', '?', false, false, true) . ' AND h.id=cm.instance' . ' AND cm.id=c.instanceid' . ' AND c.id=f.contextid' . ' AND f.component=?' . ' AND f.filearea=?' . ' AND f.filepath=?' . ' AND f.filename=?';
        $params = array('/course_files/%', 'mod_hotpot', 'sourcefile', '/course_files/', '.');
        if ($filerecords = $DB->get_records_sql("SELECT {$select} FROM {$from} WHERE {$where}", $params)) {
            $fs = get_file_storage();
            foreach ($filerecords as $filerecord) {
                $file = $fs->get_file_instance($filerecord);
                xmldb_hotpot_move_file($file, '/');
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080366;
    if ($oldversion < $newversion) {
        if ($hotpots = $DB->get_records_select('hotpot', $DB->sql_like('sourcefile', '?'), array('%http://localhost/19/99/%'))) {
            foreach ($hotpots as $hotpot) {
                $sourcefile = str_replace('http://localhost/19/99/', '', $hotpot->sourcefile);
                $DB->set_field('hotpot', 'sourcefile', $sourcefile, array('id' => $hotpot->id));
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2010080370;
    if ($oldversion < $newversion) {
        require_once $CFG->dirroot . '/mod/hotpot/locallib.php';
        $reviewoptions = 0;
        list($times, $items) = hotpot::reviewoptions_times_items();
        foreach ($times as $timename => $timevalue) {
            foreach ($items as $itemname => $itemvalue) {
                $reviewoptions += $timevalue & $itemvalue;
            }
        }
        // $reviewoptions should now be set to 62415
        $DB->set_field('hotpot', 'reviewoptions', $reviewoptions);
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2013111685;
    if ($oldversion < $newversion) {
        $tables = array('hotpot' => array(new xmldb_field('allowpaste', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'stoptext')), 'hotpot_cache' => array(new xmldb_field('hotpot_bodystyles', XMLDB_TYPE_CHAR, '8', null, XMLDB_NOTNULL, null, null, 'slasharguments'), new xmldb_field('sourcerepositoryid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'sourcelocation'), new xmldb_field('configrepositoryid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0', 'configlocation'), new xmldb_field('allowpaste', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'stoptext')));
        foreach ($tables as $table => $fields) {
            $table = new xmldb_table($table);
            foreach ($fields as $field) {
                xmldb_hotpot_fix_previous_field($dbman, $table, $field);
                if ($dbman->field_exists($table, $field)) {
                    $dbman->change_field_type($table, $field);
                } else {
                    $dbman->add_field($table, $field);
                }
            }
        }
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2014011694;
    if ($oldversion < $newversion) {
        require_once $CFG->dirroot . '/mod/hotpot/lib.php';
        hotpot_update_grades();
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    $newversion = 2014042111;
    if ($oldversion < $newversion) {
        $empty_cache = true;
        upgrade_mod_savepoint(true, "{$newversion}", 'hotpot');
    }
    if ($empty_cache) {
        $DB->delete_records('hotpot_cache');
    }
    return true;
}
 /**
  * fix_mediafilter
  *
  * @return xxx
  */
 function fix_mediafilter()
 {
     global $CFG;
     if (!$this->hotpot->usemediafilter) {
         return false;
     }
     if (!hotpot::load_mediafilter_filter($this->hotpot->usemediafilter)) {
         return false;
     }
     $mediafilterclass = 'hotpot_mediafilter_' . $this->hotpot->usemediafilter;
     $mediafilter = new $mediafilterclass($this);
     $mediafilter->fix('headcontent', $this);
     $mediafilter->fix('bodycontent', $this);
     if ($mediafilter->js_inline) {
         // remove the internal </script><script ... > joins from the inline javascripts (js_inline)
         $search = '/(?:\\s*\\/\\/\\]\\]>)?' . '\\s*<\\/script>\\s*<script type="text\\/javascript">' . '(?:\\s*\\/\\/<!\\[CDATA\\[[ \\t]*)?/is';
         $mediafilter->js_inline = preg_replace($search, '', $mediafilter->js_inline);
         // extract urls of deferred scripts from $mediafilter->js_external
         if (preg_match_all($this->tagpattern('script'), $mediafilter->js_external, $scripts, PREG_OFFSET_CAPTURE)) {
             $deferred_js = array();
             $strlen_wwwroot = strlen($CFG->wwwroot);
             foreach (array_reverse($scripts[0]) as $script) {
                 // $script [0] => matched string, [1] => offset to start of matched string
                 $remove = false;
                 if (strpos($script[0], 'type="text/javascript"')) {
                     if (preg_match('/src="(.*?)"/i', $script[0], $matches)) {
                         if (strpos($script[0], 'defer="defer"') === false) {
                             $inhead = true;
                         } else {
                             $inhead = false;
                         }
                         // we do not add scripts with $this->page->requires->js() because
                         // they will not then be added when content is retrieved from cache
                         //if (substr($matches[1], 0, $strlen_wwwroot)==$CFG->wwwroot) {
                         //    $this->page->requires->js(substr($matches[1], $strlen_wwwroot), $inhead);
                         //    $remove = true;
                         //} else
                         if ($inhead) {
                             // leave this script where it is (i.e. in the head)
                         } else {
                             array_unshift($deferred_js, '"' . addslashes_js($matches[1]) . '"');
                             $remove = true;
                         }
                     }
                 }
                 if ($remove) {
                     $mediafilter->js_external = substr_replace($mediafilter->js_external, '', $script[1], strlen($script[0]));
                 }
             }
             $deferred_js = implode(',', array_unique($deferred_js));
         } else {
             $deferred_js = '';
         }
         if ($deferred_js) {
             $deferred_js = '' . '  // load deferred scripts' . "\n" . '  var head = document.getElementsByTagName("head")[0];' . "\n" . '  var urls = new Array(' . $deferred_js . ');' . "\n" . '  for (var i=0; i<urls.length; i++) {' . "\n" . '    var script = document.createElement("script");' . "\n" . '    script.type = "text/javascript";' . "\n" . '    script.src = urls[i];' . "\n" . '    head.appendChild(script);' . "\n" . '  }' . "\n";
         }
         $functions = '';
         if (preg_match_all('/(?<=function )\\w+/', $mediafilter->js_inline, $names)) {
             foreach ($names[0] as $name) {
                 list($start, $finish) = $this->locate_js_block('function', $name, $mediafilter->js_inline, true);
                 if ($finish) {
                     $functions .= trim(substr($mediafilter->js_inline, $start, $finish - $start)) . "\n";
                     $mediafilter->js_inline = substr_replace($mediafilter->js_inline, '', $start, $finish - $start);
                 }
             }
         }
         // put all the inline javascript into one single function called "hotpot_mediafilter_loader()",
         // which also loads up any deferred js, and force this function to be run when the page has loaded
         $onload = 'hotpot_mediafilter_loader()';
         $search = '/(\\/\\/<!\\[CDATA\\[)(.*)(\\/\\/\\]\\]>)/s';
         $replace = '$1' . "\n" . $functions . 'function ' . $onload . '{' . '$2' . $deferred_js . $this->fix_mediafilter_onload_extra() . '} // end function ' . $onload . "\n" . "\n" . $this->fix_onload($onload) . '$3';
         $mediafilter->js_inline = preg_replace($search, $replace, $mediafilter->js_inline, 1);
         // append the inline javascripts to the end of the bodycontent
         $this->bodycontent .= $mediafilter->js_inline;
     }
     if ($mediafilter->js_external) {
         // append the external javascripts to the head content
         $this->headcontent .= $mediafilter->js_external;
     }
 }
 /**
  * store_details
  *
  * @param xxx $attempt (passed by reference)
  */
 public static function store_details($attempt)
 {
     // encode ampersands so that HTML entities are preserved in the XML parser
     // N.B. ampersands inside <![CDATA[ ]]> blocks do NOT need to be encoded
     // disabled 2008.11.20
     // $attempt->details = self::pre_xmlize($attempt->details);
     // parse the attempt details as xml
     $details = xmlize($attempt->details);
     $question_number;
     // initially unset
     $question = false;
     $response = false;
     $i = 0;
     while (isset($details[self::xmlresultstag]['#']['fields']['0']['#']['field'][$i]['#'])) {
         // shortcut to field
         $field =& $details[self::xmlresultstag]['#']['fields']['0']['#']['field'][$i]['#'];
         // extract field name and data
         if (isset($field['fieldname'][0]['#']) && is_string($field['fieldname'][0]['#'])) {
             $name = $field['fieldname'][0]['#'];
         } else {
             $name = '';
         }
         if (isset($field['fielddata'][0]['#']) && is_string($field['fielddata'][0]['#'])) {
             $data = $field['fielddata'][0]['#'];
         } else {
             $data = '';
         }
         // parse the field name into $matches
         //  [1] quiz type
         //  [2] attempt detail name
         if (preg_match('/^(\\w+?)_(\\w+)$/', $name, $matches)) {
             $quiztype = strtolower($matches[1]);
             $name = strtolower($matches[2]);
             // parse the attempt detail $name into $matches
             //  [1] question number
             //  [2] question detail name
             if (preg_match('/^q(\\d+)_(\\w+)$/', $name, $matches)) {
                 $num = $matches[1];
                 $name = strtolower($matches[2]);
                 // not needed Moodle 2.0 and later
                 // $data = addslashes($data);
                 // adjust JCross question numbers
                 if (preg_match('/^(across|down)(.*)$/', $name, $matches)) {
                     $num .= '_' . $matches[1];
                     // e.g. 01_across, 02_down
                     $name = $matches[2];
                     if (substr($name, 0, 1) == '_') {
                         $name = substr($name, 1);
                         // remove leading '_'
                     }
                 }
                 if (isset($question_number) && $question_number == $num) {
                     // do nothing - this response is for the same question as the previous response
                 } else {
                     // store previous question / response (if any)
                     self::add_response($attempt, $question, $response);
                     // initialize question object
                     $question = new stdClass();
                     $question->name = '';
                     $question->text = '';
                     $question->hotpotid = $attempt->hotpotid;
                     // initialize response object
                     $response = new stdClass();
                     $response->attemptid = $attempt->id;
                     // update question number
                     $question_number = $num;
                 }
                 // adjust field name and value, and set question type
                 // (may not be necessary one day)
                 // hotpot_adjust_response_field($quiztype, $question, $num, $name, $data);
                 // add $data to the question/response details
                 switch ($name) {
                     case 'name':
                     case 'type':
                         $question->{$name} = $data;
                         break;
                     case 'text':
                         $question->{$name} = hotpot::string_id($data);
                         break;
                     case 'correct':
                     case 'ignored':
                     case 'wrong':
                         $response->{$name} = hotpot::string_ids($data);
                         break;
                     case 'score':
                     case 'weighting':
                     case 'hints':
                     case 'clues':
                     case 'checks':
                         $response->{$name} = intval($data);
                         break;
                 }
             } else {
                 // attempt details
                 // adjust field name and value
                 //hotpot_adjust_response_field($quiztype, $question, $num='', $name, $data);
                 // add $data to the attempt details
                 if ($name == 'penalties') {
                     $attempt->{$name} = intval($data);
                 }
             }
         }
         $i++;
     }
     // end while
     // add the final question and response, if any
     self::add_response($attempt, $question, $response);
 }
 /**
  * @return source object representing the source file for this HotPot
  */
 public function get_source()
 {
     global $CFG, $DB;
     if (empty($this->source)) {
         // get sourcetype e.g. hp_6_jcloze_xml
         $sourcefile = $this->get_sourcefile();
         if (!($sourcetype = clean_param($this->sourcetype, PARAM_SAFEDIR))) {
             if (!($sourcetype = hotpot::get_sourcetype($sourcefile))) {
                 return null;
             }
             $DB->set_field('hotpot', 'sourcetype', $sourcetype, array('id' => $this->id));
             $this->sourcetype = $sourcetype;
         }
         $dir = str_replace('_', '/', $sourcetype);
         require_once $CFG->dirroot . '/mod/hotpot/source/' . $dir . '/class.php';
         $classname = 'hotpot_source_' . $sourcetype;
         $this->source = new $classname($sourcefile, $this);
     }
     return $this->source;
 }
Beispiel #8
0
 /**
  * expand_FullVersionInfo
  *
  * @return xxx
  */
 function expand_FullVersionInfo()
 {
     global $CFG;
     return $this->hotpot->source->xml_value('version') . '.x (Moodle ' . $CFG->release . ', HotPot ' . hotpot::get_version_info('release') . ')';
 }
 /**
  * Constructor
  *
  * @param string $name the name of the filter instance
  * @param boolean $advanced advanced form element flag
  * @param mixed $default option
  */
 function __construct($name, $advanced, $default = null)
 {
     $label = get_string($name, 'mod_hotpot');
     $options = hotpot::available_statuses_list();
     parent::__construct($name, $label, $advanced, '', $options, $default);
 }
Beispiel #10
0
 /**
  * format_attempt_data
  *
  * @param xxx $attempt
  * @param xxx $field
  * @param xxx $strtimeformat
  * @return xxx
  */
 static function format_attempt_data($attempt, $field, $strtimeformat)
 {
     switch ($field) {
         case 'status':
             return hotpot::format_status($attempt->{$field});
         case 'duration':
             return format_time($attempt->timemodified - $attempt->timestart);
         case 'timemodified':
             return trim(userdate($attempt->{$field}, $strtimeformat));
         default:
             return $attempt->{$field};
     }
 }
Beispiel #11
0
/**
 * Extends the global navigation tree by adding hotpot nodes if there is a relevant content
 *
 * This can be called by an AJAX request so do not rely on $PAGE as it might not be set up properly.
 *
 * @param navigation_node $navref An object representing the navigation tree node of the hotpot module instance
 * @param stdclass $course
 * @param stdclass $module
 * @param cm_info  $cm
 */
function hotpot_extend_navigation(navigation_node $hotpotnode, stdclass $course, stdclass $module, cm_info $cm)
{
    global $CFG, $DB;
    require_once $CFG->dirroot . '/mod/hotpot/locallib.php';
    $hotpot = $DB->get_record('hotpot', array('id' => $cm->instance), '*', MUST_EXIST);
    $hotpot = hotpot::create($hotpot, $cm, $course);
    if ($hotpot->can_reviewattempts()) {
        $icon = new pix_icon('i/report', '');
        $type = navigation_node::TYPE_SETTING;
        foreach ($hotpot->get_report_modes() as $mode) {
            $url = $hotpot->report_url($mode);
            $label = get_string($mode . 'report', 'hotpot');
            $hotpotnode->add($label, $url, $type, null, null, $icon);
        }
    }
}
Beispiel #12
0
$attempt = $DB->get_record('hotpot_attempts', array('id' => $id), '*', MUST_EXIST);
$hotpot = $DB->get_record('hotpot', array('id' => $attempt->hotpotid), '*', MUST_EXIST);
$course = $DB->get_record('course', array('id' => $hotpot->course), '*', MUST_EXIST);
$cm = get_coursemodule_from_instance('hotpot', $hotpot->id, $course->id, false, MUST_EXIST);
// Check login
require_login($course, true, $cm);
if (!has_capability('mod/hotpot:reviewallattempts', $PAGE->context)) {
    require_capability('mod/hotpot:reviewmyattempts', $PAGE->context);
}
// Create an object to represent this attempt at the current HotPot activity
$hotpot = hotpot::create($hotpot, $cm, $course, $PAGE->context, $attempt);
// Log this request
add_to_log($course->id, 'hotpot', 'review', 'view.php?id=' . $cm->id, $hotpot->id, $cm->id);
// Set editing mode
if ($PAGE->user_allowed_editing()) {
    hotpot::set_user_editing();
}
// initialize $PAGE (and compute blocks)
$PAGE->set_url($hotpot->review_url());
$PAGE->set_title($hotpot->name);
$PAGE->set_heading($course->fullname);
// get renderer subtype (e.g. attempt_hp_6_jcloze_xml)
// and load the appropriate storage class for this attempt
$subtype = $hotpot->get_attempt_renderer_subtype();
$subdir = str_replace('_', '/', $subtype);
require_once $CFG->dirroot . '/mod/hotpot/' . $subdir . '/review.php';
// create the renderer for this attempt
$output = $PAGE->get_renderer('mod_hotpot');
////////////////////////////////////////////////////////////////////////////////
// Output starts here                                                         //
////////////////////////////////////////////////////////////////////////////////
Beispiel #13
0
 /**
  * given $fullpath to temporary imported Hot Potatoes file
  * this function returns the HotPot sourcetype of the file
  *
  * Where possible, the sourcetype will be determined from the file name extension
  * but in some cases, notably html files, it may be necessary to read the file
  * and analyze its contents in order to determine the sourcetype
  */
 public function get_hotpot_sourcetype($fullpath, $filerecord = null)
 {
     if ($pos = strrpos($fullpath, '.')) {
         $filetype = substr($fullpath, $pos + 1);
         switch ($filetype) {
             case 'jcl':
                 return 'hp_6_jcloze_xml';
             case 'jcw':
                 return 'hp_6_jcross_xml';
             case 'jmt':
                 return 'hp_6_jmatch_xml';
             case 'jmx':
                 return 'hp_6_jmix_xml';
             case 'jqz':
                 return 'hp_6_jquiz_xml';
             case 'rhb':
                 return 'hp_6_rhubarb_xml';
             case 'sqt':
                 return 'hp_6_sequitur_xml';
         }
     }
     // cannot detect sourcetype from filename alone
     // so we must open the file and examine the contents
     if ($filerecord) {
         $fs = get_file_storage();
         $sourcefile = $fs->create_file_from_pathname($filerecord, $fullpath);
         $sourcetype = hotpot::get_sourcetype($sourcefile);
         $sourcefile->delete();
         return $sourcetype;
     }
     // could not detect sourcetype
     return '';
 }