From 557b58b0996352a875f094f111e72dc0c0fe0de3 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 23 Oct 2015 10:30:57 +0200 Subject: [PATCH] MDL-51886 wiki: New WS mod_wiki_view_wiki and mod_wiki_view_page --- lib/db/services.php | 2 + mod/wiki/classes/external.php | 146 ++++++++++++++++++++++++++++++++++ mod/wiki/db/services.php | 16 ++++ mod/wiki/lib.php | 69 ++++++++++++++++ mod/wiki/prettyview.php | 14 +--- mod/wiki/version.php | 2 +- mod/wiki/view.php | 50 +++--------- version.php | 2 +- 8 files changed, 250 insertions(+), 51 deletions(-) diff --git a/lib/db/services.php b/lib/db/services.php index 54902d9a8a011..9a3c98fa5cd70 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -1272,6 +1272,8 @@ 'mod_imscp_get_imscps_by_courses', 'mod_glossary_get_glossaries_by_courses', 'mod_wiki_get_wikis_by_courses', + 'mod_wiki_view_wiki', + 'mod_wiki_view_page', ), 'enabled' => 0, 'restrictedusers' => 0, diff --git a/mod/wiki/classes/external.php b/mod/wiki/classes/external.php index 847f7888fb693..0ce1096dbbb1c 100644 --- a/mod/wiki/classes/external.php +++ b/mod/wiki/classes/external.php @@ -174,4 +174,150 @@ public static function get_wikis_by_courses_returns() { ); } + /** + * Describes the parameters for view_wiki. + * + * @return external_function_parameters + * @since Moodle 3.1 + */ + public static function view_wiki_parameters() { + return new external_function_parameters ( + array( + 'wikiid' => new external_value(PARAM_INT, 'Wiki instance ID.') + ) + ); + } + + /** + * Trigger the course module viewed event and update the module completion status. + * + * @param int $wikiid The wiki instance ID. + * @return array of warnings and status result. + * @since Moodle 3.1 + */ + public static function view_wiki($wikiid) { + + $params = self::validate_parameters(self::view_wiki_parameters(), + array( + 'wikiid' => $wikiid + )); + $warnings = array(); + + // Get wiki instance. + if (!$wiki = wiki_get_wiki($params['wikiid'])) { + throw new moodle_exception('incorrectwikiid', 'wiki'); + } + + // Permission validation. + list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki'); + $context = context_module::instance($cm->id); + self::validate_context($context); + + // Check if user can view this wiki. + // We don't use wiki_user_can_view because it requires to have a valid subwiki for the user. + if (!has_capability('mod/wiki:viewpage', $context)) { + throw new moodle_exception('cannotviewpage', 'wiki'); + } + + // Trigger course_module_viewed event and completion. + wiki_view($wiki, $course, $cm, $context); + + $result = array(); + $result['status'] = true; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Describes the view_wiki return value. + * + * @return external_single_structure + * @since Moodle 3.1 + */ + public static function view_wiki_returns() { + return new external_single_structure( + array( + 'status' => new external_value(PARAM_BOOL, 'Status: true if success.'), + 'warnings' => new external_warnings() + ) + ); + } + + /** + * Describes the parameters for view_page. + * + * @return external_function_parameters + * @since Moodle 3.1 + */ + public static function view_page_parameters() { + return new external_function_parameters ( + array( + 'pageid' => new external_value(PARAM_INT, 'Wiki page ID.'), + ) + ); + } + + /** + * Trigger the page viewed event and update the module completion status. + * + * @param int $pageid The page ID. + * @return array of warnings and status result. + * @since Moodle 3.1 + * @throws moodle_exception if page is not valid. + */ + public static function view_page($pageid) { + + $params = self::validate_parameters(self::view_page_parameters(), + array( + 'pageid' => $pageid + )); + $warnings = array(); + + // Get wiki page. + if (!$page = wiki_get_page($params['pageid'])) { + throw new moodle_exception('incorrectpageid', 'wiki'); + } + + // Get wiki instance. + if (!$wiki = wiki_get_wiki_from_pageid($params['pageid'])) { + throw new moodle_exception('incorrectwikiid', 'wiki'); + } + + // Permission validation. + list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki'); + $context = context_module::instance($cm->id); + self::validate_context($context); + + // Check if user can view this wiki. + if (!$subwiki = wiki_get_subwiki($page->subwikiid)) { + throw new moodle_exception('incorrectsubwikiid', 'wiki'); + } + if (!wiki_user_can_view($subwiki, $wiki)) { + throw new moodle_exception('cannotviewpage', 'wiki'); + } + + // Trigger page_viewed event and completion. + wiki_page_view($wiki, $page, $course, $cm, $context); + + $result = array(); + $result['status'] = true; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Describes the view_page return value. + * + * @return external_single_structure + * @since Moodle 3.1 + */ + public static function view_page_returns() { + return new external_single_structure( + array( + 'status' => new external_value(PARAM_BOOL, 'Status: true if success.'), + 'warnings' => new external_warnings() + ) + ); + } + } diff --git a/mod/wiki/db/services.php b/mod/wiki/db/services.php index 89c5980480053..46cf320d97b3c 100644 --- a/mod/wiki/db/services.php +++ b/mod/wiki/db/services.php @@ -33,5 +33,21 @@ 'no courses are provided then all the wiki instances the user has access to will be returned.', 'type' => 'read', 'capabilities' => 'mod/wiki:viewpage' + ), + + 'mod_wiki_view_wiki' => array( + 'classname' => 'mod_wiki_external', + 'methodname' => 'view_wiki', + 'description' => 'Trigger the course module viewed event and update the module completion status.', + 'type' => 'write', + 'capabilities' => 'mod/wiki:viewpage' + ), + + 'mod_wiki_view_page' => array( + 'classname' => 'mod_wiki_external', + 'methodname' => 'view_page', + 'description' => 'Trigger the page viewed event and update the module completion status.', + 'type' => 'write', + 'capabilities' => 'mod/wiki:viewpage' ) ); diff --git a/mod/wiki/lib.php b/mod/wiki/lib.php index 4e0d4a640c9a0..997475e64f086 100644 --- a/mod/wiki/lib.php +++ b/mod/wiki/lib.php @@ -659,3 +659,72 @@ function wiki_page_type_list($pagetype, $parentcontext, $currentcontext) { ); return $module_pagetype; } + +/** + * Mark the activity completed (if required) and trigger the course_module_viewed event. + * + * @param stdClass $wiki Wiki object. + * @param stdClass $course Course object. + * @param stdClass $cm Course module object. + * @param stdClass $context Context object. + * @since Moodle 3.1 + */ +function wiki_view($wiki, $course, $cm, $context) { + // Trigger course_module_viewed event. + $params = array( + 'context' => $context, + 'objectid' => $wiki->id + ); + $event = \mod_wiki\event\course_module_viewed::create($params); + $event->add_record_snapshot('course_modules', $cm); + $event->add_record_snapshot('course', $course); + $event->add_record_snapshot('wiki', $wiki); + $event->trigger(); + + // Completion. + $completion = new completion_info($course); + $completion->set_module_viewed($cm); +} + +/** + * Mark the activity completed (if required) and trigger the page_viewed event. + * + * @param stdClass $wiki Wiki object. + * @param stdClass $page Page object. + * @param stdClass $course Course object. + * @param stdClass $cm Course module object. + * @param stdClass $context Context object. + * @param int $uid Optional User ID. + * @param array $other Optional Other params: title, wiki ID, group ID, groupanduser, prettyview. + * @param stdClass $subwiki Optional Subwiki. + * @since Moodle 3.1 + */ +function wiki_page_view($wiki, $page, $course, $cm, $context, $uid = null, $other = null, $subwiki = null) { + + // Trigger course_module_viewed event. + $params = array( + 'context' => $context, + 'objectid' => $page->id + ); + if ($uid != null) { + $params['relateduserid'] = $uid; + } + if ($other != null) { + $params['other'] = $other; + } + + $event = \mod_wiki\event\page_viewed::create($params); + + $event->add_record_snapshot('wiki_pages', $page); + $event->add_record_snapshot('course_modules', $cm); + $event->add_record_snapshot('course', $course); + $event->add_record_snapshot('wiki', $wiki); + if ($subwiki != null) { + $event->add_record_snapshot('wiki_subwikis', $subwiki); + } + $event->trigger(); + + // Completion. + $completion = new completion_info($course); + $completion->set_module_viewed($cm); +} diff --git a/mod/wiki/prettyview.php b/mod/wiki/prettyview.php index e496b6ccecca1..be8ecd3ee3259 100644 --- a/mod/wiki/prettyview.php +++ b/mod/wiki/prettyview.php @@ -62,17 +62,9 @@ $wikipage->set_page($page); $context = context_module::instance($cm->id); -$event = \mod_wiki\event\page_viewed::create( - array( - 'context' => $context, - 'objectid' => $pageid, - 'other' => array('prettyview' => true) - ) - ); -$event->add_record_snapshot('wiki_pages', $page); -$event->add_record_snapshot('wiki', $wiki); -$event->add_record_snapshot('wiki_subwikis', $subwiki); -$event->trigger(); + +$other = array('prettyview' => true); +wiki_page_view($wiki, $page, $course, $cm, $context, null, $other, $subwiki); $wikipage->print_header(); $wikipage->print_content(); diff --git a/mod/wiki/version.php b/mod/wiki/version.php index 2fa3c25b296a0..38719eee36924 100644 --- a/mod/wiki/version.php +++ b/mod/wiki/version.php @@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2015111601; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2015111602; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2015111000; // Requires this Moodle version $plugin->component = 'mod_wiki'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; diff --git a/mod/wiki/view.php b/mod/wiki/view.php index e32d9e7372354..a9b73198c01c8 100644 --- a/mod/wiki/view.php +++ b/mod/wiki/view.php @@ -275,11 +275,6 @@ print_error('cannotviewpage', 'wiki'); } -// Update 'viewed' state if required by completion system -require_once($CFG->libdir . '/completionlib.php'); -$completion = new completion_info($course); -$completion->set_module_viewed($cm); - if (($edit != - 1) and $PAGE->user_allowed_editing()) { $USER->editing = $edit; } @@ -290,40 +285,19 @@ $wikipage->set_page($page); $context = context_module::instance($cm->id); -if($pageid) { - $event = \mod_wiki\event\page_viewed::create( - array( - 'context' => $context, - 'objectid' => $pageid - ) - ); - $event->add_record_snapshot('wiki_pages', $page); -} else if($id) { - $event = \mod_wiki\event\course_module_viewed::create( - array( - 'context' => $context, - 'objectid' => $wiki->id - ) - ); -} else if($wid && $title) { - $event = \mod_wiki\event\page_viewed::create( - array( - 'context' => $context, - 'objectid' => $page->id, - 'relateduserid' => $uid, - 'other' => array( - 'title' => $title, - 'wid' => $wid, - 'group' => $gid, - 'groupanduser' => $groupanduser) - ) - ); - $event->add_record_snapshot('wiki_pages', $page); +if ($pageid) { + wiki_page_view($wiki, $page, $course, $cm, $context, null, null, $subwiki); +} else if ($id) { + wiki_view($wiki, $course, $cm, $context); +} else if ($wid && $title) { + $other = array( + 'title' => $title, + 'wid' => $wid, + 'group' => $gid, + 'groupanduser' => $groupanduser + ); + wiki_page_view($wiki, $page, $course, $cm, $context, $uid, $other, $subwiki); } -$event->add_record_snapshot('course_modules', $cm); -$event->add_record_snapshot('course', $course); -$event->add_record_snapshot('wiki', $wiki); -$event->trigger(); $wikipage->print_header(); $wikipage->print_content(); diff --git a/version.php b/version.php index 2be622c45f14f..bd00cc962facf 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2015121800.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2015121800.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes.