diff --git a/code/Model/SiteTree.php b/code/Model/SiteTree.php index 7b559bbe73..42705c33b4 100755 --- a/code/Model/SiteTree.php +++ b/code/Model/SiteTree.php @@ -2215,6 +2215,11 @@ public function getCMSActions() { $isPublished = $this->isPublished(); $stagesDiffer = $this->stagesDiffer(Versioned::DRAFT, Versioned::LIVE); + // Check permissions + $canPublish = $this->canPublish(); + $canUnpublish = $this->canUnpublish(); + $canEdit = $this->canEdit(); + // Major actions appear as buttons immediately visible as page actions. $majorActions = CompositeField::create()->setName('MajorActions'); $majorActions->setFieldHolderTemplate(get_class($majorActions) . '_holder_buttongroup'); @@ -2239,7 +2244,11 @@ public function getCMSActions() { ))->renderWith($infoTemplate) ) ); - $moreOptions->push(AddToCampaignHandler_FormAction::create()); + + // Add to campaign option if not-archived and has publish permission + if (($isPublished || $isOnDraft) && $canPublish) { + $moreOptions->push(AddToCampaignHandler_FormAction::create()); + } // "readonly"/viewing version that isn't the current version of the record $stageRecord = Versioned::get_by_stage(static::class, Versioned::DRAFT)->byID($this->ID); @@ -2254,11 +2263,6 @@ public function getCMSActions() { return $actions; } - // Check permissions - $canPublish = $this->canPublish(); - $canUnpublish = $this->canUnpublish(); - $canEdit = $this->canEdit(); - // "unpublish" if($isPublished && $canPublish && $isOnDraft && $canUnpublish) { $moreOptions->push( diff --git a/tests/model/SiteTreeActionsTest.php b/tests/model/SiteTreeActionsTest.php index 4f032ccdcf..cf0cf61e21 100644 --- a/tests/model/SiteTreeActionsTest.php +++ b/tests/model/SiteTreeActionsTest.php @@ -45,6 +45,7 @@ public function testActionsReadonly() { $page = Page::get()->byID($page->ID); $actions = $page->getCMSActions(); + $this->assertNull($actions->dataFieldByName('action_addtocampaign')); $this->assertNull($actions->dataFieldByName('action_save')); $this->assertNull($actions->dataFieldByName('action_publish')); $this->assertNull($actions->dataFieldByName('action_unpublish')); @@ -105,6 +106,7 @@ public function testActionsPublishedRecord() { $actions = $page->getCMSActions(); + $this->assertNotNull($actions->dataFieldByName('action_addtocampaign')); $this->assertNotNull($actions->dataFieldByName('action_save')); $this->assertNotNull($actions->dataFieldByName('action_publish')); $this->assertNotNull($actions->dataFieldByName('action_unpublish')); @@ -135,6 +137,8 @@ public function testActionsDeletedFromStageRecord() { $actions = $page->getCMSActions(); + // Theoretically allow deletions to be staged via add to campaign + $this->assertNotNull($actions->dataFieldByName('action_addtocampaign')); $this->assertNull($actions->dataFieldByName('action_save')); $this->assertNull($actions->dataFieldByName('action_publish')); $this->assertNull($actions->dataFieldByName('action_unpublish')); @@ -164,6 +168,7 @@ public function testActionsChangedOnStageRecord() { $page = Page::get()->byID($page->ID); $actions = $page->getCMSActions(); + $this->assertNotNull($actions->dataFieldByName('action_addtocampaign')); $this->assertNotNull($actions->dataFieldByName('action_save')); $this->assertNotNull($actions->dataFieldByName('action_publish')); $this->assertNotNull($actions->dataFieldByName('action_unpublish')); @@ -187,6 +192,7 @@ public function testActionsViewingOldVersion() { $version = DB::query('SELECT "Version" FROM "SiteTree_Versions" WHERE "Content" = \'test page first version\'')->value(); $old = Versioned::get_version('Page', $p->ID, $version); $actions = $old->getCMSActions(); + $this->assertNull($actions->dataFieldByName('action_addtocampaign')); $this->assertNull($actions->dataFieldByName('action_save')); $this->assertNull($actions->dataFieldByName('action_publish')); $this->assertNull($actions->dataFieldByName('action_unpublish'));