From 6b0c951a44623e3889e4dddcc6d945586b8679a1 Mon Sep 17 00:00:00 2001 From: brandonkelly Date: Mon, 18 Nov 2024 12:14:01 -0800 Subject: [PATCH] Backport #16124 --- CHANGELOG.md | 1 + src/services/Structures.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7e9acef03b..d1a75e3992f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Fixed a JavaScript error that could occur on element edit pages. ([#16055](https://github.com/craftcms/cms/issues/16055)) - Fixed a Twig deprecation error. ([#16107](https://github.com/craftcms/cms/issues/16107)) +- Fixed a bug where `craft\services\Structures::fillGapsInElements()` wasn’t working properly if the elements weren’t passed in hierarchical order. ([#16085](https://github.com/craftcms/cms/issues/16085)) ## 4.13.0 - 2024-11-12 diff --git a/src/services/Structures.php b/src/services/Structures.php index c537c178851..ddb75439861 100644 --- a/src/services/Structures.php +++ b/src/services/Structures.php @@ -155,6 +155,10 @@ public function fillGapsInElements(array &$elements): void $prevElement = null; $patchedElements = []; + // https://github.com/craftcms/cms/issues/16085 + // don't assume that elements are in the top to bottom order + usort($elements, fn(ElementInterface $a, ElementInterface $b) => $a->lft <=> $b->lft); + foreach ($elements as $i => $element) { // Did we just skip any elements? if (