diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 24eabff4..66bf7e63 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -48,3 +48,14 @@ to speak to your website administrator or hosting provider to facilitate this. You can simulate subsite access without setting up virtual hosts by appending ?SubsiteID= to the request. + +### How do Subsite domains work with Fluent domains? + +The Subsites module and Fluent translation module both provide the concept of defining "domains" and let you +configure the host name for it. This functionality is essentially performing the same duty in both modules. + +In the "URL segment" field for CMS pages, both Subsites and Fluent will add their context to the value. If you +have a Subsite domain configured but no Fluent domain, Fluent will respect the existing domain and add its +locale context to the value. If you have a Subsite domain configured and a Fluent domain configured, Fluent will +use its own domain host name value, and the Subsite domain value will be lost. For this reason, you will need +to ensure that you use the same host name in both Subsite and Fluent domain entries. diff --git a/src/Extensions/SiteTreeSubsites.php b/src/Extensions/SiteTreeSubsites.php index 728feca8..ed79f98f 100644 --- a/src/Extensions/SiteTreeSubsites.php +++ b/src/Extensions/SiteTreeSubsites.php @@ -3,6 +3,7 @@ namespace SilverStripe\Subsites\Extensions; use Page; +use SilverStripe\CMS\Forms\SiteTreeURLSegmentField; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; @@ -150,6 +151,7 @@ public function updateCMSFields(FieldList $fields) // replace readonly link prefix $subsite = $this->owner->Subsite(); $nested_urls_enabled = Config::inst()->get(SiteTree::class, 'nested_urls'); + /** @var Subsite $subsite */ if ($subsite && $subsite->exists()) { // Use baseurl from domain $baseLink = $subsite->absoluteBaseURL(); @@ -163,7 +165,7 @@ public function updateCMSFields(FieldList $fields) } $urlsegment = $fields->dataFieldByName('URLSegment'); - if ($urlsegment) { + if ($urlsegment && $urlsegment instanceof SiteTreeURLSegmentField) { $urlsegment->setURLPrefix($baseLink); } } diff --git a/tests/php/SiteTreeSubsitesTest.php b/tests/php/SiteTreeSubsitesTest.php index d165336e..dc54afaa 100644 --- a/tests/php/SiteTreeSubsitesTest.php +++ b/tests/php/SiteTreeSubsitesTest.php @@ -5,10 +5,10 @@ use Page; use SilverStripe\CMS\Controllers\CMSMain; use SilverStripe\CMS\Controllers\ModelAsController; +use SilverStripe\CMS\Forms\SiteTreeURLSegmentField; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Director; use SilverStripe\Core\Config\Config; -use SilverStripe\Core\Convert; use SilverStripe\ErrorPage\ErrorPage; use SilverStripe\Forms\FieldList; use SilverStripe\Security\Member; @@ -21,6 +21,7 @@ use SilverStripe\Subsites\Tests\SiteTreeSubsitesTest\TestErrorPage; use SilverStripe\Versioned\Versioned; use SilverStripe\View\SSViewer; +use TractorCow\Fluent\Extension\FluentSiteTreeExtension; class SiteTreeSubsitesTest extends BaseSubsiteTest { @@ -33,7 +34,9 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest ]; protected static $illegal_extensions = [ - SiteTree::class => ['Translatable'] // @todo implement Translatable namespace + SiteTree::class => [ + FluentSiteTreeExtension::class, + ], ]; protected function setUp() @@ -449,7 +452,7 @@ public function provideAlternateAbsoluteLink() /** * @dataProvider provideAlternateAbsoluteLink - * @param name $pageFixtureName + * @param string $pageFixtureName * @param string|null $action * @param string $expectedAbsoluteLink */ @@ -465,4 +468,23 @@ public function testAlternateAbsoluteLink($pageFixtureName, $action, $expectedAb $this->assertEquals($expectedAbsoluteLink, $result); } + + public function testURLSegmentBaseIsSetToSubsiteBaseURL() + { + // This subsite has a domain with 'one.example.org' as the primary domain + /** @var Subsite $subsite */ + $subsite = $this->objFromFixture(Subsite::class, 'domaintest1'); + Subsite::changeSubsite($subsite); + + $page = new SiteTree(); + $page->SubsiteID = $subsite->ID; + $page->write(); + $fields = $page->getCMSFields(); + + /** @var SiteTreeURLSegmentField $urlSegmentField */ + $urlSegmentField = $fields->dataFieldByName('URLSegment'); + $this->assertInstanceOf(SiteTreeURLSegmentField::class, $urlSegmentField); + + $this->assertSame('http://one.example.org/', $urlSegmentField->getURLPrefix()); + } }