/** * Trigger the course module viewed event. * * @param int $scormid the scorm instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_scorm($scormid) { global $DB, $CFG; require_once($CFG->dirroot . '/mod/scorm/lib.php'); $params = self::validate_parameters(self::view_scorm_parameters(), array( 'scormid' => $scormid )); $warnings = array(); // Request and permission validation. $scorm = $DB->get_record('scorm', array('id' => $params['scormid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($scorm, 'scorm'); $context = context_module::instance($cm->id); self::validate_context($context); // Call the scorm/lib API. scorm_view($scorm, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Simulate the imscp/view.php web interface page: trigger events, completion, etc... * * @param int $imscpid the imscp instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_imscp($imscpid) { global $DB, $CFG; require_once($CFG->dirroot . "/mod/imscp/lib.php"); $params = self::validate_parameters(self::view_imscp_parameters(), array( 'imscpid' => $imscpid )); $warnings = array(); // Request and permission validation. $imscp = $DB->get_record('imscp', array('id' => $params['imscpid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($imscp, 'imscp'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/imscp:view', $context); // Call the imscp/lib API. imscp_view($imscp, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Search a list of modules. * * @param $modulecode * @return array [string] * @throws \invalid_parameter_exception */ public static function get_submission_status($submissionid) { global $DB, $USER; $params = self::validate_parameters(self::get_submission_status_parameters(), array('submissionid' => $submissionid)); $submissionid = $params['submissionid']; $submission = $DB->get_record('turnitintooltwo_submissions', array('id' => $submissionid)); if (!$submission) { return array('status' => 'error'); } // Grab more data. $turnitintooltwo = $DB->get_record('turnitintooltwo', array('id' => $submission->turnitintooltwoid)); list($course, $cm) = get_course_and_cm_from_instance($turnitintooltwo, 'turnitintooltwo'); // Check this is our submission. if ($USER->id !== $submission->userid && !has_capability('mod/turnitintooltwo:grade', \context_module::instance($cm->id))) { return array('status' => 'nopermission'); } // What is the status? $status = $DB->get_record('turnitintooltwo_sub_status', array('submissionid' => $submissionid)); if (!$status) { return array('status' => 'queued'); } // Decode the receipt. $digitalreceipt = (array) json_decode($status->receipt); // Woo! if ($status->status == \mod_turnitintooltwo\task\submit_assignment::STATUS_SUCCESS) { $turnitintooltwoview = new \turnitintooltwo_view(); $digitalreceipt = $turnitintooltwoview->show_digital_receipt($digitalreceipt); $digitalreceipt = \html_writer::tag("div", $digitalreceipt, array("id" => "box_receipt")); return array('status' => 'success', 'message' => $digitalreceipt); } return array('status' => 'failed', 'message' => \html_writer::tag("div", $digitalreceipt["message"], array("class" => "alert alert-danger"))); }
/** * Returns our CMID. */ public function get_cmid() { if (!isset($this->cmid)) { list($course, $cm) = get_course_and_cm_from_instance($this->id, 'qa'); $this->cmid = $cm->id; } return $this->cmid; }
public function execute() { global $CFG, $DB; require_once $CFG->dirroot . "/mod/turnitintooltwo/lib.php"; require_once $CFG->dirroot . "/mod/turnitintooltwo/turnitintooltwo_view.class.php"; $data = (array) $this->get_custom_data(); // Make sure we are still wanted. $submission = $DB->get_record('turnitintooltwo_submissions', array('id' => $data['submissionid'])); if (!$submission) { return true; } cli_writeln("Processing Turnitintooltwo submission: " . $data['submissionid']); $user = $DB->get_record('user', array('id' => $data['userid'])); \core\session\manager::set_user($user); $turnitintooltwo = $DB->get_record('turnitintooltwo', array('id' => $data['tiiid'])); list($course, $cm) = get_course_and_cm_from_instance($turnitintooltwo, 'turnitintooltwo'); try { $turnitintooltwoassignment = new \turnitintooltwo_assignment($turnitintooltwo->id, $turnitintooltwo); $turnitintooltwosubmission = new \turnitintooltwo_submission($data['submissionid'], "moodle", $turnitintooltwoassignment); $parts = $turnitintooltwoassignment->get_parts(); $tiisubmission = $turnitintooltwosubmission->do_tii_submission($cm, $turnitintooltwoassignment); // Update submission. $DB->update_record('turnitintooltwo_submissions', array('id' => $data['submissionid'], 'submission_modified' => $data['subtime'])); } catch (\Exception $e) { $tiisubmission = array('success' => false, 'message' => $e->getMessage()); cli_writeln($e->getMessage()); } $digitalreceipt = $tiisubmission; $digitalreceipt['is_manual'] = 0; $digitalreceipt = json_encode($digitalreceipt); $this->update_sub_status($data['submissionid'], $tiisubmission['success'], $digitalreceipt); if ($tiisubmission['success'] === true) { $lockedassignment = new \stdClass(); $lockedassignment->id = $turnitintooltwoassignment->turnitintooltwo->id; $lockedassignment->submitted = 1; $DB->update_record('turnitintooltwo', $lockedassignment); $lockedpart = new \stdClass(); $lockedpart->id = $data['submissionpart']; $lockedpart->submitted = 1; // Disable anonymous marking if post date has passed. if ($parts[$data['submissionpart']]->dtpost <= time()) { $lockedpart->unanon = 1; } $DB->update_record('turnitintooltwo_parts', $lockedpart); cli_writeln("Finished processing successful submission: " . $data['submissionid']); } else { turnitintooltwo_add_to_log($course->id, "errored submission", 'view.php?id=' . $cm->id, "Failed to submit '" . $turnitintooltwosubmission->submission_title . "'", $cm->id, $user->id, array('submissionid' => $data['submissionid'])); cli_writeln("Finished processing unsuccessful submission: " . $data['submissionid']); } \core\session\manager::set_user(get_admin()); return $tiisubmission['success']; }
/** * Simulate the book/view.php web interface page: trigger events, completion, etc... * * @param int $bookid the book instance id * @param int $chapterid the book chapter id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_book($bookid, $chapterid = 0) { global $DB, $CFG; require_once $CFG->dirroot . "/mod/book/lib.php"; require_once $CFG->dirroot . "/mod/book/locallib.php"; $params = self::validate_parameters(self::view_book_parameters(), array('bookid' => $bookid, 'chapterid' => $chapterid)); $bookid = $params['bookid']; $chapterid = $params['chapterid']; $warnings = array(); // Request and permission validation. $book = $DB->get_record('book', array('id' => $bookid), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($book, 'book'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/book:read', $context); $chapters = book_preload_chapters($book); $firstchapterid = 0; $lastchapterid = 0; foreach ($chapters as $ch) { if ($ch->hidden) { continue; } if (!$firstchapterid) { $firstchapterid = $ch->id; } $lastchapterid = $ch->id; } if (!$chapterid) { // Trigger the module viewed events since we are displaying the book. book_view($book, null, false, $course, $cm, $context); $chapterid = $firstchapterid; } // Check if book is empty (warning). if (!$chapterid) { $warnings[] = array('item' => 'book', 'itemid' => $book->id, 'warningcode' => '1', 'message' => get_string('nocontent', 'mod_book')); } else { $chapter = $DB->get_record('book_chapters', array('id' => $chapterid, 'bookid' => $book->id)); $viewhidden = has_capability('mod/book:viewhiddenchapters', $context); if (!$chapter or $chapter->hidden and !$viewhidden) { throw new moodle_exception('errorchapter', 'mod_book'); } // Trigger the chapter viewed event. $islastchapter = $chapter->id == $lastchapterid ? true : false; book_view($book, $chapter, $islastchapter, $course, $cm, $context); } $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Simulate the folder/view.php web interface page: trigger events, completion, etc... * * @param int $folderid the folder instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_folder($folderid) { global $DB, $CFG; require_once $CFG->dirroot . "/mod/folder/lib.php"; $params = self::validate_parameters(self::view_folder_parameters(), array('folderid' => $folderid)); $warnings = array(); // Request and permission validation. $folder = $DB->get_record('folder', array('id' => $params['folderid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($folder, 'folder'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/folder:view', $context); // Call the page/lib API. folder_view($folder, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
require_once $CFG->dirroot . '/mod/quiz/lib.php'; require_once $CFG->dirroot . '/mod/quiz/locallib.php'; require_once $CFG->dirroot . '/mod/quiz/override_form.php'; $cmid = optional_param('cmid', 0, PARAM_INT); $overrideid = optional_param('id', 0, PARAM_INT); $action = optional_param('action', null, PARAM_ALPHA); $reset = optional_param('reset', false, PARAM_BOOL); $override = null; if ($overrideid) { if (!($override = $DB->get_record('quiz_overrides', array('id' => $overrideid)))) { print_error('invalidoverrideid', 'quiz'); } if (!($quiz = $DB->get_record('quiz', array('id' => $override->quiz)))) { print_error('invalidcoursemodule'); } list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz'); } else { if ($cmid) { list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'quiz'); $quiz = $DB->get_record('quiz', array('id' => $cm->instance), '*', MUST_EXIST); } else { print_error('invalidcoursemodule'); } } $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); $url = new moodle_url('/mod/quiz/overrideedit.php'); if ($action) { $url->param('action', $action); } if ($overrideid) { $url->param('id', $overrideid);
/** * Simulate the forum/discuss.php web interface page: trigger events * * @param int $discussionid the discussion id * @return array of warnings and status result * @since Moodle 2.9 * @throws moodle_exception */ public static function view_forum_discussion($discussionid) { global $DB, $CFG; require_once $CFG->dirroot . "/mod/forum/lib.php"; $params = self::validate_parameters(self::view_forum_discussion_parameters(), array('discussionid' => $discussionid)); $warnings = array(); $discussion = $DB->get_record('forum_discussions', array('id' => $params['discussionid']), '*', MUST_EXIST); $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); // Validate the module context. It checks everything that affects the module visibility (including groupings, etc..). $modcontext = context_module::instance($cm->id); self::validate_context($modcontext); require_capability('mod/forum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum'); // Call the forum/lib API. forum_discussion_view($modcontext, $forum, $discussion); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
* * @author Andreas Grabs * @license http://www.gnu.org/copyleft/gpl.html GNU Public License * @package mod_feedback */ require_once "../../config.php"; require_once "lib.php"; feedback_init_feedback_session(); $itemid = optional_param('id', false, PARAM_INT); if (!$itemid) { $cmid = required_param('cmid', PARAM_INT); $typ = required_param('typ', PARAM_ALPHA); } if ($itemid) { $item = $DB->get_record('feedback_item', array('id' => $itemid), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($item->feedback, 'feedback'); $url = new moodle_url('/mod/feedback/edit_item.php', array('id' => $itemid)); $typ = $item->typ; } else { $item = null; list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'feedback'); $url = new moodle_url('/mod/feedback/edit_item.php', array('cmid' => $cm->id, 'typ' => $typ)); $item = (object) ['id' => null, 'position' => -1, 'typ' => $typ, 'options' => '']; } require_login($course, true, $cm); $context = context_module::instance($cm->id); require_capability('mod/feedback:edititems', $context); $feedback = $PAGE->activityrecord; $editurl = new moodle_url('/mod/feedback/edit.php', array('id' => $cm->id)); $PAGE->set_url($url); // If the typ is pagebreak so the item will be saved directly.
/** * Validate a glossary via ID. * * @param int $id The glossary ID. * @return array Contains glossary, context, course and cm. */ protected static function validate_glossary($id) { global $DB; $glossary = $DB->get_record('glossary', array('id' => $id), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($glossary, 'glossary'); $context = context_module::instance($cm->id); self::validate_context($context); return array($glossary, $context, $course, $cm); }
/** * Trigger the course module viewed event and update the module completion status. * * @param int $quizid quiz instance id * @return array of warnings and status result * @since Moodle 3.1 * @throws moodle_exception */ public static function view_quiz($quizid) { global $DB; $params = self::validate_parameters(self::view_quiz_parameters(), array('quizid' => $quizid)); $warnings = array(); // Request and permission validation. $quiz = $DB->get_record('quiz', array('id' => $params['quizid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz'); $context = context_module::instance($cm->id); self::validate_context($context); // Trigger course_module_viewed event and completion. quiz_view($quiz, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Add a new discussion into an existing forum. * * @param int $forumid the forum instance id * @param string $subject new discussion subject * @param string $message new discussion message (only html format allowed) * @param int $groupid the user course group * @param array $options optional settings * @return array of warnings and the new discussion id * @since Moodle 3.0 * @throws moodle_exception */ public static function add_discussion($forumid, $subject, $message, $groupid = -1, $options = array()) { global $DB, $CFG; require_once($CFG->dirroot . "/mod/forum/lib.php"); $params = self::validate_parameters(self::add_discussion_parameters(), array( 'forumid' => $forumid, 'subject' => $subject, 'message' => $message, 'groupid' => $groupid, 'options' => $options )); // Validate options. $options = array( 'discussionsubscribe' => true ); foreach ($params['options'] as $option) { $name = trim($option['name']); switch ($name) { case 'discussionsubscribe': $value = clean_param($option['value'], PARAM_BOOL); break; default: throw new moodle_exception('errorinvalidparam', 'webservice', '', $name); } $options[$name] = $value; } $warnings = array(); // Request and permission validation. $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); $context = context_module::instance($cm->id); self::validate_context($context); // Normalize group. if (!groups_get_activity_groupmode($cm)) { // Groups not supported, force to -1. $groupid = -1; } else { // Check if we receive the default or and empty value for groupid, // in this case, get the group for the user in the activity. if ($groupid === -1 or empty($params['groupid'])) { $groupid = groups_get_activity_group($cm); } else { // Here we rely in the group passed, forum_user_can_post_discussion will validate the group. $groupid = $params['groupid']; } } if (!forum_user_can_post_discussion($forum, $groupid, -1, $cm, $context)) { throw new moodle_exception('cannotcreatediscussion', 'forum'); } $thresholdwarning = forum_check_throttling($forum, $cm); forum_check_blocking_threshold($thresholdwarning); // Create the discussion. $discussion = new stdClass(); $discussion->course = $course->id; $discussion->forum = $forum->id; $discussion->message = $params['message']; $discussion->messageformat = FORMAT_HTML; // Force formatting for now. $discussion->messagetrust = trusttext_trusted($context); $discussion->itemid = 0; $discussion->groupid = $groupid; $discussion->mailnow = 0; $discussion->subject = $params['subject']; $discussion->name = $discussion->subject; $discussion->timestart = 0; $discussion->timeend = 0; if ($discussionid = forum_add_discussion($discussion)) { $discussion->id = $discussionid; // Trigger events and completion. $params = array( 'context' => $context, 'objectid' => $discussion->id, 'other' => array( 'forumid' => $forum->id, ) ); $event = \mod_forum\event\discussion_created::create($params); $event->add_record_snapshot('forum_discussions', $discussion); $event->trigger(); $completion = new completion_info($course); if ($completion->is_enabled($cm) && ($forum->completiondiscussions || $forum->completionposts)) { $completion->update_state($cm, COMPLETION_COMPLETE); } $settings = new stdClass(); $settings->discussionsubscribe = $options['discussionsubscribe']; forum_post_subscription($settings, $forum, $discussion); } else { throw new moodle_exception('couldnotadd', 'forum'); } $result = array(); $result['discussionid'] = $discussionid; $result['warnings'] = $warnings; return $result; }
/** * Check if the current user can add discussions in the given forum (and optionally for the given group). * * @param int $forumid the forum instance id * @param int $groupid the group to check, default to active group. Use -1 to check if the user can post in all the groups. * @return array of warnings and the status (true if the user can add discussions) * @since Moodle 3.1 * @throws moodle_exception */ public static function can_add_discussion($forumid, $groupid = null) { global $DB, $CFG; require_once $CFG->dirroot . "/mod/forum/lib.php"; $params = self::validate_parameters(self::can_add_discussion_parameters(), array('forumid' => $forumid, 'groupid' => $groupid)); $warnings = array(); // Request and permission validation. $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); $context = context_module::instance($cm->id); self::validate_context($context); $status = forum_user_can_post_discussion($forum, $params['groupid'], -1, $cm, $context); $result = array(); $result['status'] = $status; $result['warnings'] = $warnings; return $result; }
/** * Test that the useridlist cache will retive the correct values * when using assign::get_useridlist_key and assign::get_useridlist_key_id. */ public function test_useridlist_cache() { // Create an assignment object, we will use this to test the key generation functions. $course = self::getDataGenerator()->create_course(); $assign = self::getDataGenerator()->create_module('assign', array('course' => $course->id)); list($courserecord, $cm) = get_course_and_cm_from_instance($assign->id, 'assign'); $context = context_module::instance($cm->id); $assign = new assign($context, $cm, $courserecord); // Create the cache. $cache = cache::make_from_params(cache_store::MODE_SESSION, 'mod_assign', 'useridlist'); // Create an entry that we will insert into the cache. $entry = array(0 => '5', 1 => '6325', 2 => '67783'); // Insert the value into the cache. $cache->set($assign->get_useridlist_key(), $entry); // Now test we can retrive the entry. $this->assertEquals($entry, $cache->get($assign->get_useridlist_key())); $useridlistid = clean_param($assign->get_useridlist_key_id(), PARAM_ALPHANUM); $this->assertEquals($entry, $cache->get($assign->get_useridlist_key($useridlistid))); // Check it will not retrive anything on an invalid key. $this->assertFalse($cache->get($assign->get_useridlist_key('notvalid'))); }
/** * Test that the summary, when generated from the intro text, does not strip out images or trim the text in anyway. * @throws \coding_exception * @throws \moodle_exception */ public function test_get_page_mod_intro_summary() { $this->resetAfterTest(); $generator = $this->getDataGenerator(); $course = $generator->create_course(); $pagegen = $generator->get_plugin_generator('mod_page'); $page = $pagegen->create_instance(['course' => $course->id, 'intro' => '<img src="http://fakeurl.local/testimg.png" alt="some alt text" />' . '<p>Some content text</p>' . str_pad('-', 200)]); $cm = get_course_and_cm_from_instance($page->id, 'page', $course->id)[1]; $pagemod = local::get_page_mod($cm); // Ensure summary contains text and is sitll within tags. $this->assertContains('<p>Some content text</p>', $pagemod->summary); // Ensure summary contains images. $this->assertContains('<img', $pagemod->summary); // Make sure summary text can be greater than 200 chars. $this->assertGreaterThan(200, strlen($pagemod->summary)); }
/** * Trigger the course module viewed event and update the module completion status. * * @param int $chatid the chat instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_chat($chatid) { global $DB, $CFG; $params = self::validate_parameters(self::view_chat_parameters(), array('chatid' => $chatid)); $warnings = array(); // Request and permission validation. $chat = $DB->get_record('chat', array('id' => $params['chatid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($chat, 'chat'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/chat:chat', $context); // Call the url/lib API. chat_view($chat, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Trigger the course module viewed event and update the module completion status. * * @param int $ltiid the lti instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_lti($ltiid) { global $DB; $params = self::validate_parameters(self::view_lti_parameters(), array('ltiid' => $ltiid)); $warnings = array(); // Request and permission validation. $lti = $DB->get_record('lti', array('id' => $params['ltiid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($lti, 'lti'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/lti:view', $context); // Trigger course_module_viewed event and completion. lti_view($lti, $course, $cm, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Returns the list of files from a specific subwiki. * * @param int $wikiid The wiki instance ID. * @param int $groupid The group ID. If not defined, use current group. * @param int $userid The user ID. If not defined, use current user. * @return array Containing a list of warnings and a list of files. * @since Moodle 3.1 * @throws moodle_exception */ public static function get_subwiki_files($wikiid, $groupid = -1, $userid = 0) { $returnedfiles = array(); $warnings = array(); $params = self::validate_parameters(self::get_subwiki_files_parameters(), array('wikiid' => $wikiid, 'groupid' => $groupid, 'userid' => $userid)); // Get wiki instance. if (!($wiki = wiki_get_wiki($params['wikiid']))) { throw new moodle_exception('incorrectwikiid', 'wiki'); } list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki'); $context = context_module::instance($cm->id); self::validate_context($context); // Determine groupid and userid to use. list($groupid, $userid) = self::determine_group_and_user($cm, $wiki, $params['groupid'], $params['userid']); // Get subwiki and validate it. $subwiki = wiki_get_subwiki_by_group_and_user_with_validation($wiki, $groupid, $userid); // Get subwiki based on group and user. if ($subwiki === false) { throw new moodle_exception('cannotviewfiles', 'wiki'); } else { if ($subwiki->id != -1) { // The subwiki exists, let's get the files. $fs = get_file_storage(); if ($files = $fs->get_area_files($context->id, 'mod_wiki', 'attachments', $subwiki->id, 'filename', false)) { foreach ($files as $file) { $filename = $file->get_filename(); $fileurl = moodle_url::make_webservice_pluginfile_url($context->id, 'mod_wiki', 'attachments', $subwiki->id, '/', $filename); $returnedfiles[] = array('filename' => $filename, 'mimetype' => $file->get_mimetype(), 'fileurl' => $fileurl->out(false), 'filepath' => $file->get_filepath(), 'filesize' => $file->get_filesize(), 'timemodified' => $file->get_timemodified()); } } } } $result = array(); $result['files'] = $returnedfiles; $result['warnings'] = $warnings; return $result; }
/** * Trigger the submission status viewed event. * * @param int $assignid assign instance id * @return array of warnings and status result * @since Moodle 3.1 */ public static function view_submission_status($assignid) { global $DB, $CFG; require_once "{$CFG->dirroot}/mod/assign/locallib.php"; $warnings = array(); $params = array('assignid' => $assignid); $params = self::validate_parameters(self::view_submission_status_parameters(), $params); // Request and permission validation. $assign = $DB->get_record('assign', array('id' => $params['assignid']), 'id', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($assign, 'assign'); $context = context_module::instance($cm->id); // Please, note that is not required to check mod/assign:view because is done by validate_context->require_login. self::validate_context($context); $assign = new assign($context, $cm, $course); \mod_assign\event\submission_status_viewed::create_from_assign($assign)->trigger(); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Starts a new attempt at a quiz. * * @param int $quizid quiz instance id * @param array $preflightdata preflight required data (like passwords) * @param bool $forcenew Whether to force a new attempt or not. * @return array of warnings and the attempt basic data * @since Moodle 3.1 * @throws moodle_quiz_exception */ public static function start_attempt($quizid, $preflightdata = array(), $forcenew = false) { global $DB, $USER; $warnings = array(); $attempt = array(); $params = array('quizid' => $quizid, 'preflightdata' => $preflightdata, 'forcenew' => $forcenew); $params = self::validate_parameters(self::start_attempt_parameters(), $params); $forcenew = $params['forcenew']; // Request and permission validation. $quiz = $DB->get_record('quiz', array('id' => $params['quizid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz'); $context = context_module::instance($cm->id); self::validate_context($context); $quizobj = quiz::create($cm->instance, $USER->id); // Check questions. if (!$quizobj->has_questions()) { throw new moodle_quiz_exception($quizobj, 'noquestionsfound'); } // Create an object to manage all the other (non-roles) access rules. $timenow = time(); $accessmanager = $quizobj->get_access_manager($timenow); // Validate permissions for creating a new attempt and start a new preview attempt if required. list($currentattemptid, $attemptnumber, $lastattempt, $messages, $page) = quiz_validate_new_attempt($quizobj, $accessmanager, $forcenew, -1, false); // Check access. if (!$quizobj->is_preview_user() && $messages) { // Create warnings with the exact messages. foreach ($messages as $message) { $warnings[] = array('item' => 'quiz', 'itemid' => $quiz->id, 'warningcode' => '1', 'message' => clean_text($message, PARAM_TEXT)); } } else { if ($accessmanager->is_preflight_check_required($currentattemptid)) { // Need to do some checks before allowing the user to continue. $provideddata = array(); foreach ($params['preflightdata'] as $data) { $provideddata[$data['name']] = $data['value']; } $errors = $accessmanager->validate_preflight_check($provideddata, [], $currentattemptid); if (!empty($errors)) { throw new moodle_quiz_exception($quizobj, array_shift($errors)); } // Pre-flight check passed. $accessmanager->notify_preflight_check_passed($currentattemptid); } if ($currentattemptid) { if ($lastattempt->state == quiz_attempt::OVERDUE) { throw new moodle_quiz_exception($quizobj, 'stateoverdue'); } else { throw new moodle_quiz_exception($quizobj, 'attemptstillinprogress'); } } $attempt = quiz_prepare_and_start_new_attempt($quizobj, $attemptnumber, $lastattempt); } $result = array(); $result['attempt'] = $attempt; $result['warnings'] = $warnings; return $result; }
/** * Submit the answers for a given survey. * * @param int $surveyid the survey instance id * @param array $answers the survey answers * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function submit_answers($surveyid, $answers) { global $DB, $USER; $params = self::validate_parameters(self::submit_answers_parameters(), array('surveyid' => $surveyid, 'answers' => $answers)); $warnings = array(); // Request and permission validation. $survey = $DB->get_record('survey', array('id' => $params['surveyid']), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($survey, 'survey'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/survey:participate', $context); if (survey_already_done($survey->id, $USER->id)) { throw new moodle_exception("alreadysubmitted", "survey"); } // Build the answers array. Data is cleaned inside the survey_save_answers function. $answers = array(); foreach ($params['answers'] as $answer) { $key = $answer['key']; $answers[$key] = $answer['value']; } survey_save_answers($survey, $answers, $course, $context); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Utility function for validating an assign. * * @param int $assignid assign instance id * @return array array containing the assign, course, context and course module objects * @since Moodle 3.2 */ protected static function validate_assign($assignid) { global $DB; // Request and permission validation. $assign = $DB->get_record('assign', array('id' => $assignid), 'id', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($assign, 'assign'); $context = context_module::instance($cm->id); // Please, note that is not required to check mod/assign:view because is done by validate_context->require_login. self::validate_context($context); $assign = new assign($context, $cm, $course); return array($assign, $course, $cm, $context); }
// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. require_once dirname(dirname(dirname(__FILE__))) . '/config.php'; require_once dirname(__FILE__) . '/locallib.php'; require_once dirname(__FILE__) . '/comment_form.php'; $id = required_param('id', PARAM_INT); $delete = optional_param('delete', 0, PARAM_INT); $confirm = optional_param('confirm', 0, PARAM_INT); if (!($gallery = $DB->get_record('lightboxgallery', array('id' => $id)))) { print_error('invalidlightboxgalleryid', 'lightboxgallery'); } list($course, $cm) = get_course_and_cm_from_instance($gallery, 'lightboxgallery'); if ($delete && !($comment = $DB->get_record('lightboxgallery_comments', array('gallery' => $gallery->id, 'id' => $delete)))) { print_error('Invalid comment ID'); } require_login($course, true, $cm); $PAGE->set_cm($cm); $PAGE->set_url('/mod/lightboxgallery/view.php', array('id' => $id)); $PAGE->set_title($gallery->name); $PAGE->set_heading($course->shortname); $context = context_module::instance($cm->id); $galleryurl = $CFG->wwwroot . '/mod/lightboxgallery/view.php?id=' . $cm->id; if ($delete && has_capability('mod/lightboxgallery:edit', $context)) { if ($confirm && confirm_sesskey()) { $DB->delete_records('lightboxgallery_comments', array('id' => $comment->id)); redirect($galleryurl); } else {
/** * Trigger the grading_table_viewed event. * * @param int $seplid the sepl instance id * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function view_grading_table($seplid) { global $DB, $CFG; require_once $CFG->dirroot . "/mod/sepl/locallib.php"; $params = self::validate_parameters(self::view_grading_table_parameters(), array('seplid' => $seplid)); $warnings = array(); // Request and permission validation. $sepl = $DB->get_record('sepl', array('id' => $params['seplid']), 'id', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($sepl, 'sepl'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/sepl:view', $context); $sepl = new sepl($context, null, null); $sepl->require_view_grades(); \mod_sepl\event\grading_table_viewed::create_from_sepl($sepl)->trigger(); $result = array(); $result['status'] = true; $result['warnings'] = $warnings; return $result; }
/** * Utility function for validating a quiz. * * @param int $quizid quiz instance id * @return array array containing the quiz, course, context and course module objects * @since Moodle 3.1 */ protected static function validate_quiz($quizid) { global $DB; // Request and permission validation. $quiz = $DB->get_record('quiz', array('id' => $quizid), '*', MUST_EXIST); list($course, $cm) = get_course_and_cm_from_instance($quiz, 'quiz'); $context = context_module::instance($cm->id); self::validate_context($context); return array($quiz, $course, $cm, $context); }
/** * Tests function for getting $course and $cm at once quickly from modinfo * based on instance id or record. */ public function test_get_course_and_cm_from_instance() { global $CFG, $DB; $this->resetAfterTest(); // Create a course and an activity. $generator = $this->getDataGenerator(); $course = $generator->create_course(array('shortname' => 'Halls')); $page = $generator->create_module('page', array('course' => $course->id, 'name' => 'Annie')); // Successful usage. list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page'); $this->assertEquals('Halls', $course->shortname); $this->assertInstanceOf('cm_info', $cm); $this->assertEquals('Annie', $cm->name); // With id in object. $fakeinstance = (object) array('id' => $page->id); list($course, $cm) = get_course_and_cm_from_instance($fakeinstance, 'page'); $this->assertEquals('Halls', $course->shortname); $this->assertEquals('Annie', $cm->name); // With both id and course in object. $fakeinstance->course = $course->id; list($course, $cm) = get_course_and_cm_from_instance($fakeinstance, 'page'); $this->assertEquals('Halls', $course->shortname); $this->assertEquals('Annie', $cm->name); // With supplied course id. list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page', $course->id); $this->assertEquals('Annie', $cm->name); // With supplied course object (modified just so we can check it is // indeed reusing the supplied object). $course->silly = true; list($course, $cm) = get_course_and_cm_from_instance($page->id, 'page', $course); $this->assertEquals('Annie', $cm->name); $this->assertTrue($course->silly); // Doesn't exist (or is wrong type). try { get_course_and_cm_from_instance($page->id, 'forum'); $this->fail(); } catch (moodle_exception $e) { $this->assertInstanceOf('dml_exception', $e); } // Invalid module name. try { get_course_and_cm_from_cmid($page->cmid, '1337 h4x0ring'); $this->fail(); } catch (coding_exception $e) { $this->assertContains('Invalid modulename parameter', $e->getMessage()); } // Create a second hidden activity. $hiddenpage = $generator->create_module('page', array('course' => $course->id, 'name' => 'Annie', 'visible' => 0)); // Create 2 user accounts, one is a manager who can see everything. $user = $generator->create_user(); $generator->enrol_user($user->id, $course->id); $manager = $generator->create_user(); $generator->enrol_user($manager->id, $course->id, $DB->get_field('role', 'id', array('shortname' => 'manager'), MUST_EXIST)); // User can see the normal page but not the hidden one. list($course, $cm) = get_course_and_cm_from_cmid($page->cmid, 'page', 0, $user->id); $this->assertTrue($cm->uservisible); list($course, $cm) = get_course_and_cm_from_cmid($hiddenpage->cmid, 'page', 0, $user->id); $this->assertFalse($cm->uservisible); // Manager can see the hidden one too. list($course, $cm) = get_course_and_cm_from_cmid($hiddenpage->cmid, 'page', 0, $manager->id); $this->assertTrue($cm->uservisible); }
*/ require_once dirname(__FILE__) . '/../../config.php'; require_once $CFG->dirroot . '/mod/lesson/lib.php'; require_once $CFG->dirroot . '/mod/lesson/locallib.php'; require_once $CFG->dirroot . '/mod/lesson/override_form.php'; $cmid = optional_param('cmid', 0, PARAM_INT); $overrideid = optional_param('id', 0, PARAM_INT); $action = optional_param('action', null, PARAM_ALPHA); $reset = optional_param('reset', false, PARAM_BOOL); $override = null; if ($overrideid) { if (!($override = $DB->get_record('lesson_overrides', array('id' => $overrideid)))) { print_error('invalidoverrideid', 'lesson'); } $lesson = new lesson($DB->get_record('lesson', array('id' => $override->lessonid), '*', MUST_EXIST)); list($course, $cm) = get_course_and_cm_from_instance($lesson, 'lesson'); } else { if ($cmid) { list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'lesson'); $lesson = new lesson($DB->get_record('lesson', array('id' => $cm->instance), '*', MUST_EXIST)); } else { print_error('invalidcoursemodule'); } } $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); $url = new moodle_url('/mod/lesson/overrideedit.php'); if ($action) { $url->param('action', $action); } if ($overrideid) { $url->param('id', $overrideid);
// // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Prints a particular question. * * @package mod_qa * @copyright 2015 Skylar Kelty <*****@*****.**> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ // Replace qa with the name of your module and remove this line. require_once dirname(dirname(dirname(__FILE__))) . '/config.php'; require_once dirname(__FILE__) . '/lib.php'; $qid = required_param('id', PARAM_INT); $question = \mod_qa\question::from_id($qid); list($course, $cm) = get_course_and_cm_from_instance($question->qaid, 'qa'); require_login($course, true, $cm); $PAGE->set_url('/mod/qa/question.php', array('id' => $qid)); $PAGE->navbar->add($question->title); $PAGE->set_title(format_string($question->title)); $PAGE->set_heading(format_string($course->fullname)); $PAGE->requires->css('/mod/qa/styles.css'); $renderer = $PAGE->get_renderer('mod_qa'); // Output starts here. echo $OUTPUT->header(); echo $OUTPUT->heading($question->title); echo $renderer->render_question_view($question); echo $renderer->render_question_replies($question->get_replies()); $url = new \moodle_url('/mod/qa/reply.php', array('qaqid' => $question->id)); echo \html_writer::tag('p', \html_writer::link($url, get_string('questionreply', 'mod_qa'))); // Finish the page.
*/ /// (Replace stopwatch with the name of your module and remove this line) require_once dirname(dirname(__DIR__)) . '/config.php'; require_once $CFG->dirroot . '/mod/stopwatch/lib.php'; require_once $CFG->dirroot . '/mod/stopwatch/locallib.php'; require_once $CFG->libdir . '/completionlib.php'; $cmid = optional_param('id', 0, PARAM_INT); // course_module ID, or $stopwatchid = optional_param('s', 0, PARAM_INT); // stopwatch instance ID - it should be named as the first character of the module $cmd = optional_param('cmd', null, PARAM_ALPHA); $durationstr = optional_param('durationstr', null, PARAM_NOTAGS); if ($cmid) { list($course, $cm) = get_course_and_cm_from_cmid($cmid, 'stopwatch'); } elseif ($stopwatchid) { list($course, $cm) = get_course_and_cm_from_instance($stopwatchid, 'stopwatch'); } else { print_error('You must specify a course_module ID or an instance ID'); } require_login($course, true, $cm); $stopwatch = $PAGE->activityrecord; $cmcontext = context_module::instance($cm->id); $cansubmit = has_capability('mod/stopwatch:submit', $cmcontext, null, false); $cangrade = has_capability('mod/stopwatch:grade', $cmcontext); if ($cmd === 'updateduration' && $cansubmit && $durationstr && confirm_sesskey()) { mod_stopwatch_update_timer($cm, $stopwatch, mod_stopwatch_string_to_duration($durationstr)); redirect($cm->url); } if ($cmd === 'updategrades' && $cangrade && confirm_sesskey()) { $durationarray = optional_param_array('duration', array(), PARAM_NOTAGS); $gradearray = optional_param_array('grade', array(), PARAM_FLOAT);