diff --git a/admin/tool/messageinbound/classes/manager.php b/admin/tool/messageinbound/classes/manager.php index a352f7c618d..254f7a8cb9d 100644 --- a/admin/tool/messageinbound/classes/manager.php +++ b/admin/tool/messageinbound/classes/manager.php @@ -920,7 +920,7 @@ class manager { $addressmanager->set_handler('\tool_messageinbound\message\inbound\invalid_recipient_handler'); $addressmanager->set_data($record->id); - $eventdata = new \stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'tool_messageinbound'; $eventdata->name = 'invalidrecipienthandler'; @@ -970,7 +970,7 @@ class manager { $messagedata->subject = $this->currentmessagedata->envelope->subject; $messagedata->error = $error; - $eventdata = new \stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'tool_messageinbound'; $eventdata->name = 'messageprocessingerror'; $eventdata->userfrom = $userfrom; @@ -1029,7 +1029,7 @@ class manager { $messagedata = new \stdClass(); $messagedata->subject = $this->currentmessagedata->envelope->subject; - $eventdata = new \stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'tool_messageinbound'; $eventdata->name = 'messageprocessingsuccess'; $eventdata->userfrom = $userfrom; diff --git a/admin/tool/monitor/classes/notification_task.php b/admin/tool/monitor/classes/notification_task.php index 6e36841a2de..05b266ea70f 100644 --- a/admin/tool/monitor/classes/notification_task.php +++ b/admin/tool/monitor/classes/notification_task.php @@ -83,7 +83,7 @@ class notification_task extends \core\task\adhoc_task { $template = $subscription->template; $template = $this->replace_placeholders($template, $subscription, $eventobj, $context); $htmlmessage = format_text($template, $subscription->templateformat, array('context' => $context)); - $msgdata = new \stdClass(); + $msgdata = new \core\message\message(); $msgdata->component = 'tool_monitor'; // Your component name. $msgdata->name = 'notification'; // This is the message name from messages.php. $msgdata->userfrom = \core_user::get_noreply_user(); diff --git a/backup/util/helper/backup_cron_helper.class.php b/backup/util/helper/backup_cron_helper.class.php index 8b6eeb88f20..30bd327bdf5 100644 --- a/backup/util/helper/backup_cron_helper.class.php +++ b/backup/util/helper/backup_cron_helper.class.php @@ -264,7 +264,7 @@ abstract class backup_cron_automated_helper { $subject = $prefix.get_string('automatedbackupstatus', 'backup'); //Send the message - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->userfrom = $admin; $eventdata->userto = $admin; diff --git a/badges/cron.php b/badges/cron.php index a0bee0f93f8..32a235d5659 100644 --- a/badges/cron.php +++ b/badges/cron.php @@ -140,7 +140,7 @@ function badge_assemble_notification(stdClass $badge) { } // Create a message object. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'moodle'; $eventdata->name = 'badgecreatornotice'; $eventdata->userfrom = $userfrom; diff --git a/competency/lib.php b/competency/lib.php index e9007747fab..7472db1dc27 100644 --- a/competency/lib.php +++ b/competency/lib.php @@ -116,6 +116,7 @@ function core_competency_comment_add($comment, $params) { } $message = new \core\message\message(); + $message->courseid = SITEID; $message->component = 'moodle'; $message->name = 'competencyusercompcomment'; $message->notification = 1; @@ -184,6 +185,7 @@ function core_competency_comment_add($comment, $params) { } $message = new \core\message\message(); + $message->courseid = SITEID; $message->component = 'moodle'; $message->name = 'competencyplancomment'; $message->notification = 1; diff --git a/course/lib.php b/course/lib.php index b884fc39a07..76d8c877a86 100644 --- a/course/lib.php +++ b/course/lib.php @@ -2674,7 +2674,7 @@ class course_request { * @param string $message */ protected function notify($touser, $fromuser, $name='courserequested', $subject, $message) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'moodle'; $eventdata->name = $name; $eventdata->userfrom = $fromuser; diff --git a/enrol/flatfile/lib.php b/enrol/flatfile/lib.php index 57438fb2378..cee8a492029 100644 --- a/enrol/flatfile/lib.php +++ b/enrol/flatfile/lib.php @@ -186,7 +186,7 @@ class enrol_flatfile_plugin extends enrol_plugin { if ($processed and $mailadmins) { if ($log = $buffer->get_buffer()) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_flatfile'; $eventdata->name = 'flatfile_enrolment'; @@ -340,7 +340,7 @@ class enrol_flatfile_plugin extends enrol_plugin { } if (!unlink($filelocation)) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_flatfile'; $eventdata->name = 'flatfile_enrolment'; @@ -463,7 +463,7 @@ class enrol_flatfile_plugin extends enrol_plugin { $a->profileurl = "$CFG->wwwroot/user/view.php?id=$user->id&course=$course->id"; $subject = get_string('enrolmentnew', 'enrol', format_string($course->shortname, true, array('context' => $context))); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_flatfile'; $eventdata->name = 'flatfile_enrolment'; @@ -494,7 +494,7 @@ class enrol_flatfile_plugin extends enrol_plugin { $a->user = fullname($user); $subject = get_string('enrolmentnew', 'enrol', format_string($course->shortname, true, array('context' => $context))); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_flatfile'; $eventdata->name = 'flatfile_enrolment'; diff --git a/enrol/imsenterprise/lib.php b/enrol/imsenterprise/lib.php index ede27007752..79bf25b8bab 100644 --- a/enrol/imsenterprise/lib.php +++ b/enrol/imsenterprise/lib.php @@ -222,7 +222,7 @@ class enrol_imsenterprise_plugin extends enrol_plugin { $msg .= "Logging is currently not active."; } - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_imsenterprise'; $eventdata->name = 'imsenterprise_enrolment'; diff --git a/enrol/paypal/ipn.php b/enrol/paypal/ipn.php index 809cdb75d2c..209db053afb 100644 --- a/enrol/paypal/ipn.php +++ b/enrol/paypal/ipn.php @@ -152,7 +152,7 @@ if (strlen($result) > 0) { // Email user to let them know. Email admin. if ($data->payment_status == "Pending" and $data->pending_reason != "echeck") { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_paypal'; $eventdata->name = 'paypal_enrolment'; @@ -259,7 +259,7 @@ if (strlen($result) > 0) { $a->coursename = format_string($course->fullname, true, array('context' => $coursecontext)); $a->profileurl = "$CFG->wwwroot/user/view.php?id=$user->id"; - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_paypal'; $eventdata->name = 'paypal_enrolment'; @@ -278,7 +278,7 @@ if (strlen($result) > 0) { $a->course = format_string($course->fullname, true, array('context' => $coursecontext)); $a->user = fullname($user); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_paypal'; $eventdata->name = 'paypal_enrolment'; @@ -297,7 +297,7 @@ if (strlen($result) > 0) { $a->user = fullname($user); $admins = get_admins(); foreach ($admins as $admin) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_paypal'; $eventdata->name = 'paypal_enrolment'; @@ -320,3 +320,49 @@ if (strlen($result) > 0) { exit; + +//--- HELPER FUNCTIONS -------------------------------------------------------------------------------------- + + +function message_paypal_error_to_admin($subject, $data) { + echo $subject; + $admin = get_admin(); + $site = get_site(); + + $message = "$site->fullname: Transaction failed.\n\n$subject\n\n"; + + foreach ($data as $key => $value) { + $message .= "$key => $value\n"; + } + + $eventdata = new \core\message\message(); + $eventdata->modulename = 'moodle'; + $eventdata->component = 'enrol_paypal'; + $eventdata->name = 'paypal_enrolment'; + $eventdata->userfrom = $admin; + $eventdata->userto = $admin; + $eventdata->subject = "PAYPAL ERROR: ".$subject; + $eventdata->fullmessage = $message; + $eventdata->fullmessageformat = FORMAT_PLAIN; + $eventdata->fullmessagehtml = ''; + $eventdata->smallmessage = ''; + message_send($eventdata); +} + +/** + * Silent exception handler. + * + * @param Exception $ex + * @return void - does not return. Terminates execution! + */ +function enrol_paypal_ipn_exception_handler($ex) { + $info = get_exception_info($ex); + + $logerrmsg = "enrol_paypal IPN exception handler: ".$info->message; + if (debugging('', DEBUG_NORMAL)) { + $logerrmsg .= ' Debug: '.$info->debuginfo."\n".format_backtrace($info->backtrace, true); + } + error_log($logerrmsg); + + exit(0); +} diff --git a/lib/badgeslib.php b/lib/badgeslib.php index d77d739cc30..9724bf79f60 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -722,7 +722,8 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash $plaintext = html_to_text($message); // Notify recipient. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $badge->courseid; $eventdata->component = 'moodle'; $eventdata->name = 'badgerecipientnotice'; $eventdata->userfrom = $userfrom; @@ -758,7 +759,8 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash $creatormessage = get_string('creatorbody', 'badges', $a); $creatorsubject = get_string('creatorsubject', 'badges', $badge->name); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $badge->courseid; $eventdata->component = 'moodle'; $eventdata->name = 'badgecreatornotice'; $eventdata->userfrom = $userfrom; diff --git a/lib/classes/antivirus/scanner.php b/lib/classes/antivirus/scanner.php index 5f4186c5813..d8d0884f7d9 100644 --- a/lib/classes/antivirus/scanner.php +++ b/lib/classes/antivirus/scanner.php @@ -122,7 +122,7 @@ abstract class scanner { $subject = get_string('emailsubject', 'antivirus', format_string($site->fullname)); $admins = get_admins(); foreach ($admins as $admin) { - $eventdata = new \stdClass(); + $eventdata = new \core\message\message(); $eventdata->component = 'moodle'; $eventdata->name = 'errors'; $eventdata->userfrom = get_admin(); diff --git a/lib/classes/event/message_sent.php b/lib/classes/event/message_sent.php index 0d58ddbea56..0ea9a15f097 100644 --- a/lib/classes/event/message_sent.php +++ b/lib/classes/event/message_sent.php @@ -33,6 +33,7 @@ defined('MOODLE_INTERNAL') || die(); * Extra information about event. * * - int messageid: the id of the message. + * - int courseid: the id of the related course. * } * * @package core @@ -46,9 +47,10 @@ class message_sent extends base { * @param int $userfromid * @param int $usertoid * @param int $messageid + * @param int|null $courseid * @return message_sent */ - public static function create_from_ids($userfromid, $usertoid, $messageid) { + public static function create_from_ids($userfromid, $usertoid, $messageid, $courseid = null) { // We may be sending a message from the 'noreply' address, which means we are not actually sending a // message from a valid user. In this case, we will set the userid to 0. // Check if the userid is valid. @@ -56,6 +58,10 @@ class message_sent extends base { $userfromid = 0; } + if (is_null($courseid)) { + $courseid = SITEID; + } + $event = self::create(array( 'userid' => $userfromid, 'context' => \context_system::instance(), @@ -64,7 +70,8 @@ class message_sent extends base { // In earlier versions it can either be the id in the 'message_read' or 'message' table. // Now it is always the id from 'message' table. Please note that the record is still moved // to the 'message_read' table later when message marked as read. - 'messageid' => $messageid + 'messageid' => $messageid, + 'courseid' => $courseid ) )); @@ -143,6 +150,10 @@ class message_sent extends base { if (!isset($this->other['messageid'])) { throw new \coding_exception('The \'messageid\' value must be set in other.'); } + + if (!isset($this->other['courseid'])) { + debugging('The \'courseid\' value must be set in other.', DEBUG_DEVELOPER); + } } public static function get_objectid_mapping() { @@ -155,6 +166,7 @@ class message_sent extends base { $othermapped = array(); // The messages table could vary for older events - so cannot be mapped. $othermapped['messageid'] = array('db' => base::NOT_MAPPED, 'restore' => base::NOT_MAPPED); + $othermapped['courseid'] = array('db' => base::NOT_MAPPED, 'restore' => base::NOT_MAPPED); return $othermapped; } } diff --git a/lib/classes/message/manager.php b/lib/classes/message/manager.php index 234cc93ab51..4650fa2b686 100644 --- a/lib/classes/message/manager.php +++ b/lib/classes/message/manager.php @@ -50,7 +50,7 @@ class manager { * * NOTE: to be used from message_send() only. * - * @param \stdClass|\core\message\message $eventdata fully prepared event data for processors + * @param \core\message\message $eventdata fully prepared event data for processors * @param \stdClass $savemessage the message saved in 'message' table * @param array $processorlist list of processors for target user * @return int $messageid the id from 'message' or 'message_read' table (false is not returned) @@ -63,11 +63,24 @@ class manager { throw new \coding_exception('Message should be of type stdClass or \core\message\message'); } + if ($eventdata instanceof \stdClass) { + if (!isset($eventdata->courseid)) { + $eventdata->courseid = null; + } + + debugging('eventdata as \stdClass is deprecated. Please use core\message\message instead.', DEBUG_DEVELOPER); + } + require_once($CFG->dirroot.'/message/lib.php'); // This is most probably already included from messagelib.php file. if (empty($processorlist)) { // Trigger event for sending a message - we need to do this before marking as read! - \core\event\message_sent::create_from_ids($eventdata->userfrom->id, $eventdata->userto->id, $savemessage->id)->trigger(); + \core\event\message_sent::create_from_ids( + $eventdata->userfrom->id, + $eventdata->userto->id, + $savemessage->id, + $eventdata->courseid + )->trigger(); if ($savemessage->notification or empty($CFG->messaging)) { // If they have deselected all processors and its a notification mark it read. The user doesn't want to be bothered. @@ -132,7 +145,12 @@ class manager { } // Trigger event for sending a message - must be done before marking as read. - \core\event\message_sent::create_from_ids($eventdata->userfrom->id, $eventdata->userto->id, $savemessage->id)->trigger(); + \core\event\message_sent::create_from_ids( + $eventdata->userfrom->id, + $eventdata->userto->id, + $savemessage->id, + $eventdata->courseid + )->trigger(); if (empty($CFG->messaging)) { // If messaging is disabled and they previously had forum notifications handled by the popup processor diff --git a/lib/classes/message/message.php b/lib/classes/message/message.php index f75cce9332f..107335d74d1 100644 --- a/lib/classes/message/message.php +++ b/lib/classes/message/message.php @@ -56,6 +56,12 @@ defined('MOODLE_INTERNAL') || die(); * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class message { + /** @var int Course id. */ + private $courseid; + + /** @var string Module name. */ + private $modulename; + /** @var string Component name. */ private $component; @@ -104,10 +110,31 @@ class message { /** @var string Name of the attachment. Note:- not all processors support this.*/ private $attachname; + /** @var int The time the message was created.*/ + private $timecreated; + /** @var array a list of properties that is allowed for each message. */ - private $properties = array('component', 'name', 'userfrom', 'userto', 'subject', 'fullmessage', 'fullmessageformat', - 'fullmessagehtml', 'smallmessage', 'notification', 'contexturl', 'contexturlname', 'savedmessageid', - 'replyto', 'attachment', 'attachname'); + private $properties = array( + 'courseid', + 'modulename', + 'component', + 'name', + 'userfrom', + 'userto', + 'subject', + 'fullmessage', + 'fullmessageformat', + 'fullmessagehtml', + 'smallmessage', + 'notification', + 'contexturl', + 'contexturlname', + 'replyto', + 'savedmessageid', + 'attachment', + 'attachname', + 'timecreated' + ); /** @var array property to store any additional message processor specific content */ private $additionalcontent = array(); diff --git a/lib/classes/update/checker.php b/lib/classes/update/checker.php index b5c701a32a9..46563e20d72 100644 --- a/lib/classes/update/checker.php +++ b/lib/classes/update/checker.php @@ -798,7 +798,7 @@ class checker { array('style' => 'font-size:smaller; color:#333;'))); foreach ($admins as $admin) { - $message = new \stdClass(); + $message = new \core\message\message(); $message->component = 'moodle'; $message->name = 'availableupdate'; $message->userfrom = get_admin(); diff --git a/lib/enrollib.php b/lib/enrollib.php index 6ef9c71e813..561963ff4c1 100644 --- a/lib/enrollib.php +++ b/lib/enrollib.php @@ -2655,7 +2655,7 @@ abstract class enrol_plugin { $subject = get_string('expirymessageenrolledsubject', 'enrol_'.$name, $a); $body = get_string('expirymessageenrolledbody', 'enrol_'.$name, $a); - $message = new stdClass(); + $message = new \core\message\message(); $message->notification = 1; $message->component = 'enrol_'.$name; $message->name = 'expiry_notification'; @@ -2716,7 +2716,7 @@ abstract class enrol_plugin { $subject = get_string('expirymessageenrollersubject', 'enrol_'.$name, $a); $body = get_string('expirymessageenrollerbody', 'enrol_'.$name, $a); - $message = new stdClass(); + $message = new \core\message\message(); $message->notification = 1; $message->component = 'enrol_'.$name; $message->name = 'expiry_notification'; diff --git a/lib/messagelib.php b/lib/messagelib.php index 3c3a5293fcb..a9d4908ac10 100644 --- a/lib/messagelib.php +++ b/lib/messagelib.php @@ -51,12 +51,20 @@ require_once(__DIR__ . '/../message/lib.php'); * earlier versions did not do it consistently either. * * @category message - * @param stdClass|\core\message\message $eventdata information about the message (component, userfrom, userto, ...) + * @param \core\message\message $eventdata information about the message (component, userfrom, userto, ...) * @return mixed the integer ID of the new message or false if there was a problem with submitted data */ function message_send($eventdata) { global $CFG, $DB; + if ($eventdata instanceof \stdClass) { + if (!isset($eventdata->courseid)) { + $eventdata->courseid = null; + } + + debugging('eventdata as \stdClass is deprecated. Please use core\message\message instead.', DEBUG_DEVELOPER); + } + //new message ID to return $messageid = false; @@ -119,6 +127,7 @@ function message_send($eventdata) { // Create the message object $savemessage = new stdClass(); + $savemessage->courseid = $eventdata->courseid; $savemessage->useridfrom = $eventdata->userfrom->id; $savemessage->useridto = $eventdata->userto->id; $savemessage->subject = $eventdata->subject; diff --git a/lib/phpunit/tests/advanced_test.php b/lib/phpunit/tests/advanced_test.php index 344a5bd2307..e3dc965879a 100644 --- a/lib/phpunit/tests/advanced_test.php +++ b/lib/phpunit/tests/advanced_test.php @@ -424,7 +424,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase { $user2 = $this->getDataGenerator()->create_user(); // Any core message will do here. - $message1 = new stdClass(); + $message1 = new \core\message\message(); + $message1->courseid = 1; $message1->component = 'moodle'; $message1->name = 'instantmessage'; $message1->userfrom = $user1; @@ -436,7 +437,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase { $message1->smallmessage = 'small message'; $message1->notification = 0; - $message2 = new stdClass(); + $message2 = new \core\message\message(); + $message2->courseid = 1; $message2->component = 'moodle'; $message2->name = 'instantmessage'; $message2->userfrom = $user2; @@ -501,7 +503,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase { $sink = $this->redirectMessages(); - $message3 = new stdClass(); + $message3 = new \core\message\message(); + $message3->courseid = 1; $message3->component = 'xxxx_yyyyy'; $message3->name = 'instantmessage'; $message3->userfrom = $user2; @@ -547,7 +550,8 @@ class core_phpunit_advanced_testcase extends advanced_testcase { $this->assertTrue(phpunit_util::is_redirecting_messages()); $this->assertEquals(1, $sink->count()); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = get_admin(); diff --git a/lib/portfoliolib.php b/lib/portfoliolib.php index 80335465f29..11188517d5b 100644 --- a/lib/portfoliolib.php +++ b/lib/portfoliolib.php @@ -1109,7 +1109,7 @@ function portfolio_insane_notify_admins($insane, $instances=false) { $smallbody = get_string('insanebodysmall', 'portfolio', $a); foreach ($admins as $admin) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); $eventdata->modulename = 'portfolio'; $eventdata->component = 'portfolio'; $eventdata->name = 'notices'; diff --git a/lib/tests/message_test.php b/lib/tests/message_test.php index 7377f898be8..6cd05d0e121 100644 --- a/lib/tests/message_test.php +++ b/lib/tests/message_test.php @@ -48,6 +48,7 @@ class core_message_testcase extends advanced_testcase { $user = $this->getDataGenerator()->create_user(); $message = new \core\message\message(); + $message->courseid = SITEID; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $USER; @@ -82,6 +83,7 @@ class core_message_testcase extends advanced_testcase { $stdclass = $message->get_eventobject_for_processor('test'); + $this->assertSame($message->courseid, $stdclass->courseid); $this->assertSame($message->component, $stdclass->component); $this->assertSame($message->name, $stdclass->name); $this->assertSame($message->userfrom, $stdclass->userfrom); @@ -143,6 +145,7 @@ class core_message_testcase extends advanced_testcase { // Extra content for all types of messages. $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -171,9 +174,19 @@ class core_message_testcase extends advanced_testcase { $this->assertRegExp('/test message body test/', $email->body); $sink->clear(); + // Test that event fired includes the courseid. + $eventsink = $this->redirectEvents(); + $messageid = message_send($message); + $events = $eventsink->get_events(); + $event = reset($events); + $this->assertEquals($message->courseid, $event->other['courseid']); + $eventsink->clear(); + $sink->clear(); + // Extra content for small message only. Shouldn't show up in emails as we sent fullmessage and fullmessagehtml only in // the emails. $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -199,6 +212,14 @@ class core_message_testcase extends advanced_testcase { $this->assertNotEmpty($email->header); $this->assertNotEmpty($email->body); $this->assertNotRegExp('/test message body test/', $email->body); + + // Test that event fired includes the courseid. + $eventsink = $this->redirectEvents(); + $messageid = message_send($message); + $events = $eventsink->get_events(); + $event = reset($events); + $this->assertEquals($message->courseid, $event->other['courseid']); + $eventsink->close(); $sink->close(); } } diff --git a/lib/tests/messagelib_test.php b/lib/tests/messagelib_test.php index ecc3dc5ab48..c79d3cf303d 100644 --- a/lib/tests/messagelib_test.php +++ b/lib/tests/messagelib_test.php @@ -37,7 +37,8 @@ class core_messagelib_testcase extends advanced_testcase { $preferences = get_message_output_default_preferences(); $this->assertTrue($preferences->$disableprovidersetting == 1); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = get_admin(); @@ -189,7 +190,8 @@ class core_messagelib_testcase extends advanced_testcase { $user2 = $this->getDataGenerator()->create_user(); // Test basic message redirection. - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -225,7 +227,8 @@ class core_messagelib_testcase extends advanced_testcase { $this->assertFalse($DB->record_exists('message', array())); $DB->delete_records('message_read', array()); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1->id; @@ -263,7 +266,8 @@ class core_messagelib_testcase extends advanced_testcase { // Test phpunit problem detection. - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'xxxxx'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -298,7 +302,8 @@ class core_messagelib_testcase extends advanced_testcase { // Invalid users. - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -314,7 +319,8 @@ class core_messagelib_testcase extends advanced_testcase { $this->assertFalse($messageid); $this->assertDebuggingCalled('Attempt to send msg to unknown user'); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = -1; @@ -330,7 +336,8 @@ class core_messagelib_testcase extends advanced_testcase { $this->assertFalse($messageid); $this->assertDebuggingCalled('Attempt to send msg from unknown user'); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -349,7 +356,8 @@ class core_messagelib_testcase extends advanced_testcase { // Some debugging hints for devs. unset($user2->emailstop); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -393,7 +401,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -420,7 +429,8 @@ class core_messagelib_testcase extends advanced_testcase { $CFG->messaging = 0; - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -447,7 +457,8 @@ class core_messagelib_testcase extends advanced_testcase { $CFG->messaging = 1; - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -474,7 +485,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -504,7 +516,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -537,7 +550,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email,popup', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -570,7 +584,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'popup', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -604,7 +619,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -635,7 +651,8 @@ class core_messagelib_testcase extends advanced_testcase { set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -716,7 +733,8 @@ class core_messagelib_testcase extends advanced_testcase { $user1 = $this->getDataGenerator()->create_user(); $user2 = $this->getDataGenerator()->create_user(); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -778,7 +796,8 @@ class core_messagelib_testcase extends advanced_testcase { $user1 = $this->getDataGenerator()->create_user(); $user2 = $this->getDataGenerator()->create_user(); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = $user1; @@ -835,7 +854,8 @@ class core_messagelib_testcase extends advanced_testcase { ); $file = $fs->create_file_from_string($filerecord, 'Test content'); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = 1; $message->component = 'moodle'; $message->name = 'instantmessage'; $message->userfrom = get_admin(); diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 1f659ac3303..f1172b98b59 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -119,6 +119,8 @@ information provided here is intended especially for developers. * Webservice function mod_assign_get_submissions returns a new field 'gradingstatus' from each submission. * The return signature for the antivirus::scan_file() function has changed. The calling function will now handle removal of infected files from Moodle based on the new integer return value. +* The first parameter $eventdata of \core\manager::send_message() should be \core\message. usage of \stdClass is depecated. +* message_sent::create_from_ids has an additional required parameter $courseid with a default value of SITEID. === 3.1 === diff --git a/message/lib.php b/message/lib.php index cda69958ab3..641a14e106b 100644 --- a/message/lib.php +++ b/message/lib.php @@ -830,7 +830,8 @@ function message_format_contexturl($message) { function message_post_message($userfrom, $userto, $message, $format) { global $SITE, $CFG, $USER; - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = 1; $eventdata->component = 'moodle'; $eventdata->name = 'instantmessage'; $eventdata->userfrom = $userfrom; diff --git a/message/tests/events_test.php b/message/tests/events_test.php index 1e3bc9e78c1..a4081a93d8b 100644 --- a/message/tests/events_test.php +++ b/message/tests/events_test.php @@ -201,7 +201,8 @@ class core_message_events_testcase extends advanced_testcase { 'context' => context_system::instance(), 'relateduserid' => 2, 'other' => array( - 'messageid' => 3 + 'messageid' => 3, + 'courseid' => 1 ) )); diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 8c371e06266..9ea5506c78a 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -492,7 +492,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { // We are creating fake notifications but based on real ones. // This one omits notification = 1. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->modulename = 'moodle'; $eventdata->component = 'enrol_paypal'; $eventdata->name = 'paypal_enrolment'; @@ -505,7 +506,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $eventdata->smallmessage = ''; message_send($eventdata); - $message = new stdClass(); + $message = new \core\message\message(); + $message->courseid = $course->id; $message->notification = 1; $message->component = 'enrol_manual'; $message->name = 'expiry_notification'; @@ -522,7 +524,6 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $userfrom = core_user::get_noreply_user(); $userfrom->maildisplay = true; - $eventdata = new stdClass(); $eventdata->component = 'moodle'; $eventdata->name = 'badgecreatornotice'; $eventdata->userfrom = $userfrom; @@ -535,7 +536,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $eventdata->smallmessage = $eventdata->subject; message_send($eventdata); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->name = 'submission'; $eventdata->component = 'mod_feedback'; $eventdata->userfrom = $user1; diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index d8e49ab7ed5..5f07def95d3 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -5475,7 +5475,8 @@ class assign { $assignmentname); } - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->modulename = 'assign'; $eventdata->userfrom = $userfrom; $eventdata->userto = $userto; diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index 6b189d98751..90ce3f27004 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -1246,6 +1246,39 @@ class mod_assign_locallib_testcase extends mod_assign_base_testcase { $this->assertEquals($assign->get_instance()->name, $messages[0]->contexturlname); } + public function test_cron_message_includes_courseid() { + // First run cron so there are no messages waiting to be sent (from other tests). + cron_setup_user(); + assign::cron(); + + // Now create an assignment. + $this->setUser($this->editingteachers[0]); + $assign = $this->create_instance(array('sendstudentnotifications' => 1)); + + // Simulate adding a grade. + $this->setUser($this->teachers[0]); + $data = new stdClass(); + $data->grade = '50.0'; + $assign->testable_apply_grade_to_user($data, $this->students[0]->id, 0); + + $this->preventResetByRollback(); + $sink = $this->redirectEvents(); + + assign::cron(); + + $events = $sink->get_events(); + // Two messages are sent, one to student and one to teacher. This generates + // four events: + // core\event\message_sent + // core\event\message_viewed + // core\event\message_sent + // core\event\message_viewed. + $event = reset($events); + $this->assertInstanceOf('\core\event\message_sent', $event); + $this->assertEquals($assign->get_course()->id, $event->other['courseid']); + $sink->close(); + } + public function test_is_graded() { $this->setUser($this->editingteachers[0]); $assign = $this->create_instance(); diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index 45edfba5698..1422485383a 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -3027,7 +3027,8 @@ function feedback_send_email($cm, $feedback, $course, $user) { } if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->name = 'submission'; $eventdata->component = 'mod_feedback'; $eventdata->userfrom = $user; @@ -3036,10 +3037,14 @@ function feedback_send_email($cm, $feedback, $course, $user) { $eventdata->fullmessage = $posttext; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = $posthtml; - $eventdata->smallmessage = ''; + $eventdata->smallmessage = $postsubject; + $eventdata->courseid = $course->id; + $eventdata->contexturl = $info->url; + $eventdata->contexturlname = $info->feedback; message_send($eventdata); } else { - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->name = 'submission'; $eventdata->component = 'mod_feedback'; $eventdata->userfrom = $teacher; @@ -3048,7 +3053,10 @@ function feedback_send_email($cm, $feedback, $course, $user) { $eventdata->fullmessage = $posttext; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = $posthtml; - $eventdata->smallmessage = ''; + $eventdata->smallmessage = $postsubject; + $eventdata->courseid = $course->id; + $eventdata->contexturl = $info->url; + $eventdata->contexturlname = $info->feedback; message_send($eventdata); } } @@ -3097,7 +3105,8 @@ function feedback_send_email_anonym($cm, $feedback, $course) { $posthtml = ''; } - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->name = 'submission'; $eventdata->component = 'mod_feedback'; $eventdata->userfrom = $teacher; @@ -3106,7 +3115,10 @@ function feedback_send_email_anonym($cm, $feedback, $course) { $eventdata->fullmessage = $posttext; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = $posthtml; - $eventdata->smallmessage = ''; + $eventdata->smallmessage = $postsubject; + $eventdata->courseid = $course->id; + $eventdata->contexturl = $info->url; + $eventdata->contexturlname = $info->feedback; message_send($eventdata); } } diff --git a/mod/feedback/show_nonrespondents.php b/mod/feedback/show_nonrespondents.php index 79844860ef0..d3c87139163 100644 --- a/mod/feedback/show_nonrespondents.php +++ b/mod/feedback/show_nonrespondents.php @@ -97,7 +97,8 @@ if ($action == 'sendmessage' AND has_capability('moodle/course:bulkmessaging', $ if (is_array($messageuser)) { foreach ($messageuser as $userid) { $senduser = $DB->get_record('user', array('id'=>$userid)); - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->name = 'message'; $eventdata->component = 'mod_feedback'; $eventdata->userfrom = $USER; @@ -106,7 +107,10 @@ if ($action == 'sendmessage' AND has_capability('moodle/course:bulkmessaging', $ $eventdata->fullmessage = html_to_text($htmlmessage); $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = $htmlmessage; - $eventdata->smallmessage = ''; + $eventdata->smallmessage = $subject; + $eventdata->courseid = $course->id; + $eventdata->contexturl = $link3; + $eventdata->contexturlname = $feedback->name; $good = $good && message_send($eventdata); } if (!empty($good)) { diff --git a/mod/forum/lib.php b/mod/forum/lib.php index ab4a4aee9f6..623dcb3ab85 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -834,6 +834,7 @@ function forum_cron() { mtrace('Sending ', ''); $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->component = 'mod_forum'; $eventdata->name = 'posts'; $eventdata->userfrom = $userfrom; diff --git a/mod/forum/tests/mail_test.php b/mod/forum/tests/mail_test.php index 4c88100f965..3aa060853bd 100644 --- a/mod/forum/tests/mail_test.php +++ b/mod/forum/tests/mail_test.php @@ -252,6 +252,42 @@ class mod_forum_mail_testcase extends advanced_testcase { return $messages; } + public function test_cron_message_includes_courseid() { + $this->resetAfterTest(true); + + // Create a course, with a forum. + $course = $this->getDataGenerator()->create_course(); + + $options = array('course' => $course->id, 'forcesubscribe' => FORUM_FORCESUBSCRIBE); + $forum = $this->getDataGenerator()->create_module('forum', $options); + + // Create two users enrolled in the course as students. + list($author, $recipient) = $this->helper_create_users($course, 2); + + // Post a discussion to the forum. + list($discussion, $post) = $this->helper_post_to_forum($forum, $author); + + // Run cron and check that \core\event\message_sent contains the course id. + // Close the message sink so that message_send is run. + $this->helper->messagesink->close(); + + // Catch just the cron events. For each message sent two events are fired: + // core\event\message_sent + // core\event\message_viewed. + $this->helper->eventsink = $this->redirectEvents(); + + forum_cron(); + + // Get the events and close the sink so that remaining events can be triggered. + $events = $this->helper->eventsink->get_events(); + $this->helper->eventsink->close(); + + // Reset the message sink for other tests. + $this->helper->messagesink = $this->redirectMessages(); + $event = reset($events); + $this->assertEquals($course->id, $event->other['courseid']); + } + public function test_forced_subscription() { $this->resetAfterTest(true); diff --git a/mod/lesson/essay.php b/mod/lesson/essay.php index ee2fb4c5d2d..4212401ac5c 100644 --- a/mod/lesson/essay.php +++ b/mod/lesson/essay.php @@ -257,13 +257,21 @@ switch ($mode) { $a->lesson = format_string($lesson->name, true); // Fetch message HTML and plain text formats + $b = new stdClass(); + $b->essay = format_string($pages[$attempt->pageid]->title, true); + $b->lesson = $lesson->properties()->name; + $b->course = $course->idnumber ? $course->idnumber : $course->fullname; $message = get_string('essayemailmessage2', 'lesson', $a); $plaintext = format_text_email($message, FORMAT_HTML); // Subject $subject = get_string('essayemailsubject', 'lesson'); - $eventdata = new stdClass(); + // Context url. + $contexturl = new moodle_url('/grade/report/user/index.php', array('id' => $course->id)); + + $eventdata = new \core\message\message(); + $eventdata->courseid = $course->id; $eventdata->modulename = 'lesson'; $eventdata->userfrom = $USER; $eventdata->userto = $users[$attempt->userid]; @@ -271,7 +279,8 @@ switch ($mode) { $eventdata->fullmessage = $plaintext; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = $message; - $eventdata->smallmessage = ''; + $eventdata->smallmessage = $smallmessage; + $eventdata->contexturl = $contexturl; // Required for messaging framework $eventdata->component = 'mod_lesson'; diff --git a/mod/lesson/lang/en/lesson.php b/mod/lesson/lang/en/lesson.php index 4b3cea46fc4..fcbe30afb14 100644 --- a/mod/lesson/lang/en/lesson.php +++ b/mod/lesson/lang/en/lesson.php @@ -178,6 +178,7 @@ $string['eolstudentoutoftime'] = 'Attention: You ran out of time for this lesso $string['eolstudentoutoftimenoanswers'] = 'You did not answer any questions. You have received a 0 for this lesson.'; $string['essay'] = 'Essay'; $string['essayemailmessage2'] = '
Essay prompt: {$a->question}
Your response: {$a->response}
Grader\'s comments: {$a->comment}
You have received {$a->earned} out of {$a->outof} for this essay question.
Your grade for the {$a->lesson} lesson has been changed to {$a->newgrade}%.
'; +$string['essayemailmessage3'] = 'Your submission to {$a->lesson} essay {$a->essay} in {$a->course} has been graded.'; $string['essayemailsubject'] = 'Grade available for lesson question'; $string['essayresponses'] = 'Essay responses'; $string['essays'] = 'Essays'; diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index d6f403317b2..75848947e2e 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -1487,7 +1487,8 @@ function quiz_send_confirmation($recipient, $a) { $a->userusername = $recipient->username; // Prepare the message. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $a->courseid; $eventdata->component = 'mod_quiz'; $eventdata->name = 'confirmation'; $eventdata->notification = 1; @@ -1523,7 +1524,8 @@ function quiz_send_notification($recipient, $submitter, $a) { $a->userusername = $recipient->username; // Prepare the message. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $a->courseid; $eventdata->component = 'mod_quiz'; $eventdata->name = 'submission'; $eventdata->notification = 1; @@ -1596,6 +1598,7 @@ function quiz_send_notification_messages($course, $quiz, $attempt, $context, $cm $a = new stdClass(); // Course info. + $a->courseid = $course->id; $a->coursename = $course->fullname; $a->courseshortname = $course->shortname; // Quiz info. @@ -1670,6 +1673,7 @@ function quiz_send_overdue_message($attemptobj) { $a = new stdClass(); // Course info. + $a->courseid = $attemptobj->get_course()->id; $a->coursename = format_string($attemptobj->get_course()->fullname); $a->courseshortname = format_string($attemptobj->get_course()->shortname); // Quiz info. @@ -1687,7 +1691,8 @@ function quiz_send_overdue_message($attemptobj) { $a->studentusername = $submitter->username; // Prepare the message. - $eventdata = new stdClass(); + $eventdata = new \core\message\message(); + $eventdata->courseid = $a->courseid; $eventdata->component = 'mod_quiz'; $eventdata->name = 'attempt_overdue'; $eventdata->notification = 1;