Merge branch 'MDL-70483-main' of https://github.com/kevpercy/moodle

This commit is contained in:
Jun Pataleta
2024-02-01 12:04:49 +08:00
4 changed files with 18 additions and 487 deletions
-11
View File
@@ -48,17 +48,6 @@ $functions = array(
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE)
),
'mod_forum_get_forum_discussions_paginated' => array(
'classname' => 'mod_forum_external',
'methodname' => 'get_forum_discussions_paginated',
'classpath' => 'mod/forum/externallib.php',
'description' => '** DEPRECATED ** Please do not call this function any more.
Returns a list of forum discussions optionally sorted and paginated.',
'type' => 'read',
'capabilities' => 'mod/forum:viewdiscussion, mod/forum:viewqandawithoutposting',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE)
),
'mod_forum_get_forum_discussions' => array(
'classname' => 'mod_forum_external',
'methodname' => 'get_forum_discussions',
-260
View File
@@ -287,266 +287,6 @@ class mod_forum_external extends external_api {
]);
}
/**
* Mark the get_forum_discussions_paginated web service as deprecated.
*
* @return bool
*/
public static function get_forum_discussions_paginated_is_deprecated() {
return true;
}
/**
* Describes the parameters for get_forum_discussions_paginated.
*
* @deprecated since 3.7
* @return external_function_parameters
* @since Moodle 2.8
*/
public static function get_forum_discussions_paginated_parameters() {
return new external_function_parameters (
array(
'forumid' => new external_value(PARAM_INT, 'forum instance id', VALUE_REQUIRED),
'sortby' => new external_value(PARAM_ALPHA,
'sort by this element: id, timemodified, timestart or timeend', VALUE_DEFAULT, 'timemodified'),
'sortdirection' => new external_value(PARAM_ALPHA, 'sort direction: ASC or DESC', VALUE_DEFAULT, 'DESC'),
'page' => new external_value(PARAM_INT, 'current page', VALUE_DEFAULT, -1),
'perpage' => new external_value(PARAM_INT, 'items per page', VALUE_DEFAULT, 0),
)
);
}
/**
* Returns a list of forum discussions optionally sorted and paginated.
*
* @deprecated since 3.7
* @param int $forumid the forum instance id
* @param string $sortby sort by this element (id, timemodified, timestart or timeend)
* @param string $sortdirection sort direction: ASC or DESC
* @param int $page page number
* @param int $perpage items per page
*
* @return array the forum discussion details including warnings
* @since Moodle 2.8
*/
public static function get_forum_discussions_paginated($forumid, $sortby = 'timemodified', $sortdirection = 'DESC',
$page = -1, $perpage = 0) {
global $CFG, $DB, $USER, $PAGE;
require_once($CFG->dirroot . "/mod/forum/lib.php");
$warnings = array();
$discussions = array();
$params = self::validate_parameters(self::get_forum_discussions_paginated_parameters(),
array(
'forumid' => $forumid,
'sortby' => $sortby,
'sortdirection' => $sortdirection,
'page' => $page,
'perpage' => $perpage
)
);
// Compact/extract functions are not recommended.
$forumid = $params['forumid'];
$sortby = $params['sortby'];
$sortdirection = $params['sortdirection'];
$page = $params['page'];
$perpage = $params['perpage'];
$sortallowedvalues = array('id', 'timemodified', 'timestart', 'timeend');
if (!in_array($sortby, $sortallowedvalues)) {
throw new invalid_parameter_exception('Invalid value for sortby parameter (value: ' . $sortby . '),' .
'allowed values are: ' . implode(',', $sortallowedvalues));
}
$sortdirection = strtoupper($sortdirection);
$directionallowedvalues = array('ASC', 'DESC');
if (!in_array($sortdirection, $directionallowedvalues)) {
throw new invalid_parameter_exception('Invalid value for sortdirection parameter (value: ' . $sortdirection . '),' .
'allowed values are: ' . implode(',', $directionallowedvalues));
}
$forum = $DB->get_record('forum', array('id' => $forumid), '*', MUST_EXIST);
$course = $DB->get_record('course', array('id' => $forum->course), '*', MUST_EXIST);
$cm = get_coursemodule_from_instance('forum', $forum->id, $course->id, false, MUST_EXIST);
// 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);
// Check they have the view forum capability.
require_capability('mod/forum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum');
$sort = 'd.pinned DESC, d.' . $sortby . ' ' . $sortdirection;
$alldiscussions = forum_get_discussions($cm, $sort, true, -1, -1, true, $page, $perpage, FORUM_POSTS_ALL_USER_GROUPS);
if ($alldiscussions) {
$canviewfullname = has_capability('moodle/site:viewfullnames', $modcontext);
// Get the unreads array, this takes a forum id and returns data for all discussions.
$unreads = array();
if ($cantrack = forum_tp_can_track_forums($forum)) {
if ($forumtracked = forum_tp_is_tracked($forum)) {
$unreads = forum_get_discussions_unread($cm);
}
}
// The forum function returns the replies for all the discussions in a given forum.
$canseeprivatereplies = has_capability('mod/forum:readprivatereplies', $modcontext);
$canlock = has_capability('moodle/course:manageactivities', $modcontext, $USER);
$replies = forum_count_discussion_replies($forumid, $sort, -1, $page, $perpage, $canseeprivatereplies);
foreach ($alldiscussions as $discussion) {
// This function checks for qanda forums.
// Note that the forum_get_discussions returns as id the post id, not the discussion id so we need to do this.
$discussionrec = clone $discussion;
$discussionrec->id = $discussion->discussion;
if (!forum_user_can_see_discussion($forum, $discussionrec, $modcontext)) {
$warning = array();
// Function forum_get_discussions returns forum_posts ids not forum_discussions ones.
$warning['item'] = 'post';
$warning['itemid'] = $discussion->id;
$warning['warningcode'] = '1';
$warning['message'] = 'You can\'t see this discussion';
$warnings[] = $warning;
continue;
}
$discussion->numunread = 0;
if ($cantrack && $forumtracked) {
if (isset($unreads[$discussion->discussion])) {
$discussion->numunread = (int) $unreads[$discussion->discussion];
}
}
$discussion->numreplies = 0;
if (!empty($replies[$discussion->discussion])) {
$discussion->numreplies = (int) $replies[$discussion->discussion]->replies;
}
$discussion->name = \core_external\util::format_string($discussion->name, $modcontext);
$discussion->subject = \core_external\util::format_string($discussion->subject, $modcontext);
// Rewrite embedded images URLs.
$options = array('trusted' => $discussion->messagetrust);
list($discussion->message, $discussion->messageformat) =
\core_external\util::format_text($discussion->message, $discussion->messageformat,
$modcontext, 'mod_forum', 'post', $discussion->id, $options);
// List attachments.
if (!empty($discussion->attachment)) {
$discussion->attachments = external_util::get_area_files($modcontext->id, 'mod_forum', 'attachment',
$discussion->id);
}
$messageinlinefiles = external_util::get_area_files($modcontext->id, 'mod_forum', 'post', $discussion->id);
if (!empty($messageinlinefiles)) {
$discussion->messageinlinefiles = $messageinlinefiles;
}
$discussion->locked = forum_discussion_is_locked($forum, $discussion);
$discussion->canlock = $canlock;
$discussion->canreply = forum_user_can_post($forum, $discussion, $USER, $cm, $course, $modcontext);
if (forum_is_author_hidden($discussion, $forum)) {
$discussion->userid = null;
$discussion->userfullname = null;
$discussion->userpictureurl = null;
$discussion->usermodified = null;
$discussion->usermodifiedfullname = null;
$discussion->usermodifiedpictureurl = null;
} else {
$picturefields = explode(',', implode(',', \core_user\fields::get_picture_fields()));
// Load user objects from the results of the query.
$user = new stdclass();
$user->id = $discussion->userid;
$user = username_load_fields_from_object($user, $discussion, null, $picturefields);
// Preserve the id, it can be modified by username_load_fields_from_object.
$user->id = $discussion->userid;
$discussion->userfullname = fullname($user, $canviewfullname);
$userpicture = new user_picture($user);
$userpicture->size = 1; // Size f1.
$discussion->userpictureurl = $userpicture->get_url($PAGE)->out(false);
$usermodified = new stdclass();
$usermodified->id = $discussion->usermodified;
$usermodified = username_load_fields_from_object($usermodified, $discussion, 'um', $picturefields);
// Preserve the id (it can be overwritten due to the prefixed $picturefields).
$usermodified->id = $discussion->usermodified;
$discussion->usermodifiedfullname = fullname($usermodified, $canviewfullname);
$userpicture = new user_picture($usermodified);
$userpicture->size = 1; // Size f1.
$discussion->usermodifiedpictureurl = $userpicture->get_url($PAGE)->out(false);
}
$discussions[] = $discussion;
}
}
$result = array();
$result['discussions'] = $discussions;
$result['warnings'] = $warnings;
return $result;
}
/**
* Describes the get_forum_discussions_paginated return value.
*
* @deprecated since 3.7
* @return external_single_structure
* @since Moodle 2.8
*/
public static function get_forum_discussions_paginated_returns() {
return new external_single_structure(
array(
'discussions' => new external_multiple_structure(
new external_single_structure(
array(
'id' => new external_value(PARAM_INT, 'Post id'),
'name' => new external_value(PARAM_RAW, 'Discussion name'),
'groupid' => new external_value(PARAM_INT, 'Group id'),
'timemodified' => new external_value(PARAM_INT, 'Time modified'),
'usermodified' => new external_value(PARAM_INT, 'The id of the user who last modified'),
'timestart' => new external_value(PARAM_INT, 'Time discussion can start'),
'timeend' => new external_value(PARAM_INT, 'Time discussion ends'),
'discussion' => new external_value(PARAM_INT, 'Discussion id'),
'parent' => new external_value(PARAM_INT, 'Parent id'),
'userid' => new external_value(PARAM_INT, 'User who started the discussion id'),
'created' => new external_value(PARAM_INT, 'Creation time'),
'modified' => new external_value(PARAM_INT, 'Time modified'),
'mailed' => new external_value(PARAM_INT, 'Mailed?'),
'subject' => new external_value(PARAM_RAW, 'The post subject'),
'message' => new external_value(PARAM_RAW, 'The post message'),
'messageformat' => new external_format_value('message'),
'messagetrust' => new external_value(PARAM_INT, 'Can we trust?'),
'messageinlinefiles' => new external_files('post message inline files', VALUE_OPTIONAL),
'attachment' => new external_value(PARAM_RAW, 'Has attachments?'),
'attachments' => new external_files('attachments', VALUE_OPTIONAL),
'totalscore' => new external_value(PARAM_INT, 'The post message total score'),
'mailnow' => new external_value(PARAM_INT, 'Mail now?'),
'userfullname' => new external_value(PARAM_TEXT, 'Post author full name'),
'usermodifiedfullname' => new external_value(PARAM_TEXT, 'Post modifier full name'),
'userpictureurl' => new external_value(PARAM_URL, 'Post author picture.'),
'usermodifiedpictureurl' => new external_value(PARAM_URL, 'Post modifier picture.'),
'numreplies' => new external_value(PARAM_INT, 'The number of replies in the discussion'),
'numunread' => new external_value(PARAM_INT, 'The number of unread discussions.'),
'pinned' => new external_value(PARAM_BOOL, 'Is the discussion pinned'),
'locked' => new external_value(PARAM_BOOL, 'Is the discussion locked'),
'canreply' => new external_value(PARAM_BOOL, 'Can the user reply to the discussion'),
'canlock' => new external_value(PARAM_BOOL, 'Can the user lock the discussion'),
), 'post'
)
),
'warnings' => new external_warnings()
)
);
}
/**
* Describes the parameters for get_forum_discussions.
*
+14 -216
View File
@@ -881,208 +881,6 @@ class externallib_test extends externallib_advanced_testcase {
$this->assertEquals(3, count($posts['posts']));
}
/**
* Test get forum discussions paginated
*/
public function test_mod_forum_get_forum_discussions_paginated() {
global $USER, $CFG, $DB, $PAGE;
$this->resetAfterTest(true);
// Set the CFG variable to allow track forums.
$CFG->forum_trackreadposts = true;
// Create a user who can track forums.
$record = new \stdClass();
$record->trackforums = true;
$user1 = self::getDataGenerator()->create_user($record);
// Create a bunch of other users to post.
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();
$user4 = self::getDataGenerator()->create_user();
// Set the first created user to the test user.
self::setUser($user1);
// Create courses to add the modules.
$course1 = self::getDataGenerator()->create_course();
// First forum with tracking off.
$record = new \stdClass();
$record->course = $course1->id;
$record->trackingtype = FORUM_TRACKING_OFF;
$forum1 = self::getDataGenerator()->create_module('forum', $record);
// Add discussions to the forums.
$record = new \stdClass();
$record->course = $course1->id;
$record->userid = $user1->id;
$record->forum = $forum1->id;
$discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
// Add three replies to the discussion 1 from different users.
$record = new \stdClass();
$record->discussion = $discussion1->id;
$record->parent = $discussion1->firstpost;
$record->userid = $user2->id;
$discussion1reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
$record->parent = $discussion1reply1->id;
$record->userid = $user3->id;
$discussion1reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
$record->userid = $user4->id;
$discussion1reply3 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
// Enrol the user in the first course.
$enrol = enrol_get_plugin('manual');
// We don't use the dataGenerator as we need to get the $instance2 to unenrol later.
$enrolinstances = enrol_get_instances($course1->id, true);
foreach ($enrolinstances as $courseenrolinstance) {
if ($courseenrolinstance->enrol == "manual") {
$instance1 = $courseenrolinstance;
break;
}
}
$enrol->enrol_user($instance1, $user1->id);
// Delete one user.
delete_user($user4);
// Assign capabilities to view discussions for forum 1.
$cm = get_coursemodule_from_id('forum', $forum1->cmid, 0, false, MUST_EXIST);
$context = \context_module::instance($cm->id);
$newrole = create_role('Role 2', 'role2', 'Role 2 description');
$this->assignUserCapability('mod/forum:viewdiscussion', $context->id, $newrole);
// Create what we expect to be returned when querying the forums.
$post1 = $DB->get_record('forum_posts', array('id' => $discussion1->firstpost), '*', MUST_EXIST);
// User pictures are initially empty, we should get the links once the external function is called.
$expecteddiscussions = array(
'id' => $discussion1->firstpost,
'name' => $discussion1->name,
'groupid' => (int) $discussion1->groupid,
'timemodified' => $discussion1reply3->created,
'usermodified' => (int) $discussion1reply3->userid,
'timestart' => (int) $discussion1->timestart,
'timeend' => (int) $discussion1->timeend,
'discussion' => $discussion1->id,
'parent' => 0,
'userid' => (int) $discussion1->userid,
'created' => (int) $post1->created,
'modified' => (int) $post1->modified,
'mailed' => (int) $post1->mailed,
'subject' => $post1->subject,
'message' => $post1->message,
'messageformat' => (int) $post1->messageformat,
'messagetrust' => (int) $post1->messagetrust,
'attachment' => $post1->attachment,
'totalscore' => (int) $post1->totalscore,
'mailnow' => (int) $post1->mailnow,
'userfullname' => fullname($user1),
'usermodifiedfullname' => fullname($user4),
'userpictureurl' => '',
'usermodifiedpictureurl' => '',
'numreplies' => 3,
'numunread' => 0,
'pinned' => (bool) FORUM_DISCUSSION_UNPINNED,
'locked' => false,
'canreply' => false,
'canlock' => false
);
// Call the external function passing forum id.
$discussions = mod_forum_external::get_forum_discussions_paginated($forum1->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$expectedreturn = array(
'discussions' => array($expecteddiscussions),
'warnings' => array()
);
// Wait the theme to be loaded (the external_api call does that) to generate the user profiles.
$userpicture = new \user_picture($user1);
$userpicture->size = 1; // Size f1.
$expectedreturn['discussions'][0]['userpictureurl'] = $userpicture->get_url($PAGE)->out(false);
$userpicture = new \user_picture($user4);
$userpicture->size = 1; // Size f1.
$expectedreturn['discussions'][0]['usermodifiedpictureurl'] = $userpicture->get_url($PAGE)->out(false);
$this->assertEquals($expectedreturn, $discussions);
// Call without required view discussion capability.
$this->unassignUserCapability('mod/forum:viewdiscussion', $context->id, $newrole);
try {
mod_forum_external::get_forum_discussions_paginated($forum1->id);
$this->fail('Exception expected due to missing capability.');
} catch (\moodle_exception $e) {
$this->assertEquals('noviewdiscussionspermission', $e->errorcode);
}
// Unenrol user from second course.
$enrol->unenrol_user($instance1, $user1->id);
// Call for the second course we unenrolled the user from, make sure exception thrown.
try {
mod_forum_external::get_forum_discussions_paginated($forum1->id);
$this->fail('Exception expected due to being unenrolled from the course.');
} catch (\moodle_exception $e) {
$this->assertEquals('requireloginerror', $e->errorcode);
}
$this->setAdminUser();
$discussions = mod_forum_external::get_forum_discussions_paginated($forum1->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$this->assertTrue($discussions['discussions'][0]['canlock']);
}
/**
* Test get forum discussions paginated (qanda forums)
*/
public function test_mod_forum_get_forum_discussions_paginated_qanda() {
$this->resetAfterTest(true);
// Create courses to add the modules.
$course = self::getDataGenerator()->create_course();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
// First forum with tracking off.
$record = new \stdClass();
$record->course = $course->id;
$record->type = 'qanda';
$forum = self::getDataGenerator()->create_module('forum', $record);
// Add discussions to the forums.
$discussionrecord = new \stdClass();
$discussionrecord->course = $course->id;
$discussionrecord->userid = $user2->id;
$discussionrecord->forum = $forum->id;
$discussion = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($discussionrecord);
self::setAdminUser();
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$this->assertCount(1, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
self::setUser($user1);
$this->getDataGenerator()->enrol_user($user1->id, $course->id);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$this->assertCount(1, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
}
/**
* Test get forum discussions
*/
@@ -1716,8 +1514,8 @@ class externallib_test extends externallib_advanced_testcase {
$createddiscussion = mod_forum_external::add_discussion($forum->id, 'the subject', 'some text here...');
$createddiscussion = external_api::clean_returnvalue(mod_forum_external::add_discussion_returns(), $createddiscussion);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(1, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
@@ -1731,8 +1529,8 @@ class externallib_test extends externallib_advanced_testcase {
array('options' => array('name' => 'discussionpinned',
'value' => true)));
$discussion3 = mod_forum_external::add_discussion($forum->id, 'the non pinnedsubject', 'some 3 text here...');
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(3, $discussions['discussions']);
$this->assertEquals($discussion2pinned['discussionid'], $discussions['discussions'][0]['discussion']);
@@ -1776,8 +1574,8 @@ class externallib_test extends externallib_advanced_testcase {
$dummytext, -1, $options);
$createddiscussion = external_api::clean_returnvalue(mod_forum_external::add_discussion_returns(), $createddiscussion);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(4, $discussions['discussions']);
$this->assertCount(0, $createddiscussion['warnings']);
@@ -1860,8 +1658,8 @@ class externallib_test extends externallib_advanced_testcase {
$discussion = mod_forum_external::add_discussion($forum->id, 'the subject', 'some text here...', $group->id);
$discussion = external_api::clean_returnvalue(mod_forum_external::add_discussion_returns(), $discussion);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(1, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
@@ -1872,8 +1670,8 @@ class externallib_test extends externallib_advanced_testcase {
$discussion = mod_forum_external::add_discussion($forum->id, 'the subject', 'some text here...');
$discussion = external_api::clean_returnvalue(mod_forum_external::add_discussion_returns(), $discussion);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(2, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
@@ -1888,8 +1686,8 @@ class externallib_test extends externallib_advanced_testcase {
$discussion = mod_forum_external::add_discussion($forum->id, 'the subject', 'some text here...');
$discussion = external_api::clean_returnvalue(mod_forum_external::add_discussion_returns(), $discussion);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(3, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
@@ -2323,8 +2121,8 @@ class externallib_test extends externallib_advanced_testcase {
$discussionrecord->messagetrust = trusttext_trusted($context);
$discussion2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($discussionrecord);
$discussions = mod_forum_external::get_forum_discussions_paginated($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions);
$discussions = mod_forum_external::get_forum_discussions($forum->id);
$discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions);
$this->assertCount(2, $discussions['discussions']);
$this->assertCount(0, $discussions['warnings']);
+4
View File
@@ -1,6 +1,10 @@
This files describes API changes in /mod/forum/*,
information provided here is intended especially for developers.
=== 4.4 ===
* The mod_forum_get_forum_discussions_paginated web service has been removed from core.
=== 4.3 ===
* The forum_print_discussion_header function has been deprecated and will not be replaced.