MDL-51886 wiki: New WS mod_wiki_view_wiki and mod_wiki_view_page
authorDani Palou <dani@moodle.com>
Fri, 23 Oct 2015 08:30:57 +0000 (10:30 +0200)
committerDani Palou <dani@moodle.com>
Mon, 21 Dec 2015 07:19:24 +0000 (08:19 +0100)
lib/db/services.php
mod/wiki/classes/external.php
mod/wiki/db/services.php
mod/wiki/lib.php
mod/wiki/prettyview.php
mod/wiki/version.php
mod/wiki/view.php
version.php

index 54902d9..9a3c98f 100644 (file)
@@ -1272,6 +1272,8 @@ $services = array(
             '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,
index 847f788..0ce1096 100644 (file)
@@ -174,4 +174,150 @@ class mod_wiki_external extends external_api {
         );
     }
 
+    /**
+     * 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()
+            )
+        );
+    }
+
 }
index 89c5980..46cf320 100644 (file)
@@ -33,5 +33,21 @@ $functions = array(
                            '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'
     )
 );
index 4e0d4a6..997475e 100644 (file)
@@ -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);
+}
index e496b6c..be8ecd3 100644 (file)
@@ -62,17 +62,9 @@ $wikipage = new page_wiki_prettyview($wiki, $subwiki, $cm);
 $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();
index 2fa3c25..38719ee 100644 (file)
@@ -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;
index e32d9e7..a9b7319 100644 (file)
@@ -275,11 +275,6 @@ if (!wiki_user_can_view($subwiki, $wiki)) {
     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_gid($currentgroup);
 $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();
index 2be622c..bd00cc9 100644 (file)
@@ -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.