mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 11:05:55 +02: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;
|
$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 {
|
class SubsitesVirtualPage_Controller extends VirtualPage_Controller {
|
||||||
|
@ -130,6 +130,9 @@ class SiteTreeSubsitesTest extends SapphireTest {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Similar to {@link SubsitesVirtualPageTest->testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite()}.
|
||||||
|
*/
|
||||||
function testTwoPagesWithSameURLOnDifferentSubsites() {
|
function testTwoPagesWithSameURLOnDifferentSubsites() {
|
||||||
// Set up a couple of pages with the same URL on different subsites
|
// Set up a couple of pages with the same URL on different subsites
|
||||||
$s1 = $this->objFromFixture('Subsite','domaintest1');
|
$s1 = $this->objFromFixture('Subsite','domaintest1');
|
||||||
|
@ -207,6 +207,44 @@ class SubsitesVirtualPageTest extends SapphireTest {
|
|||||||
$this->assertFalse($onLive, 'SVP has been removed from live');
|
$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) {
|
function fixVersionNumberCache($page) {
|
||||||
$pages = func_get_args();
|
$pages = func_get_args();
|
||||||
foreach($pages as $p) {
|
foreach($pages as $p) {
|
||||||
|
Loading…
Reference in New Issue
Block a user