diff --git a/CHANGELOG.md b/CHANGELOG.md index 508346e5782..ee68a86b6ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Release Notes for Craft CMS 4 +## Unreleased + +### Changed +- Address fields now show required indicators based on the configured validation rules. ([#11566](https://github.com/craftcms/cms/pull/11566)) + ## 4.1.2 - 2022-07-06 ### Added diff --git a/src/helpers/Cp.php b/src/helpers/Cp.php index 11188cf87f4..99f4c1dfe19 100644 --- a/src/helpers/Cp.php +++ b/src/helpers/Cp.php @@ -8,6 +8,7 @@ namespace craft\helpers; use Craft; +use craft\base\Element; use craft\base\ElementInterface; use craft\base\FieldLayoutElement; use craft\behaviors\DraftBehavior; @@ -24,6 +25,7 @@ use yii\base\Event; use yii\base\InvalidArgumentException; use yii\helpers\Markdown; +use yii\validators\RequiredValidator; /** * Class Cp @@ -1257,7 +1259,22 @@ public static function addressFieldsHtml(Address $address): string { $formatRepo = Craft::$app->getAddresses()->getAddressFormatRepository()->get($address->countryCode); - $requiredFields = array_flip($formatRepo->getRequiredFields()); + $requiredFields = []; + $scenario = $address->getScenario(); + $address->setScenario(Element::SCENARIO_LIVE); + $activeValidators = $address->getActiveValidators(); + $address->setScenario($scenario); + + foreach ($activeValidators as $validator) { + if ($validator instanceof RequiredValidator) { + foreach ($validator->getAttributeNames() as $attr) { + if ($validator->when === null || call_user_func($validator->when, $address, $attr)) { + $requiredFields[$attr] = true; + } + } + } + } + $visibleFields = array_flip(array_merge( $formatRepo->getUsedFields(), $formatRepo->getUsedSubdivisionFields(),