diff --git a/core/model/VirtualPage.php b/core/model/VirtualPage.php index eb7e2e866..bd90641de 100755 --- a/core/model/VirtualPage.php +++ b/core/model/VirtualPage.php @@ -65,9 +65,19 @@ class VirtualPage extends Page { return $this->isPublishable() && parent::canPublish($member); } + /** + * Return true if we can delete this page from the live site, which is different from can + * we publish it. + */ + public function canDeleteFromLive($member = null) { + return parent::canPublish($member); + } + /** * Returns true if is page is publishable by anyone at all * Return false if the source page isn't published yet. + * + * Note that isPublishable doesn't affect ete from live, only publish. */ public function isPublishable() { // No source diff --git a/tests/model/VirtualPageTest.php b/tests/model/VirtualPageTest.php index aac6ea565..e3683352e 100644 --- a/tests/model/VirtualPageTest.php +++ b/tests/model/VirtualPageTest.php @@ -125,5 +125,30 @@ class VirtualPageTest extends SapphireTest { $p->doPublish(); $this->assertTrue($vp->canPublish()); } + + function testCanDeleteOrphanedVirtualPagesFromLive() { + // An unpublished source page + $p = new Page(); + $p->Content = "test content"; + $p->write(); + $p->doPublish(); + + // With no source page, we can't publish + $vp = new VirtualPage(); + $vp->CopyContentFromID = $p->ID; + $vp->write(); + + // Delete the source page + $this->assertTrue($vp->canPublish()); + $this->assertTrue($p->doDeleteFromLive()); + + // Confirm that we can unpublish, but not publish + $this->assertTrue($vp->canDeleteFromLive()); + $this->assertFalse($vp->canPublish()); + + // Confirm that the action really works + $this->assertTrue($vp->doDeleteFromLive()); + $this->assertNull(DB::query("SELECT \"ID\" FROM \"SiteTree_Live\" WHERE \"ID\" = $vp->ID")->value()); + } } \ No newline at end of file