From 2a80e7a6aa1d56b8b034f7fc8ca717de55c7c7b9 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Wed, 12 Feb 2025 13:24:11 +1300 Subject: [PATCH] ENH Don't use filterByCallback() in CMSSiteTreeFilter classes --- .../CMSSiteTreeFilter_StatusDeletedPages.php | 10 ++-------- .../CMSSiteTreeFilter_StatusDraftPages.php | 16 +++++++++------- ...iteTreeFilter_StatusRemovedFromDraftPages.php | 16 +++++++++------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php b/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php index bf9b58a676..9d117f4584 100644 --- a/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php +++ b/code/Controllers/CMSSiteTreeFilter_StatusDeletedPages.php @@ -35,13 +35,7 @@ public static function title() */ public function getFilteredPages() { - $pages = Versioned::get_including_deleted(SiteTree::class); - $pages = $this->applyDefaultFilters($pages); - - $pages = $pages->filterByCallback(function (SiteTree $page) { - // Doesn't exist on either stage or live - return $page->isArchived(); - }); - return $pages; + $pages = Versioned::getArchivedOnly(SiteTree::class); + return $this->applyDefaultFilters($pages); } } diff --git a/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php b/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php index dbed7234f9..75a7e43818 100644 --- a/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php +++ b/code/Controllers/CMSSiteTreeFilter_StatusDraftPages.php @@ -25,12 +25,14 @@ public static function title() */ public function getFilteredPages() { - $pages = Versioned::get_by_stage(SiteTree::class, 'Stage'); - $pages = $this->applyDefaultFilters($pages); - $pages = $pages->filterByCallback(function (SiteTree $page) { - // If page exists on stage but not on live - return $page->isOnDraftOnly(); - }); - return $pages; + $pages = SiteTree::get(); + // Get all pages existing in draft but not live + // Don't just use withVersionedMode - that would just get the latest draft versions + // including records which have since been published. + $pages = $pages->setDataQueryParam([ + 'Versioned.mode' => 'stage_unique', + 'Versioned.stage' => Versioned::DRAFT, + ]); + return $this->applyDefaultFilters($pages); } } diff --git a/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php b/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php index e2e53db175..831f59c753 100644 --- a/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php +++ b/code/Controllers/CMSSiteTreeFilter_StatusRemovedFromDraftPages.php @@ -24,12 +24,14 @@ public static function title() */ public function getFilteredPages() { - $pages = Versioned::get_including_deleted(SiteTree::class); - $pages = $this->applyDefaultFilters($pages); - $pages = $pages->filterByCallback(function (SiteTree $page) { - // If page is removed from stage but not live - return $page->isOnLiveOnly(); - }); - return $pages; + $pages = SiteTree::get(); + // Get all pages removed from stage but not live + // Don't just use withVersionedMode - that would just get the latest live versions + // including records which were not removed from draft. + return $pages->setDataQueryParam([ + 'Versioned.mode' => 'stage_unique', + 'Versioned.stage' => Versioned::LIVE, + ]); + return $this->applyDefaultFilters($pages); } }