From 2524990d09ea547c153873d34d558c585879f539 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Tue, 4 Apr 2017 16:20:26 +0100 Subject: [PATCH] MDL-58486 user_prefs: always update $USER cache when applicable set_user_preference and unset_user_preference let you pass the user to set preferences for as an id. Previously, if you passed $USER->id there, those methods did not update the Cache in $USER, which was surprising, and not easy to debug. Now, we always update the preference cache in $USER if the preference is being changed for the current user. --- lib/moodlelib.php | 6 ++++++ lib/tests/moodlelib_test.php | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/moodlelib.php b/lib/moodlelib.php index cc2a1e25b73..109aeaa8ecd 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -1932,6 +1932,9 @@ function set_user_preference($name, $value, $user = null) { // Update value in cache. $user->preference[$name] = $value; + if ($user !== $USER && $user->id == $USER->id) { + $USER->preference[$name] = $value; + } // Set reload flag for other sessions. mark_user_preferences_changed($user->id); @@ -2001,6 +2004,9 @@ function unset_user_preference($name, $user = null) { // Delete the preference from cache. unset($user->preference[$name]); + if ($user !== $USER && $user->id == $USER->id) { + unset($USER->preference[$name]); + } // Set reload flag for other sessions. mark_user_preferences_changed($user->id); diff --git a/lib/tests/moodlelib_test.php b/lib/tests/moodlelib_test.php index 508608269d9..4e1324cbd0a 100644 --- a/lib/tests/moodlelib_test.php +++ b/lib/tests/moodlelib_test.php @@ -1194,6 +1194,26 @@ class core_moodlelib_testcase extends advanced_testcase { } } + public function test_set_user_preference_for_current_user() { + global $USER; + $this->resetAfterTest(); + $this->setAdminUser(); + + set_user_preference('test_pref', 2); + set_user_preference('test_pref', 1, $USER->id); + $this->assertEquals(1, get_user_preferences('test_pref')); + } + + public function test_unset_user_preference_for_current_user() { + global $USER; + $this->resetAfterTest(); + $this->setAdminUser(); + + set_user_preference('test_pref', 1); + unset_user_preference('test_pref', $USER->id); + $this->assertNull(get_user_preferences('test_pref')); + } + public function test_get_extra_user_fields() { global $CFG, $USER, $DB; $this->resetAfterTest(); -- 2.43.0