From 5502c5907abb0bececf86e6e5d1be08dfb778c41 Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Mon, 11 Jul 2022 05:03:28 -0700 Subject: [PATCH] Deprecate + stop referencing FieldTrait::$required Fixes #11574 --- CHANGELOG.md | 7 +++++++ src/base/Element.php | 6 ++++-- src/base/FieldTrait.php | 1 + src/models/FieldLayout.php | 13 +++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e4bef8c9c..24ab3b4e327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,18 @@ ## Unreleased +### Added +- Added `craft\models\FieldLayout::getVisibleCustomFieldElements()`. + ### Changed - Relation fields now focus on the next related element’s “Remove” button when an element is removed. ([#11577](https://github.com/craftcms/cms/issues/11577)) +### Deprecated +- Deprecated `craft\base\FieldTrait::$required`. `craft\fieldlayoutelements\BaseField::$required` should be used instead. + ### Fixed - Fixed a bug where assets’ native Alternative Text fields were getting mislabeled as translatable. ([#11576](https://github.com/craftcms/cms/issues/11576)) +- Fixed a bug where fields nested within Neo fields could be incorrectly validated as required. ([#11574](https://github.com/craftcms/cms/issues/11574)) ## 4.1.3 - 2022-07-07 diff --git a/src/base/Element.php b/src/base/Element.php index f0c96b6a114..286f3c205c3 100644 --- a/src/base/Element.php +++ b/src/base/Element.php @@ -2239,12 +2239,14 @@ public function afterValidate(): void $fieldLayout = $this->getFieldLayout() ) { $scenario = $this->getScenario(); + $layoutElements = $fieldLayout->getVisibleCustomFieldElements($this); - foreach ($fieldLayout->getVisibleCustomFields($this) as $field) { + foreach ($layoutElements as $layoutElement) { + $field = $layoutElement->getField(); $attribute = "field:$field->handle"; $isEmpty = fn() => $field->isValueEmpty($this->getFieldValue($field->handle), $this); - if ($scenario === self::SCENARIO_LIVE && $field->required) { + if ($scenario === self::SCENARIO_LIVE && $layoutElement->required) { (new RequiredValidator(['isEmpty' => $isEmpty])) ->validateAttribute($this, $attribute); } diff --git a/src/base/FieldTrait.php b/src/base/FieldTrait.php index 3538b93a730..f40784c2a88 100644 --- a/src/base/FieldTrait.php +++ b/src/base/FieldTrait.php @@ -104,6 +104,7 @@ trait FieldTrait /** * @var bool|null Whether the field is required in the field layout it was fetched from + * @deprecated in 4.1.4. [[\craft\fieldlayoutelements\BaseField::$required]] should be used instead */ public ?bool $required = null; diff --git a/src/models/FieldLayout.php b/src/models/FieldLayout.php index 6cb4ea7d11d..6d4e4b7fd17 100644 --- a/src/models/FieldLayout.php +++ b/src/models/FieldLayout.php @@ -553,6 +553,19 @@ public function getCustomFieldElements(): array return $this->getElementsByType(CustomField::class); } + /** + * Returns the visible layout elements representing custom fields, taking conditions into account. + * + * @param ElementInterface $element + * @return CustomField[] + * @since 4.1.4 + */ + public function getVisibleCustomFieldElements(ElementInterface $element): array + { + $filter = fn(FieldLayoutElement $layoutElement) => $layoutElement instanceof CustomField; + return iterator_to_array($this->_elements($filter, $element)); + } + /** * Returns the custom fields included in the layout. *