mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 09:05:55 +00:00
BUGFIX Overload validateURLSegment() in SubsitesVirtualPage to allow for same URLSegments as linked pages, as long as they only exist in a different subsite (only change the URLSegment if it already exists in the same subsite). (AIR-4)
This commit is contained in:
parent
85a095702b
commit
72e1e5b1b2
@ -105,6 +105,44 @@ class SubsitesVirtualPage extends VirtualPage {
|
||||
$this->ExtraMeta = $this->ContentSource()->ExtraMeta ? $this->ContentSource()->ExtraMeta : $this->ExtraMeta;
|
||||
}
|
||||
}
|
||||
|
||||
function validURLSegment() {
|
||||
$isValid = parent::validURLSegment();
|
||||
|
||||
// Veto the validation rules if its false. In this case, some logic
|
||||
// needs to be duplicated from parent to find out the exact reason the validation failed.
|
||||
if(!$isValid) {
|
||||
$IDFilter = ($this->ID) ? "AND \"SiteTree\".\"ID\" <> $this->ID" : null;
|
||||
$parentFilter = null;
|
||||
|
||||
if(self::nested_urls()) {
|
||||
if($this->ParentID) {
|
||||
$parentFilter = " AND \"SiteTree\".\"ParentID\" = $this->ParentID";
|
||||
} else {
|
||||
$parentFilter = ' AND "SiteTree"."ParentID" = 0';
|
||||
}
|
||||
}
|
||||
|
||||
Subsite::$disable_subsite_filter = true;
|
||||
$existingPage = DataObject::get_one(
|
||||
'SiteTree',
|
||||
"\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter",
|
||||
false // disable cache, it doesn't include subsite status in the key
|
||||
);
|
||||
Subsite::$disable_subsite_filter = false;
|
||||
$existingPageInSubsite = DataObject::get_one(
|
||||
'SiteTree',
|
||||
"\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter",
|
||||
false // disable cache, it doesn't include subsite status in the key
|
||||
);
|
||||
|
||||
// If URL has been vetoed because of an existing page,
|
||||
// be more specific and allow same URLSegments in different subsites
|
||||
$isValid = !($existingPage && $existingPageInSubsite);
|
||||
}
|
||||
|
||||
return $isValid;
|
||||
}
|
||||
}
|
||||
|
||||
class SubsitesVirtualPage_Controller extends VirtualPage_Controller {
|
||||
|
@ -130,6 +130,9 @@ class SiteTreeSubsitesTest extends SapphireTest {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to {@link SubsitesVirtualPageTest->testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite()}.
|
||||
*/
|
||||
function testTwoPagesWithSameURLOnDifferentSubsites() {
|
||||
// Set up a couple of pages with the same URL on different subsites
|
||||
$s1 = $this->objFromFixture('Subsite','domaintest1');
|
||||
|
@ -206,6 +206,44 @@ class SubsitesVirtualPageTest extends SapphireTest {
|
||||
$onLive = Versioned::get_one_by_stage('SubsitesVirtualPage', 'Live', "\"SiteTree_Live\".\"ID\" = ".$vp2->ID);
|
||||
$this->assertFalse($onLive, 'SVP has been removed from live');
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to {@link SiteTreeSubsitesTest->testTwoPagesWithSameURLOnDifferentSubsites()}
|
||||
* and {@link SiteTreeSubsitesTest->testPagesInDifferentSubsitesCanShareURLSegment()}.
|
||||
*/
|
||||
function testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite() {
|
||||
Subsite::$write_hostmap = false;
|
||||
$subsite1 = $this->objFromFixture('Subsite_Template', 'subsite1');
|
||||
$subsite2 = $this->objFromFixture('Subsite_Template', 'subsite2');
|
||||
Subsite::changeSubsite($subsite1->ID);
|
||||
|
||||
$subsite1Page = $this->objFromFixture('SiteTree', 'subsite1_contactus');
|
||||
$subsite1Page->URLSegment = 'contact-us';
|
||||
$subsite1Page->write();
|
||||
|
||||
// saving on subsite1, and linking to subsite1
|
||||
$subsite1Vp = new SubsitesVirtualPage();
|
||||
$subsite1Vp->CopyContentFromID = $subsite1Page->ID;
|
||||
$subsite1Vp->SubsiteID = $subsite1->ID;
|
||||
$subsite1Vp->write();
|
||||
$this->assertNotEquals(
|
||||
$subsite1Vp->URLSegment,
|
||||
$subsite1Page->URLSegment,
|
||||
"Doesn't allow explicit URLSegment overrides when already existing in same subsite"
|
||||
);
|
||||
|
||||
// saving in subsite2 (which already has a page with URLSegment 'contact-us'),
|
||||
// but linking to a page in subsite1
|
||||
$subsite2Vp = new SubsitesVirtualPage();
|
||||
$subsite2Vp->CopyContentFromID = $subsite1Page->ID;
|
||||
$subsite2Vp->SubsiteID = $subsite2->ID;
|
||||
$subsite2Vp->write();
|
||||
$this->assertEquals(
|
||||
$subsite2Vp->URLSegment,
|
||||
$subsite1Page->URLSegment,
|
||||
"Does allow explicit URLSegment overrides when only existing in a different subsite"
|
||||
);
|
||||
}
|
||||
|
||||
function fixVersionNumberCache($page) {
|
||||
$pages = func_get_args();
|
||||
|
Loading…
x
Reference in New Issue
Block a user