diff --git a/code/controllers/ModelAsController.php b/code/controllers/ModelAsController.php index c1d260f8..c57bf45e 100644 --- a/code/controllers/ModelAsController.php +++ b/code/controllers/ModelAsController.php @@ -159,7 +159,11 @@ class ModelAsController extends Controller implements NestedController { 'SiteTree', "\"URLSegment\" = '$URLSegment'" . ($useParentIDFilter ? ' AND "ParentID" = ' . (int)$parentID : '') ); - if($pages && $pages->Count() == 1) return $pages->First(); + + if($pages && $pages->Count() == 1 && ($page = $pages->First())) { + $parent = $page->ParentID ? $page->Parent() : $page; + if($parent->isPublished()) return $page; + } } // Get an old version of a page that has been renamed. @@ -175,8 +179,9 @@ class ModelAsController extends Controller implements NestedController { $record = $query->execute()->first(); if($record && ($oldPage = DataObject::get_by_id('SiteTree', $record['RecordID']))) { + $oldParent = $oldPage->ParentID ? $oldPage->Parent() : $oldPage; // Run the page through an extra filter to ensure that all extensions are applied. - if(SiteTree::get_by_link($oldPage->RelativeLink())) return $oldPage; + if(SiteTree::get_by_link($oldPage->RelativeLink()) && $oldParent->isPublished()) return $oldPage; } } diff --git a/tests/controller/ModelAsControllerTest.php b/tests/controller/ModelAsControllerTest.php index 8ffd9ac9..e46aa984 100644 --- a/tests/controller/ModelAsControllerTest.php +++ b/tests/controller/ModelAsControllerTest.php @@ -233,5 +233,33 @@ class ModelAsControllerTest extends FunctionalTest { $response = ModelAsController::find_old_page('oldpage2',$page2->ID); $this->assertEquals(false, $response ); } - + + /** + * go to a page that's been published but is child of an unpublished page + * + * NOTE: This test requires nested_urls + */ + function testChildOfDraft() { + RootURLController::reset(); + SiteTree::enable_nested_urls(); + + $draft = new Page(); + $draft->Title = 'Root Leve Draft Page'; + $draft->URLSegment = 'root'; + $draft->write(); + + $published = new Page(); + $published->Title = 'Published Page Under Draft Page'; + $published->URLSegment = 'sub-root'; + $published->write(); + $published->publish('Stage', 'Live'); + $response = $this->get('root/sub-root'); + + $this->assertEquals( + $response->getStatusCode(), + 404, + 'The page should not be found since its parent has not been published, in this case http:///root/sub-root or http:///sub-root' + ); + } + }