diff --git a/_config/config.yml b/_config/config.yml index 2e04505..e9b0809 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,6 +1,8 @@ --- -Name: mysiteconfig -After: 'framework/*','cms/*' +Name: subsiteconfig +After: + - 'framework/*' + - 'cms/*' --- AssetAdmin: treats_subsite_0_as_global: true diff --git a/code/extensions/ErrorPageSubsite.php b/code/extensions/ErrorPageSubsite.php index 0e620ca..d82fbf7 100644 --- a/code/extensions/ErrorPageSubsite.php +++ b/code/extensions/ErrorPageSubsite.php @@ -4,14 +4,15 @@ class ErrorPageSubsite extends DataExtension { /** * Alter file path to generated a static (static) error page file to handle error page template on different sub-sites * - * @see Error::get_filepath_for_errorcode() + * {@see Error::get_error_filename()} * * FIXME since {@link Subsite::currentSubsite()} partly relies on Session, viewing other sub-site (including main site) between - * opening ErrorPage in the CMS and publish ErrorPage causes static error page to get generated incorrectly. + * opening ErrorPage in the CMS and publish ErrorPage causes static error page to get generated incorrectly. + * + * @param string $name Filename to write to + * @param int $statusCode Integer error code */ - function alternateFilepathForErrorcode($statusCode, $locale = null) { - $static_filepath = Config::inst()->get($this->owner->ClassName, 'static_filepath'); - $subdomainPart = ""; + public function updateErrorFilename(&$name, $statusCode) { // Try to get current subsite from session $subsite = Subsite::currentSubsite(false); @@ -19,22 +20,18 @@ class ErrorPageSubsite extends DataExtension { // since this function is called from Page class before the controller is created, we have to get subsite from domain instead if(!$subsite) { $subsiteID = Subsite::getSubsiteIDForDomain(); - if($subsiteID != 0) $subsite = DataObject::get_by_id("Subsite", $subsiteID); - else $subsite = null; - } - - if($subsite) { - $subdomain = $subsite->domain(); - $subdomainPart = "-{$subdomain}"; - } - - if(singleton('SiteTree')->hasExtension('Translatable') && $locale && $locale != Translatable::default_locale()) { - $filepath = $static_filepath . "/error-{$statusCode}-{$locale}{$subdomainPart}.html"; - } else { - $filepath = $static_filepath . "/error-{$statusCode}{$subdomainPart}.html"; + if($subsiteID != 0) { + $subsite = DataObject::get_by_id("Subsite", $subsiteID); + } } - return $filepath; + // Without subsite, don't rewrite + if($subsite) { + // Add subdomain to end of filename, just before .html + // This should preserve translatable locale in the filename as well + $subdomain = $subsite->domain(); + $name = substr($name, 0, -5) . "-{$subdomain}.html"; + } } } \ No newline at end of file diff --git a/code/extensions/FileSubsites.php b/code/extensions/FileSubsites.php index 44eb3b0..9504340 100644 --- a/code/extensions/FileSubsites.php +++ b/code/extensions/FileSubsites.php @@ -57,7 +57,7 @@ class FileSubsites extends DataExtension { /** * Update any requests to limit the results to the current site */ - public function augmentSQL(SQLSelect $query) { + public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) { if(Subsite::$disable_subsite_filter) return; // If you're querying by ID, ignore the sub-site - this is a bit ugly... (but it was WAYYYYYYYYY worse) diff --git a/code/extensions/GroupSubsites.php b/code/extensions/GroupSubsites.php index dcd3e6e..415b66e 100644 --- a/code/extensions/GroupSubsites.php +++ b/code/extensions/GroupSubsites.php @@ -107,7 +107,7 @@ class GroupSubsites extends DataExtension implements PermissionProvider { /** * Update any requests to limit the results to the current site */ - public function augmentSQL(SQLSelect $query) { + public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) { if(Subsite::$disable_subsite_filter) return; if(Cookie::get('noSubsiteFilter') == 'true') return; diff --git a/code/extensions/SiteConfigSubsites.php b/code/extensions/SiteConfigSubsites.php index 21a441d..abc5474 100644 --- a/code/extensions/SiteConfigSubsites.php +++ b/code/extensions/SiteConfigSubsites.php @@ -12,7 +12,7 @@ class SiteConfigSubsites extends DataExtension { /** * Update any requests to limit the results to the current site */ - public function augmentSQL(SQLSelect $query) { + public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) { if(Subsite::$disable_subsite_filter) return; // If you're querying by ID, ignore the sub-site - this is a bit ugly... diff --git a/code/extensions/SiteTreeSubsites.php b/code/extensions/SiteTreeSubsites.php index 92b42ac..7d54144 100644 --- a/code/extensions/SiteTreeSubsites.php +++ b/code/extensions/SiteTreeSubsites.php @@ -25,7 +25,7 @@ class SiteTreeSubsites extends DataExtension { /** * Update any requests to limit the results to the current site */ - public function augmentSQL(SQLSelect $query, DataQuery &$dataQuery = null) { + public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) { if(Subsite::$disable_subsite_filter) return; if($dataQuery->getQueryParam('Subsite.filter') === false) return; diff --git a/tests/SiteTreeSubsitesTest.php b/tests/SiteTreeSubsitesTest.php index 1ea8202..aab9b2b 100644 --- a/tests/SiteTreeSubsitesTest.php +++ b/tests/SiteTreeSubsitesTest.php @@ -6,7 +6,8 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { protected $extraDataObjects = array( 'SiteTreeSubsitesTest_ClassA', - 'SiteTreeSubsitesTest_ClassB' + 'SiteTreeSubsitesTest_ClassB', + 'SiteTreeSubsitesTest_ErrorPage' ); protected $illegalExtensions = array( @@ -55,10 +56,9 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); Subsite::changeSubsite($subsite1->ID); - $path = ErrorPage::get_filepath_for_errorcode(500); + $path = SiteTreeSubsitesTest_ErrorPage::get_error_filename_spy(500); - $static_path = Config::inst()->get('ErrorPage', 'static_filepath'); - $expected_path = $static_path . '/error-500-'.$subsite1->domain().'.html'; + $expected_path = 'error-500-'.$subsite1->domain().'.html'; $this->assertEquals($expected_path, $path); } @@ -201,3 +201,16 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly {} class SiteTreeSubsitesTest_ClassB extends SiteTree implements TestOnly {} + +class SiteTreeSubsitesTest_ErrorPage extends ErrorPage implements TestOnly { + + /** + * Helper method to call protected members + * + * @param int $statusCode + * @return string + */ + public static function get_error_filename_spy($statusCode) { + return self::get_error_filename($statusCode); + } +} \ No newline at end of file diff --git a/tests/SubsiteTest.yml b/tests/SubsiteTest.yml index e4b0ef6..96bffb3 100644 --- a/tests/SubsiteTest.yml +++ b/tests/SubsiteTest.yml @@ -1,184 +1,184 @@ Subsite: - main: - Title: Template - subsite1: - Title: Subsite1 Template - subsite2: - Title: Subsite2 Template - domaintest1: - Title: Test 1 - domaintest2: - Title: Test 2 - domaintest3: - Title: Test 3 + main: + Title: 'Template' + subsite1: + Title: 'Subsite1 Template' + subsite2: + Title: 'Subsite2 Template' + domaintest1: + Title: 'Test 1' + domaintest2: + Title: 'Test 2' + domaintest3: + Title: 'Test 3' SubsiteDomain: - subsite1: - SubsiteID: =>Subsite.subsite1 - Domain: subsite1.* - subsite2: - SubsiteID: =>Subsite.subsite2 - Domain: subsite2.* - dt1a: - SubsiteID: =>Subsite.domaintest1 - Domain: one.example.org - IsPrimary: 1 - dt1b: - SubsiteID: =>Subsite.domaintest1 - Domain: one.* - dt2a: - SubsiteID: =>Subsite.domaintest2 - Domain: two.mysite.com - IsPrimary: 1 - dt2b: - SubsiteID: =>Subsite.domaintest2 - Domain: *.mysite.com - dt3: - SubsiteID: =>Subsite.domaintest3 - Domain: three.* - IsPrimary: 1 + subsite1: + SubsiteID: =>Subsite.subsite1 + Domain: 'subsite1.*' + subsite2: + SubsiteID: =>Subsite.subsite2 + Domain: 'subsite2.*' + dt1a: + SubsiteID: =>Subsite.domaintest1 + Domain: 'one.example.org' + IsPrimary: 1 + dt1b: + SubsiteID: =>Subsite.domaintest1 + Domain: 'one.*' + dt2a: + SubsiteID: =>Subsite.domaintest2 + Domain: 'two.mysite.com' + IsPrimary: 1 + dt2b: + SubsiteID: =>Subsite.domaintest2 + Domain: '*.mysite.com' + dt3: + SubsiteID: =>Subsite.domaintest3 + Domain: 'three.*' + IsPrimary: 1 Page: - mainSubsitePage: - Title: MainSubsitePage - SubsiteID: 0 - home: - Title: Home - SubsiteID: =>Subsite.main - about: - Title: About - SubsiteID: =>Subsite.main - linky: - Title: Linky - SubsiteID: =>Subsite.main - staff: - Title: Staff - ParentID: =>Page.about - SubsiteID: =>Subsite.main - contact: - Title: Contact Us - SubsiteID: =>Subsite.main - importantpage: - Title: Important Page - SubsiteID: =>Subsite.main - subsite1_home: - Title: Home (Subsite 1) - SubsiteID: =>Subsite.subsite1 - subsite1_contactus: - Title: Contact Us (Subsite 1) - SubsiteID: =>Subsite.subsite1 - subsite1_staff: - Title: Staff - SubsiteID: =>Subsite.subsite1 - subsite2_home: - Title: Home (Subsite 2) - SubsiteID: =>Subsite.subsite2 - subsite2_contactus: - Title: Contact Us (Subsite 2) - SubsiteID: =>Subsite.subsite2 + mainSubsitePage: + Title: 'MainSubsitePage' + SubsiteID: 0 + home: + Title: 'Home' + SubsiteID: =>Subsite.main + about: + Title: 'About' + SubsiteID: =>Subsite.main + linky: + Title: 'Linky' + SubsiteID: =>Subsite.main + staff: + Title: 'Staff' + ParentID: =>Page.about + SubsiteID: =>Subsite.main + contact: + Title: 'Contact Us' + SubsiteID: =>Subsite.main + importantpage: + Title: 'Important Page' + SubsiteID: =>Subsite.main + subsite1_home: + Title: 'Home (Subsite 1)' + SubsiteID: =>Subsite.subsite1 + subsite1_contactus: + Title: 'Contact Us (Subsite 1)' + SubsiteID: =>Subsite.subsite1 + subsite1_staff: + Title: 'Staff' + SubsiteID: =>Subsite.subsite1 + subsite2_home: + Title: 'Home (Subsite 2)' + SubsiteID: =>Subsite.subsite2 + subsite2_contactus: + Title: 'Contact Us (Subsite 2)' + SubsiteID: =>Subsite.subsite2 PermissionRoleCode: - roleCode1: - Code: CMS_ACCESS_CMSMain + roleCode1: + Code: CMS_ACCESS_CMSMain PermissionRole: - role1: - Title: role1 - Codes: =>PermissionRoleCode.roleCode1 + role1: + Title: role1 + Codes: =>PermissionRoleCode.roleCode1 Group: - admin: - Title: Admin - Code: admin - AccessAllSubsites: 1 - editor: - Title: Editor - Code: editor - AccessAllSubsites: 1 - subsite1_group: - Title: subsite1_group - Code: subsite1_group - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite1 - subsite2_group: - Title: subsite2_group - Code: subsite2_group - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite2 - subsite1admins: - Title: subsite1admins - Code: subsite1admins - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite1 - allsubsitesauthors: - Title: allsubsitesauthors - Code: allsubsitesauthors - AccessAllSubsites: 1 - subsite1_group_via_role: - Title: subsite1_group_via_role - Code: subsite1_group_via_role - AccessAllSubsites: 1 - Roles: =>PermissionRole.role1 + admin: + Title: Admin + Code: admin + AccessAllSubsites: 1 + editor: + Title: Editor + Code: editor + AccessAllSubsites: 1 + subsite1_group: + Title: subsite1_group + Code: subsite1_group + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite1 + subsite2_group: + Title: subsite2_group + Code: subsite2_group + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite2 + subsite1admins: + Title: subsite1admins + Code: subsite1admins + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite1 + allsubsitesauthors: + Title: allsubsitesauthors + Code: allsubsitesauthors + AccessAllSubsites: 1 + subsite1_group_via_role: + Title: subsite1_group_via_role + Code: subsite1_group_via_role + AccessAllSubsites: 1 + Roles: =>PermissionRole.role1 Permission: - admin: - Code: ADMIN - GroupID: =>Group.admin - editor1: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.editor - editor2: - Code: SITETREE_VIEW_ALL - GroupID: =>Group.editor - editor3: - Code: VIEW_DRAFT_CONTENT - GroupID: =>Group.editor - accesscmsmain1: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1_group - accesscmsmain2: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite2_group - accesscmsmain3: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1admins - accesscmsmain4: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.allsubsitesauthors - securityaccess1: - Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite1_group - securityaccess2: - Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite2_group - adminsubsite1: - Code: ADMIN - GroupID: =>Group.subsite1admins + admin: + Code: ADMIN + GroupID: =>Group.admin + editor1: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.editor + editor2: + Code: SITETREE_VIEW_ALL + GroupID: =>Group.editor + editor3: + Code: VIEW_DRAFT_CONTENT + GroupID: =>Group.editor + accesscmsmain1: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite1_group + accesscmsmain2: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite2_group + accesscmsmain3: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite1admins + accesscmsmain4: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.allsubsitesauthors + securityaccess1: + Code: CMS_ACCESS_SecurityAdmin + GroupID: =>Group.subsite1_group + securityaccess2: + Code: CMS_ACCESS_SecurityAdmin + GroupID: =>Group.subsite2_group + adminsubsite1: + Code: ADMIN + GroupID: =>Group.subsite1admins Member: - admin: - FirstName: Admin - Surname: User - Email: admin@test.com - Password: rangi - Groups: =>Group.admin - editor: - FirstName: Editor - Surname: User - Email: editor@test.com - Password: rangi - Groups: =>Group.editor - subsite1member: - Email: subsite1member@test.com - Groups: =>Group.subsite1_group - subsite2member: - Email: subsite2member@test.com - Groups: =>Group.subsite2_group - subsite1admin: - Email: subsite1admin@test.com - Groups: =>Group.subsite1admins - allsubsitesauthor: - Email: allsubsitesauthor@test.com - Groups: =>Group.allsubsitesauthors - subsite1member2: - Email: subsite1member2@test.com - Groups: =>Group.subsite1_group_via_role + admin: + FirstName: Admin + Surname: User + Email: admin@test.com + Password: rangi + Groups: =>Group.admin + editor: + FirstName: Editor + Surname: User + Email: editor@test.com + Password: rangi + Groups: =>Group.editor + subsite1member: + Email: subsite1member@test.com + Groups: =>Group.subsite1_group + subsite2member: + Email: subsite2member@test.com + Groups: =>Group.subsite2_group + subsite1admin: + Email: subsite1admin@test.com + Groups: =>Group.subsite1admins + allsubsitesauthor: + Email: allsubsitesauthor@test.com + Groups: =>Group.allsubsitesauthors + subsite1member2: + Email: subsite1member2@test.com + Groups: =>Group.subsite1_group_via_role SiteConfig: - config: - CanCreateTopLevelType: LoggedInUsers \ No newline at end of file + config: + CanCreateTopLevelType: LoggedInUsers diff --git a/tests/SubsitesVirtualPageTest.php b/tests/SubsitesVirtualPageTest.php index 1822b51..59eab99 100644 --- a/tests/SubsitesVirtualPageTest.php +++ b/tests/SubsitesVirtualPageTest.php @@ -5,26 +5,29 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { 'subsites/tests/SubsiteTest.yml', 'subsites/tests/SubsitesVirtualPageTest.yml', ); - - function setUp() { + + public function setUp() { parent::setUp(); - $this->logInWithPermission('ADMIN'); - - $fh = fopen(Director::baseFolder() . '/assets/testscript-test-file.pdf', "w"); - fwrite($fh, str_repeat('x',1000000)); - fclose($fh); + + // Set backend root to /DataDifferencerTest + AssetStoreTest_SpyStore::activate('SubsitesVirtualPageTest'); + + // Create a test files for each of the fixture references + $file = $this->objFromFixture('File', 'file1'); + $page = $this->objFromFixture('SiteTree', 'page1'); + $fromPath = __DIR__ . '/testscript-test-file.pdf'; + $destPath = AssetStoreTest_SpyStore::getLocalPath($file); + Filesystem::makeFolder(dirname($destPath)); + copy($fromPath, $destPath); + + // Hack in site link tracking after the fact + $page->Content = '

'; + $page->write(); } - function tearDown() { + public function tearDown() { + AssetStoreTest_SpyStore::reset(); parent::tearDown(); - $testFiles = array( - '/assets/testscript-test-file.pdf', - '/assets/renamed-test-file.pdf', - '/assets/renamed-test-file-second-time.pdf', - ); - foreach($testFiles as $file) { - if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file); - } } // Attempt to bring main:linky to subsite2:linky @@ -52,7 +55,6 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { function testFileLinkRewritingOnVirtualPages() { // File setup $this->logInWithPermission('ADMIN'); - touch(Director::baseFolder() . '/assets/testscript-test-file.pdf'); // Publish the source page $page = $this->objFromFixture('SiteTree', 'page1'); @@ -70,19 +72,10 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { $file->write(); // Verify that the draft and publish virtual pages both have the corrected link - $this->assertContains('assertContains('ID")->value()); - $this->assertContains('assertContains('ID")->value()); - - // File teardown - $testFiles = array( - '/assets/testscript-test-file.pdf', - '/assets/renamed-test-file.pdf', - ); - foreach($testFiles as $file) { - if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file); - } } function testSubsiteVirtualPagesArentInappropriatelyPublished() { diff --git a/tests/SubsitesVirtualPageTest.yml b/tests/SubsitesVirtualPageTest.yml index 4708448..501d547 100644 --- a/tests/SubsitesVirtualPageTest.yml +++ b/tests/SubsitesVirtualPageTest.yml @@ -1,10 +1,12 @@ # These need to come first so that SiteTree has the link meta-data written. File: - file1: - Filename: assets/testscript-test-file.pdf + file1: + FileFilename: testscript-test-file.pdf + FileHash: 464dedb70af0dc7f8f3360e7f3ae43cbbf1cdf4e + Name: testscript-test-file.pdf SiteTree: - page1: - Title: page1 - URLSegment: page1 - Content:

\ No newline at end of file + page1: + Title: page1 + URLSegment: page1 + Content: '

' diff --git a/tests/testscript-test-file.pdf b/tests/testscript-test-file.pdf new file mode 100644 index 0000000..701b639 Binary files /dev/null and b/tests/testscript-test-file.pdf differ