diff --git a/CHANGELOG-v3.md b/CHANGELOG-v3.md index b6dae5b88ce..f23081e4d89 100644 --- a/CHANGELOG-v3.md +++ b/CHANGELOG-v3.md @@ -4,6 +4,7 @@ ### Added - Added the `getenv()` Twig function. ([#2471](https://github.com/craftcms/cms/pull/2471)) +- Added `craft\services\Users::getUserPreference()`. ### Changed - Element query classes can now specify the default `orderBy` value by overriding `craft\elements\db\ElementQuery::defaultOrderBy`. @@ -16,6 +17,7 @@ - Fixed a bug where `craft\helpers\ChartHelper::getRunChartDataFromQuery()` was overriding the query’s `SELECT` clause. - Fixed a bug where Single sections were showing the currently logged-in user as their author. - Fixed a bug where element queries for entries within Structure sections weren’t getting ordered in the Structure-defined order by default in some cases. +- Fixed a bug where `yii\web\User::getIdentity()` would return `null` when called from a plugin’s `init()` method. ([#2473](https://github.com/craftcms/cms/issues/2473)) ## 3.0.0-RC11 - 2018-02-20 diff --git a/src/base/ApplicationTrait.php b/src/base/ApplicationTrait.php index 99fac5319cb..9e2754fb1b0 100644 --- a/src/base/ApplicationTrait.php +++ b/src/base/ApplicationTrait.php @@ -12,7 +12,6 @@ use craft\db\Connection; use craft\db\MigrationManager; use craft\db\Query; -use craft\elements\User; use craft\errors\DbConnectException; use craft\errors\WrongEditionException; use craft\events\EditionChangeEvent; @@ -1186,15 +1185,13 @@ private function _getUserLanguage(): string { /** @var WebApplication|ConsoleApplication $this */ // If the user is logged in *and* has a primary language set, use that - try { - /** @var User|null $user */ - $user = $this->getUser()->getIdentity(); - } catch (\Exception $e) { - $user = null; - } - - if ($user && ($preferredLanguage = $user->getPreferredLanguage()) !== null) { - return $preferredLanguage; + if ($this instanceof WebApplication) { + // Don't actually try to fetch the user, as plugins haven't been loaded yet. + $session = $this->getSession(); + $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->getUser()->idParam) : null; + if ($id && ($language = $this->getUsers()->getUserPreference($id, 'language')) !== null) { + return $language; + } } // Fall back on the default CP language, if there is one, otherwise the browser language diff --git a/src/services/Users.php b/src/services/Users.php index dc3e2796777..ca89f93ea92 100644 --- a/src/services/Users.php +++ b/src/services/Users.php @@ -272,6 +272,20 @@ public function saveUserPreferences(User $user, array $preferences) ->execute(); } + /** + * Returns one of a user’s preferences by its key. + * + * @param int|null $userId The user’s ID + * @param string $key The preference’s key + * @param mixed $default The default value, if the preference hasn’t been set + * @return mixed The user’s preference + */ + public function getUserPreference(int $userId = null, string $key, $default = null) + { + $preferences = $this->getUserPreferences($userId); + return $preferences[$key] ?? $default; + } + /** * Sends a new account activation email for a user, regardless of their status. * A new verification code will generated for the user overwriting any existing one.