/** * Retrieves ajax parameters for content and update or delete * user data depending on params. * * @throws \coding_exception */ public static function handle_ajax() { global $DB; // Query String Parameters. $content_id = required_param('content_id', PARAM_INT); $data_id = required_param('data_type', PARAM_RAW); $sub_content_id = required_param('sub_content_id', PARAM_INT); // Form Data. $data = optional_param('data', null, PARAM_RAW); $pre_load = optional_param('preload', null, PARAM_INT); $invalidate = optional_param('invalidate', null, PARAM_INT); if ($content_id === null || $data_id === null || $sub_content_id === null) { \H5PCore::ajaxError(get_string('missingparameters', 'hvp')); exit; // Missing parameters. } // Saving data if ($data !== NULL && $pre_load !== NULL && $invalidate !== NULL) { // Validate token if (!\H5PCore::validToken('contentuserdata', required_param('token', PARAM_RAW))) { \H5PCore::ajaxError(get_string('invalidtoken', 'hvp')); exit; } // Use context id if supplied $context_id = optional_param('contextId', null, PARAM_INT); if ($context_id) { $context = \context::instance_by_id($context_id); } else { // Otherwise try to find it from content id $context = \context_course::instance($DB->get_field('hvp', 'course', array('id' => $content_id))); } // Check permissions if (!has_capability('mod/hvp:savecontentuserdata', $context)) { \H5PCore::ajaxError(get_string('nopermissiontosavecontentuserdata', 'hvp')); http_response_code(403); exit; } if ($data === '0') { // Delete user data. self::delete_user_data($content_id, $sub_content_id, $data_id); } else { // Save user data. self::save_user_data($content_id, $sub_content_id, $data_id, $pre_load, $invalidate, $data); } \H5PCore::ajaxSuccess(); } else { // Fetch user data $user_data = self::get_user_data($content_id, $sub_content_id, $data_id); if ($user_data === false) { // Did not find data, return nothing \H5PCore::ajaxSuccess(); } else { // Found data, return encoded data \H5PCore::ajaxSuccess($user_data->data); } } exit; }
public static function handle_ajax() { global $DB, $USER; if (!\H5PCore::validToken('result', required_param('token', PARAM_RAW))) { \H5PCore::ajaxError(get_string('invalidtoken', 'hvp')); exit; } // Content parameters $content_id = required_param('contentId', PARAM_INT); $score = required_param('score', PARAM_INT); $max_score = required_param('maxScore', PARAM_INT); // Time values not usable by gradebook // $opened = required_param('opened', PARAM_INT); // $finished = required_param('finished', PARAM_INT); // Get hvp data from contentId $hvp = $DB->get_record('hvp', array('id' => $content_id)); // Check permissions $context = \context_course::instance($hvp->course); if (!has_capability('mod/hvp:saveresults', $context)) { \H5PCore::ajaxError(get_string('nopermissiontosaveresult', 'hvp')); http_response_code(403); exit; } // Create grade object and set grades $grade = (object) array('userid' => $USER->id); // Get course module id from db, required for grade item $cm_id_sql = "SELECT cm.id, h.name\n FROM {course_modules} cm, {hvp} h, {modules} m\n WHERE cm.instance = h.id AND h.id = ? AND m.name = 'hvp' AND m.id = cm.module"; $result = $DB->get_record_sql($cm_id_sql, array($content_id)); // Set grade using Gradebook API $hvp->cmidnumber = $result->id; $hvp->name = $result->name; $hvp->rawgrade = $score; $hvp->rawgrademax = $max_score; hvp_grade_item_update($hvp, $grade); // Get content info for log $content = $DB->get_record_sql("SELECT c.name AS title, l.machine_name AS name, l.major_version, l.minor_version\n FROM {hvp} c\n JOIN {hvp_libraries} l ON l.id = c.main_library_id\n WHERE c.id = ?", array($content_id)); // Log view new \mod_hvp\event('results', 'set', $content_id, $content->title, $content->name, $content->major_version . '.' . $content->minor_version); \H5PCore::ajaxSuccess(); exit; }
* * Parameters: * int contentId * int contextId */ /* * Handle file upload through the editor. * * Parameters: * int contentId * int contextId */ case 'files': global $DB; // TODO: Check permissions if (!\H5PCore::validToken('editorajax', required_param('token', PARAM_RAW))) { \H5PCore::ajaxError(get_string('invalidtoken', 'hvp')); exit; } // Get Content ID and Context ID for upload $contentid = required_param('contentId', PARAM_INT); $contextid = required_param('contextId', PARAM_INT); // Create file $file = new H5peditorFile(\mod_hvp\framework::instance('interface')); if (!$file->isLoaded()) { H5PCore::ajaxError(get_string('filenotfound', 'hvp')); break; } // Make sure file is valid if ($file->validate()) { $core = \mod_hvp\framework::instance('core');
} // Make sure file is valid if ($file->validate()) { $core = \mod_hvp\framework::instance('core'); // Save the valid file $file_id = $core->fs->saveFile($file, $contentid, $contextid); // Track temporary files for later cleanup $DB->insert_record_raw('hvp_tmpfiles', array('id' => $file_id), false, false, true); } $file->printResult(); break; case 'logxapievent': global $CFG; // Trigger a Moodle log event for each xAPI statement // that is dispatched by the H5P (hvp) object. if (!\H5PCore::validToken('logxapievent', required_param('token', PARAM_RAW))) { \H5PCore::ajaxError(get_string('invalidtoken', 'hvp')); exit; } $hvpid = optional_param('hvpid', null, PARAM_INT); $courseid = optional_param('courseid', null, PARAM_INT); $jsonxapistatement = optional_param('xapistatement', null, PARAM_RAW); $xapistatement = json_decode($jsonxapistatement, true); $context = \context_module::instance($hvpid); $event = \mod_hvp\event\hvp_xapi::create(array('objectid' => $hvpid, 'context' => $context, 'other' => array('statement' => $xapistatement['data']['statement']), 'courseid' => $courseid)); $event->trigger(); // Debugging... if (!empty($CFG->debug) and $CFG->debug >= DEBUG_DEVELOPER) { $msg = "xAPI '" . $xapistatement['data']['statement']['verb']['display']['en-US'] . "' statement dispatched"; \H5PCore::ajaxSuccess($msg); http_response_code(200);
/** * Handle content upgrade progress * * @method hvp_content_upgrade_progress * @param int $library_id * @return object An object including the json content for the H5P instances * (maximum 40) that should be upgraded. */ function hvp_content_upgrade_progress($libraryid) { global $DB; $tolibraryid = filter_input(INPUT_POST, 'libraryId'); // Verify security token. if (!\H5PCore::validToken('contentupgrade', required_param('token', PARAM_RAW))) { print get_string('upgradeinvalidtoken', 'hvp'); return; } // Get the library we're upgrading to. $tolibrary = $DB->get_record('hvp_libraries', array('id' => $tolibraryid)); if (!$tolibrary) { print get_string('upgradelibrarymissing', 'hvp'); return; } // Prepare response. $out = new stdClass(); $out->params = array(); $out->token = \H5PCore::createToken('contentupgrade'); // Prepare our interface. $interface = \mod_hvp\framework::instance('interface'); // Get updated params. $params = filter_input(INPUT_POST, 'params'); if ($params !== null) { // Update params. $params = json_decode($params); foreach ($params as $id => $param) { $DB->update_record('hvp', (object) array('id' => $id, 'main_library_id' => $tolibrary->id, 'json_content' => $param, 'filtered' => '')); // Log content upgrade successful new \mod_hvp\event('content', 'upgrade', $id, $DB->get_field_sql("SELECT name FROM {hvp} WHERE id = ?", array($id)), $tolibrary->machine_name, $tolibrary->major_version . '.' . $tolibrary->minor_version); } } // Get number of contents for this library. $out->left = $interface->getNumContent($libraryid); if ($out->left) { // Find the 40 first contents using this library version and add to params. $results = $DB->get_records_sql("SELECT id, json_content as params\n FROM {hvp}\n WHERE main_library_id = ?\n ORDER BY name ASC", array($libraryid), 0, 40); foreach ($results as $content) { $out->params[$content->id] = $content->params; } } return $out; }