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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
+11
-3
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+14
-21
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user