diff --git a/CHANGELOG.md b/CHANGELOG.md index 17e977d32df..0e30c2c622b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Fixed a bug where it wasn’t possible to save nested entries via the `entries/save-entry` controller action. ([#15737](https://github.com/craftcms/cms/issues/15737)) - Fixed a bug where hyperlinks in Link field inputs could wrap unnecessarily. ([#15738](https://github.com/craftcms/cms/issues/15738)) - Fixed an error that occurred when running the `entrify/global-set` command. ([#15746](https://github.com/craftcms/cms/issues/15746)) +- Fixed a bug where users’ `username` values weren’t getting updated based on email address changes when `useEmailAsUsername` was enabled. ([#15758](https://github.com/craftcms/cms/issues/15758)) ## 5.4.4 - 2024-09-14 diff --git a/src/elements/User.php b/src/elements/User.php index a0839883f9c..2c4ea48e7a3 100644 --- a/src/elements/User.php +++ b/src/elements/User.php @@ -910,7 +910,7 @@ protected function defineRules(): array if (Craft::$app->getIsInstalled()) { $rules[] = [ - ['username', 'email'], + ['email'], UniqueValidator::class, 'targetClass' => UserRecord::class, 'caseInsensitive' => true, @@ -918,6 +918,17 @@ protected function defineRules(): array 'when' => $treatAsActive, ]; + if (!Craft::$app->getConfig()->getGeneral()->useEmailAsUsername) { + $rules[] = [ + ['username'], + UniqueValidator::class, + 'targetClass' => UserRecord::class, + 'caseInsensitive' => true, + 'filter' => ['or', ['active' => true], ['pending' => true]], + 'when' => $treatAsActive, + ]; + } + $rules[] = [['unverifiedEmail'], 'validateUnverifiedEmail']; } @@ -2289,6 +2300,10 @@ final public function beforeSave(bool $isNew): bool return false; } + if (Craft::$app->getConfig()->getGeneral()->useEmailAsUsername) { + $this->username = $this->email; + } + return parent::beforeSave($isNew); } diff --git a/tests/unit/services/UsersTest.php b/tests/unit/services/UsersTest.php index 540d5cb7c4d..8f83903b0eb 100644 --- a/tests/unit/services/UsersTest.php +++ b/tests/unit/services/UsersTest.php @@ -120,6 +120,8 @@ public function testUserActivationEmailAsUsernameWithAnUnverifedEmail(): void self::assertSame(User::STATUS_ACTIVE, $user->getStatus()); self::assertSame('jsmith@gmail.com', $user->username); + + Craft::$app->getConfig()->getGeneral()->useEmailAsUsername = false; } /** @@ -139,6 +141,8 @@ public function testUserActivationEmailAsUsernameWithNoUnverifedEmail(): void self::assertSame(User::STATUS_ACTIVE, $user->getStatus()); self::assertSame('jsmith', $user->username); + + Craft::$app->getConfig()->getGeneral()->useEmailAsUsername = false; } /**