From 025c5e4b97004adf984d14078933fa79be744408 Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Mon, 8 Apr 2024 10:13:09 -0700 Subject: [PATCH] Stop updating name properties if all are already set Resolves #14665 --- CHANGELOG-WIP.md | 1 + src/base/NameTrait.php | 6 ++++++ src/controllers/UsersController.php | 7 ++++++- src/elements/Address.php | 4 ++++ src/elements/User.php | 4 ++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG-WIP.md b/CHANGELOG-WIP.md index 6bd7fc0b93a..a226eb968ce 100644 --- a/CHANGELOG-WIP.md +++ b/CHANGELOG-WIP.md @@ -14,6 +14,7 @@ - Added `craft\services\Sites::getSitesByLanguage()`. - Added `craft\web\ErrorHandler::exceptionAsArray()`. - Added `craft\web\ErrorHandler::showExceptionDetails()`. +- `craft\base\NameTrait::prepareNamesForSave()` no longer updates the name properties if `fullName`, `firstName`, and `lastName` are already set. ([#14665](https://github.com/craftcms/cms/issues/14665)) ### System - Craft now calls `setlocale()` based on the target language, so that `SORT_LOCALE_STRING` behaves as expected. ([#14509](https://github.com/craftcms/cms/issues/14509), [#14513](https://github.com/craftcms/cms/pull/14513)) diff --git a/src/base/NameTrait.php b/src/base/NameTrait.php index ecd3d3ee996..e40fdfcf05f 100644 --- a/src/base/NameTrait.php +++ b/src/base/NameTrait.php @@ -57,6 +57,12 @@ protected function normalizeNames(): void protected function prepareNamesForSave(): void { if ($this->fullName !== null) { + // if firstName/lastName are also set, just leave them alone + // (https://github.com/craftcms/cms/issues/14665) + if ($this->firstName !== null || $this->lastName !== null) { + return; + } + $generalConfig = Craft::$app->getConfig()->getGeneral(); $languages = [ // Load our custom language file first so config settings can override the defaults diff --git a/src/controllers/UsersController.php b/src/controllers/UsersController.php index 86e5f7752ce..959ad379952 100644 --- a/src/controllers/UsersController.php +++ b/src/controllers/UsersController.php @@ -2695,15 +2695,20 @@ private function populateNameAttributes(object $model): void if ($fullName !== null) { $model->fullName = $fullName; + + // Unset firstName and lastName so NameTrait::prepareNamesForSave() can set them + $model->firstName = $model->lastName = null; } else { // Still check for firstName/lastName in case a front-end form is still posting them $firstName = $this->request->getBodyParam('firstName'); $lastName = $this->request->getBodyParam('lastName'); if ($firstName !== null || $lastName !== null) { - $model->fullName = null; $model->firstName = $firstName ?? $model->firstName; $model->lastName = $lastName ?? $model->lastName; + + // Unset fullName so NameTrait::prepareNamesForSave() can set it + $model->fullName = null; } } } diff --git a/src/elements/Address.php b/src/elements/Address.php index 469bd885f42..b3f118ecb3a 100644 --- a/src/elements/Address.php +++ b/src/elements/Address.php @@ -264,7 +264,11 @@ public function setAttributes($values, $safeOnly = true): void } if (array_key_exists('firstName', $values) || array_key_exists('lastName', $values)) { + // Unset fullName so NameTrait::prepareNamesForSave() can set it $this->fullName = null; + } elseif (array_key_exists('fullName', $values)) { + // Unset firstName and lastName so NameTrait::prepareNamesForSave() can set them + $this->firstName = $this->lastName = null; } parent::setAttributes($values, $safeOnly); diff --git a/src/elements/User.php b/src/elements/User.php index fd01ff4c28f..359c0324b7b 100644 --- a/src/elements/User.php +++ b/src/elements/User.php @@ -906,7 +906,11 @@ public function setAttributes($values, $safeOnly = true): void } if (array_key_exists('firstName', $values) || array_key_exists('lastName', $values)) { + // Unset fullName so NameTrait::prepareNamesForSave() can set it $this->fullName = null; + } elseif (array_key_exists('fullName', $values)) { + // Unset firstName and lastName so NameTrait::prepareNamesForSave() can set them + $this->firstName = $this->lastName = null; } parent::setAttributes($values, $safeOnly);