Merge branch 'MDL-49453-master' of git://github.com/jleyva/moodle

Conflicts:
	lib/db/services.php
This commit is contained in:
David Monllao 2015-04-01 11:59:33 +08:00
commit 7c5dbf0396
6 changed files with 132 additions and 9 deletions

View File

@ -2046,6 +2046,70 @@ class core_course_external extends external_api {
public static function delete_modules_returns() {
return null;
}
/**
* Returns description of method parameters
*
* @return external_function_parameters
* @since Moodle 2.9
*/
public static function view_course_parameters() {
return new external_function_parameters(
array(
'courseid' => new external_value(PARAM_INT, 'id of the course'),
'sectionnumber' => new external_value(PARAM_INT, 'section number', VALUE_DEFAULT, 0)
)
);
}
/**
* Simulate the view.php web interface page, logging events, completion, etc...
*
* @param int $courseid id of course
* @param int $sectionnumber sectionnumber (0, 1, 2...)
* @return array of warnings and status result
* @since Moodle 2.9
* @throws moodle_exception
*/
public static function view_course($courseid, $sectionnumber = 0) {
global $CFG;
require_once($CFG->dirroot . "/course/lib.php");
$params = self::validate_parameters(self::view_course_parameters(),
array(
'courseid' => $courseid,
'sectionnumber' => $sectionnumber
));
$warnings = array();
$course = get_course($params['courseid']);
$context = context_course::instance($course->id);
self::validate_context($context);
course_view($context, $params['sectionnumber']);
$result = array();
$result['status'] = true;
$result['warnings'] = $warnings;
return $result;
}
/**
* Returns description of method result value
*
* @return external_description
* @since Moodle 2.9
*/
public static function view_course_returns() {
return new external_single_structure(
array(
'status' => new external_value(PARAM_BOOL, 'status: true if success'),
'warnings' => new external_warnings()
)
);
}
}
/**

View File

@ -3756,3 +3756,23 @@ function course_change_sortorder_after_course($courseorid, $moveaftercourseid) {
cache_helper::purge_by_event('changesincourse');
return true;
}
/**
* Trigger course viewed event. This API function is used when course view actions happens,
* usually in course/view.php but also in external functions.
*
* @param stdClass $context course context object
* @param int $sectionnumber section number
* @since Moodle 2.9
*/
function course_view($context, $sectionnumber = 0) {
$eventdata = array('context' => $context);
if (!empty($sectionnumber)) {
$eventdata['other']['coursesectionnumber'] = $sectionnumber;
}
$event = \core\event\course_viewed::create($eventdata);
$event->trigger();
}

View File

@ -1386,4 +1386,39 @@ class core_course_externallib_testcase extends externallib_advanced_testcase {
// Import from course1 to course2, with invalid option
core_course_external::import_course($course1->id, $course2->id, -1);;
}
/**
* Test view_course function
*/
public function test_view_course() {
$this->resetAfterTest();
// Course without sections.
$course = $this->getDataGenerator()->create_course(array('numsections' => 5), array('createsections' => true));
$this->setAdminUser();
// Redirect events to the sink, so we can recover them later.
$sink = $this->redirectEvents();
core_course_external::view_course($course->id, 1);
$events = $sink->get_events();
$event = reset($events);
// Check the event details are correct.
$this->assertInstanceOf('\core\event\course_viewed', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEquals(1, $event->other['coursesectionnumber']);
core_course_external::view_course($course->id);
$events = $sink->get_events();
$event = array_pop($events);
$sink->close();
// Check the event details are correct.
$this->assertInstanceOf('\core\event\course_viewed', $event);
$this->assertEquals(context_course::instance($course->id), $event->get_context());
$this->assertEmpty($event->other);
}
}

View File

@ -285,12 +285,7 @@
// Trigger course viewed event.
// We don't trust $context here. Course format inclusion above executes in the global space. We can't assume
// anything after that point.
$eventdata = array('context' => context_course::instance($course->id));
if (!empty($section) && (int)$section == $section) {
$eventdata['other'] = array('coursesectionnumber' => $section);
}
$event = \core\event\course_viewed::create($eventdata);
$event->trigger();
course_view(context_course::instance($course->id), $section);
// Include course AJAX
include_course_ajax($course, $modnamesused);

View File

@ -78,9 +78,8 @@ if (get_home_page() != HOMEPAGE_SITE) {
}
}
$eventparams = array('context' => context_course::instance(SITEID));
$event = \core\event\course_viewed::create($eventparams);
$event->trigger();
// Trigger event.
course_view(context_course::instance(SITEID));
// If the hub plugin is installed then we let it take over the homepage here.
if (file_exists($CFG->dirroot.'/local/hub/lib.php') and get_config('local_hub', 'hubenabled')) {

View File

@ -670,6 +670,15 @@ $functions = array(
'capabilities'=> 'moodle/course:update,moodle/course:changecategory,moodle/course:changefullname,moodle/course:changeshortname,moodle/course:changeidnumber,moodle/course:changesummary,moodle/course:visibility',
),
'core_course_view_course' => array(
'classname' => 'core_course_external',
'methodname' => 'view_course',
'classpath' => 'course/externallib.php',
'description' => 'Log that the course was viewed',
'type' => 'write'
),
// === course category related functions ===
'core_course_get_categories' => array(
@ -1036,6 +1045,7 @@ $services = array(
'mod_data_get_databases_by_courses',
'core_comment_get_comments',
'mod_forum_view_forum',
'core_course_view_course',
),
'enabled' => 0,
'restrictedusers' => 0,