From 4d90cfeeb38e9f29b404b5fce4c1c503e619a1ba Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Mon, 1 Mar 2010 21:41:06 +0000 Subject: [PATCH] BUGFIX: Fix virtual page logic for subsite virtual pages too. (from r93916) --- code/SiteTreeSubsites.php | 2 +- tests/SubsitesVirtualPageTest.php | 59 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/code/SiteTreeSubsites.php b/code/SiteTreeSubsites.php index d0bf81f..3356689 100644 --- a/code/SiteTreeSubsites.php +++ b/code/SiteTreeSubsites.php @@ -139,7 +139,7 @@ class SiteTreeSubsites extends SiteTreeDecorator { $linkedPages = DataObject::get("SubsitesVirtualPage", "CopyContentFromID = {$this->owner->ID}"); if($linkedPages) foreach($linkedPages as $page) { $page->copyFrom($page->CopyContentFrom()); - $page->doPublish(); + if($page->ExistsOnLive) $page->doPublish(); } Subsite::$disable_subsite_filter = $oldState; diff --git a/tests/SubsitesVirtualPageTest.php b/tests/SubsitesVirtualPageTest.php index a6f60b2..399dba9 100644 --- a/tests/SubsitesVirtualPageTest.php +++ b/tests/SubsitesVirtualPageTest.php @@ -62,7 +62,66 @@ class SubsitesVirtualPageTest extends SapphireTest { foreach($testFiles as $file) { if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file); } + } + function testSubsiteVirtualPagesArentInappropriatelyPublished() { + // Fixture + $p = new Page(); + $p->Content = "test content"; + $p->write(); + $vp = new SubsitesVirtualPage(); + $vp->CopyContentFromID = $p->ID; + $vp->write(); + + // VP is oragne + $this->assertTrue($vp->IsAddedToStage); + + // VP is still orange after we publish + $p->doPublish(); + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->IsAddedToStage); + + // A new VP created after P's initial construction + $vp2 = new SubsitesVirtualPage(); + $vp2->CopyContentFromID = $p->ID; + $vp2->write(); + $this->assertTrue($vp2->IsAddedToStage); + + // Also remains orange after a republish + $p->Content = "new content"; + $p->write(); + $p->doPublish(); + $this->fixVersionNumberCache($vp2); + $this->assertTrue($vp2->IsAddedToStage); + + // VP is now published + $vp->doPublish(); + + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->ExistsOnLive); + $this->assertFalse($vp->IsModifiedOnStage); + + // P edited, VP and P both go green + $p->Content = "third content"; + $p->write(); + + $this->fixVersionNumberCache($vp, $p); + $this->assertTrue($p->IsModifiedOnStage); + $this->assertTrue($vp->IsModifiedOnStage); + + // Publish, VP goes black + $p->doPublish(); + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->ExistsOnLive); + $this->assertFalse($vp->IsModifiedOnStage); + } + + function fixVersionNumberCache($page) { + $pages = func_get_args(); + foreach($pages as $p) { + Versioned::prepopulate_versionnumber_cache('SiteTree', 'Stage', array($p->ID)); + Versioned::prepopulate_versionnumber_cache('SiteTree', 'Live', array($p->ID)); + } } } \ No newline at end of file