From 47221d5fdd1d6343c0ae0bab915bc46a58f2cf6b Mon Sep 17 00:00:00 2001 From: Rajesh Taneja Date: Fri, 23 May 2014 11:40:31 +0800 Subject: [PATCH] MDL-45641 event: Option to trigger user event manually On some pages full user data is not stored before user_created/ user_updated event is triggred. So giving option to trigger that manually, so it can be triggred after all data is saved --- lib/classes/event/user_created.php | 20 +++++++++++++++++ lib/classes/event/user_updated.php | 20 +++++++++++++++++ lib/upgrade.txt | 9 ++++++++ user/editadvanced.php | 14 +++++++++--- user/externallib.php | 10 +++++++-- user/lib.php | 35 ++++++++++++------------------ user/tests/userlib_test.php | 24 ++++++++++++++++++++ user/upgrade.txt | 7 ++++++ 8 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 user/upgrade.txt diff --git a/lib/classes/event/user_created.php b/lib/classes/event/user_created.php index b7161793172..d6aa4391e8a 100644 --- a/lib/classes/event/user_created.php +++ b/lib/classes/event/user_created.php @@ -113,4 +113,24 @@ class user_created extends base { $this->relateduserid = $this->objectid; } } + + /** + * Create instance of event. + * + * @since Moodle 2.6.4, 2.7.1 + * + * @param int $userid id of user + * @return user_created + */ + public static function create_from_userid($userid) { + $data = array( + 'objectid' => $userid, + 'relateduserid' => $userid, + 'context' => \context_user::instance($userid) + ); + + // Create user_created event. + $event = self::create($data); + return $event; + } } diff --git a/lib/classes/event/user_updated.php b/lib/classes/event/user_updated.php index a8ef5c5500e..1e5e27ab623 100644 --- a/lib/classes/event/user_updated.php +++ b/lib/classes/event/user_updated.php @@ -113,4 +113,24 @@ class user_updated extends base { $this->relateduserid = $this->objectid; } } + + /** + * Create instance of event. + * + * @since Moodle 2.6.4, 2.7.1 + * + * @param int $userid id of user + * @return user_updated + */ + public static function create_from_userid($userid) { + $data = array( + 'objectid' => $userid, + 'relateduserid' => $userid, + 'context' => \context_user::instance($userid) + ); + + // Create user_updated event. + $event = self::create($data); + return $event; + } } diff --git a/lib/upgrade.txt b/lib/upgrade.txt index f651affd9c2..fcc0104aedc 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -1,6 +1,15 @@ This files describes API changes in core libraries and APIs, information provided here is intended especially for developers. +=== 2.6.4 / 2.7.1 === +* setnew_password_and_mail() and update_internal_user_password() will trigger + \core\event\user_password_updated. Previously they used to generate + \core\event\user_updated event. +* update_internal_user_password() accepts optional boolean $fasthash for fast + hashing. +* user_update_user() and user_create_user() api's accept optional param + $triggerevent to avoid respective events to be triggred from the api's. + === 2.7 === * PHPUnit cannot be installed via PEAR any more, please use composer package manager instead. diff --git a/user/editadvanced.php b/user/editadvanced.php index 047868e62fb..2cf36c89a90 100644 --- a/user/editadvanced.php +++ b/user/editadvanced.php @@ -155,6 +155,7 @@ $userform = new user_editadvanced_form(null, array( $userform->set_data($user); if ($usernew = $userform->get_data()) { + $usercreated = false; if (empty($usernew->auth)) { // User editing self. @@ -185,7 +186,7 @@ if ($usernew = $userform->get_data()) { } else { $usernew->password = AUTH_PASSWORD_NOT_CACHED; } - $usernew->id = user_create_user($usernew, false); + $usernew->id = user_create_user($usernew, false, false); if (!$authplugin->is_internal() and $authplugin->can_change_password() and !empty($usernew->newpassword)) { if (!$authplugin->user_update_password($usernew, $usernew->newpassword)) { @@ -195,7 +196,7 @@ if ($usernew = $userform->get_data()) { $passwordupdated = true; } } - + $usercreated = true; } else { $usernew = file_postupdate_standard_editor($usernew, 'description', $editoroptions, $usercontext, 'user', 'profile', 0); // Pass a true old $user here. @@ -203,7 +204,7 @@ if ($usernew = $userform->get_data()) { // Auth update failed. print_error('cannotupdateuseronexauth', '', '', $user->auth); } - user_update_user($usernew, false); + user_update_user($usernew, false, false); // Set new password if specified. if (!empty($usernew->newpassword)) { @@ -250,6 +251,13 @@ if ($usernew = $userform->get_data()) { // Reload from db. $usernew = $DB->get_record('user', array('id' => $usernew->id)); + // Trigger update/create event, after all fields are stored. + if ($usercreated) { + \core\event\user_created::create_from_userid($usernew->id)->trigger(); + } else { + \core\event\user_updated::create_from_userid($usernew->id)->trigger(); + } + if ($passwordupdated) { \core\event\user_password_updated::create_from_user($usernew)->trigger(); } diff --git a/user/externallib.php b/user/externallib.php index 506b629c453..24daf4f60bb 100644 --- a/user/externallib.php +++ b/user/externallib.php @@ -186,7 +186,7 @@ class core_user_external extends external_api { // End of user info validation. // Create the user data now! - $user['id'] = user_create_user($user); + $user['id'] = user_create_user($user, true, false); // Custom fields. if (!empty($user['customfields'])) { @@ -198,6 +198,9 @@ class core_user_external extends external_api { profile_save_data((object) $user); } + // Trigger event. + \core\event\user_created::create_from_userid($user['id'])->trigger(); + // Preferences. if (!empty($user['preferences'])) { foreach ($user['preferences'] as $preference) { @@ -400,7 +403,7 @@ class core_user_external extends external_api { $transaction = $DB->start_delegated_transaction(); foreach ($params['users'] as $user) { - user_update_user($user); + user_update_user($user, true, false); // Update user custom fields. if (!empty($user['customfields'])) { @@ -412,6 +415,9 @@ class core_user_external extends external_api { profile_save_data((object) $user); } + // Trigger event. + \core\event\user_updated::create_from_userid($user['id'])->trigger(); + // Preferences. if (!empty($user['preferences'])) { foreach ($user['preferences'] as $preference) { diff --git a/user/lib.php b/user/lib.php index aee893b2b52..1089e05760e 100644 --- a/user/lib.php +++ b/user/lib.php @@ -29,9 +29,11 @@ * @throws moodle_exception * @param stdClass $user user to create * @param bool $updatepassword if true, authentication plugin will update password. + * @param bool $triggerevent set false if user_created event should not be triggred. + * This will not affect user_password_updated event triggering. * @return int id of the newly created user */ -function user_create_user($user, $updatepassword = true) { +function user_create_user($user, $updatepassword = true, $triggerevent = true) { global $CFG, $DB; // Set the timecreate field to the current time. @@ -87,15 +89,10 @@ function user_create_user($user, $updatepassword = true) { $authplugin->user_update_password($newuser, $userpassword); } - // Trigger event. - $event = \core\event\user_created::create( - array( - 'objectid' => $newuserid, - 'relateduserid' => $newuserid, - 'context' => $usercontext - ) - ); - $event->trigger(); + // Trigger event If required. + if ($triggerevent) { + \core\event\user_created::create_from_userid($newuserid)->trigger(); + } return $newuserid; } @@ -106,8 +103,10 @@ function user_create_user($user, $updatepassword = true) { * @throws moodle_exception * @param stdClass $user the user to update * @param bool $updatepassword if true, authentication plugin will update password. + * @param bool $triggerevent set false if user_updated event should not be triggred. + * This will not affect user_password_updated event triggering. */ -function user_update_user($user, $updatepassword = true) { +function user_update_user($user, $updatepassword = true, $triggerevent = true) { global $DB; // Set the timecreate field to the current time. @@ -165,16 +164,10 @@ function user_update_user($user, $updatepassword = true) { } } } - - // Trigger event. - $event = \core\event\user_updated::create( - array( - 'objectid' => $user->id, - 'relateduserid' => $user->id, - 'context' => context_user::instance($user->id) - ) - ); - $event->trigger(); + // Trigger event if required. + if ($triggerevent) { + \core\event\user_updated::create_from_userid($user->id)->trigger(); + } } /** diff --git a/user/tests/userlib_test.php b/user/tests/userlib_test.php index 915473af14e..10eea017259 100644 --- a/user/tests/userlib_test.php +++ b/user/tests/userlib_test.php @@ -76,6 +76,22 @@ class core_userliblib_testcase extends advanced_testcase { user_update_user($user, false); $dbuser = $DB->get_record('user', array('id' => $user->id)); $this->assertSame($password, $dbuser->password); + + // Verify event is not triggred by user_update_user when needed. + $sink = $this->redirectEvents(); + user_update_user($user, false, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(0, $events); + + // With password, there should be 1 event. + $sink = $this->redirectEvents(); + user_update_user($user, true, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(1, $events); + $event = array_pop($events); + $this->assertInstanceOf('\core\event\user_password_updated', $event); } /** @@ -128,6 +144,14 @@ class core_userliblib_testcase extends advanced_testcase { $this->assertEventLegacyData($dbuser, $event); $expectedlogdata = array(SITEID, 'user', 'add', '/view.php?id='.$event->objectid, fullname($dbuser)); $this->assertEventLegacyLogData($expectedlogdata, $event); + + // Verify event is not triggred by user_create_user when needed. + $user = array('username' => 'usernametest2'); // Create another user. + $sink = $this->redirectEvents(); + user_create_user($user, true, false); + $events = $sink->get_events(); + $sink->close(); + $this->assertCount(0, $events); } /** diff --git a/user/upgrade.txt b/user/upgrade.txt new file mode 100644 index 00000000000..9ecf4220a5d --- /dev/null +++ b/user/upgrade.txt @@ -0,0 +1,7 @@ +This files describes API changes in /user/, information provided +here is intended especially for developers. + +=== 2.7.1 === + +* user_update_user() and user_create_user() api's accept optional param + $triggerevent to avoid respective events to be triggred from the api's.