From 03e52101bb8f59f56fad9f060a0e7f82afae24cd Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Wed, 2 Aug 2017 15:51:37 +1200 Subject: [PATCH] Revert "SS4 namespaces compatibility" This reverts commit e8f5f58bb082794350558daca29e6321f5437e38. --- _config.php | 20 +- _config/config.yml | 2 +- code/SubsiteAdmin.php | 4 +- code/SubsiteReportWrapper.php | 6 +- code/SubsiteXHRController.php | 4 +- code/SubsitesVirtualPage.php | 121 ++++++------ .../CMSPageAddControllerExtension.php | 3 - code/extensions/ControllerSubsites.php | 3 - code/extensions/ErrorPageSubsite.php | 3 - code/extensions/FileSubsites.php | 10 - code/extensions/GroupSubsites.php | 46 ++--- code/extensions/LeftAndMainSubsites.php | 19 +- code/extensions/SiteConfigSubsites.php | 8 +- code/extensions/SiteTreeSubsites.php | 74 +++----- code/extensions/SubsiteMenuExtension.php | 2 - code/forms/GridFieldSubsiteDetailForm.php | 4 - code/forms/SubsitesTreeDropdownField.php | 7 +- code/model/Subsite.php | 174 ++++++++---------- code/model/SubsiteDomain.php | 6 - code/tasks/SubsiteCopyPagesTask.php | 6 +- composer.json | 3 +- css/LeftAndMain_Subsites.css | 7 +- templates/LeftAndMain_Menu.ss | 45 +++++ .../Admin/Includes/LeftAndMain_Menu.ss | 18 -- tests/BaseSubsiteTest.php | 2 - tests/FileSubsitesTest.php | 10 +- tests/GroupSubsitesTest.php | 5 +- tests/LeftAndMainSubsitesTest.php | 34 ++-- tests/SiteConfigSubsitesTest.php | 2 - tests/SiteTreeSubsitesTest.php | 107 +++++------ tests/SubsiteAdminFunctionalTest.php | 16 +- tests/SubsiteAdminTest.php | 8 +- tests/SubsiteTest.php | 21 +-- tests/SubsiteTest.yml | 52 +++--- tests/SubsitesVirtualPageTest.php | 17 +- tests/SubsitesVirtualPageTest.yml | 4 +- .../bootstrap/Context/FeatureContext.php | 13 +- 37 files changed, 365 insertions(+), 521 deletions(-) create mode 100644 templates/LeftAndMain_Menu.ss delete mode 100644 templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss diff --git a/_config.php b/_config.php index 93cca78..0cbece5 100644 --- a/_config.php +++ b/_config.php @@ -1,21 +1,5 @@ Fields()->dataFieldByName('Subsite'); if($grid) { - $grid->getConfig()->removeComponentsByType('SilverStripe\\Forms\\GridField\\GridFieldDetailForm'); + $grid->getConfig()->removeComponentsByType('GridFieldDetailForm'); $grid->getConfig()->addComponent(new GridFieldSubsiteDetailForm()); } diff --git a/code/SubsiteReportWrapper.php b/code/SubsiteReportWrapper.php index 104499d..2774cfc 100644 --- a/code/SubsiteReportWrapper.php +++ b/code/SubsiteReportWrapper.php @@ -1,14 +1,10 @@ renderWith('Includes/SubsiteList'); + return $this->renderWith('SubsiteList'); } } diff --git a/code/SubsitesVirtualPage.php b/code/SubsitesVirtualPage.php index 72b5b0b..c63fa13 100644 --- a/code/SubsitesVirtualPage.php +++ b/code/SubsitesVirtualPage.php @@ -1,17 +1,4 @@ 'Text', 'CustomExtraMeta' => 'HTMLText' ); - + public function getCMSFields() { $fields = parent::getCMSFields(); - + $subsites = DataObject::get('Subsite'); if(!$subsites) { $subsites = new ArrayList(); }else { $subsites=ArrayList::create($subsites->toArray()); } - + $subsites->push(new ArrayData(array('Title' => 'Main site', 'ID' => 0))); $fields->addFieldToTab( 'Root.Main', DropdownField::create( - "CopyContentFromID_SubsiteID", - _t('SubsitesVirtualPage.SubsiteField',"Subsite"), + "CopyContentFromID_SubsiteID", + _t('SubsitesVirtualPage.SubsiteField',"Subsite"), $subsites->map('ID', 'Title') )->addExtraClass('subsitestreedropdownfield-chooser no-change-track'), 'CopyContentFromID' ); - + // Setup the linking to the original page. $pageSelectionField = new SubsitesTreeDropdownField( - "CopyContentFromID", - _t('VirtualPage.CHOOSE', "Choose a page to link to"), - "SilverStripe\\CMS\\Model\\SiteTree", + "CopyContentFromID", + _t('VirtualPage.CHOOSE', "Choose a page to link to"), + "SiteTree", "ID", "MenuTitle" ); - + if(Controller::has_curr() && Controller::curr()->getRequest()) { $subsiteID = Controller::curr()->getRequest()->requestVar('CopyContentFromID_SubsiteID'); $pageSelectionField->setSubsiteID($subsiteID); } $fields->replaceField('CopyContentFromID', $pageSelectionField); - + // Create links back to the original object in the CMS if($this->CopyContentFromID) { $editLink = "admin/pages/edit/show/$this->CopyContentFromID/?SubsiteID=" . $this->CopyContentFrom()->SubsiteID; $linkToContent = " - " . - _t('VirtualPage.EDITCONTENT', 'Click here to edit the content') . + " . + _t('VirtualPage.EDITCONTENT', 'Click here to edit the content') . ""; $fields->removeByName("VirtualPageContentLinkLabel"); $fields->addFieldToTab( - "Root.Main", + "Root.Main", $linkToContentLabelField = new LabelField('VirtualPageContentLinkLabel', $linkToContent), 'Title' ); $linkToContentLabelField->setAllowHTML(true); } - - + + $fields->addFieldToTab( - 'Root.Main', + 'Root.Main', TextField::create( - 'CustomMetaTitle', + 'CustomMetaTitle', $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote', 'Overrides inherited value from the source')), + )->setDescription(_t('SubsitesVirtualPage.OverrideNote', 'Overrides inherited value from the source')), 'MetaTitle' ); $fields->addFieldToTab( - 'Root.Main', + 'Root.Main', TextareaField::create( - 'CustomMetaKeywords', + 'CustomMetaKeywords', $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), 'MetaKeywords' ); $fields->addFieldToTab( - 'Root.Main', + 'Root.Main', TextareaField::create( - 'CustomMetaDescription', + 'CustomMetaDescription', $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), 'MetaDescription' ); $fields->addFieldToTab( - 'Root.Main', + 'Root.Main', TextField::create( - 'CustomExtraMeta', + 'CustomExtraMeta', $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), 'ExtraMeta' ); - + return $fields; } @@ -126,73 +113,73 @@ class SubsitesVirtualPage extends VirtualPage { public function getCopyContentFromID_SubsiteID() { return ($this->CopyContentFromID) ? (int)$this->CopyContentFrom()->SubsiteID : (int)Session::get('SubsiteID'); } - + public function getVirtualFields() { $fields = parent::getVirtualFields(); foreach($fields as $k => $v) { if($v == 'SubsiteID') unset($fields[$k]); } - + foreach(self::$db as $field => $type) if (in_array($field, $fields)) unset($fields[array_search($field, $fields)]); return $fields; } - + public function syncLinkTracking() { $oldState = Subsite::$disable_subsite_filter; Subsite::$disable_subsite_filter = true; - if ($this->CopyContentFromID) $this->HasBrokenLink = DataObject::get_by_id('SilverStripe\\CMS\\Model\\SiteTree', $this->CopyContentFromID) ? false : true; + if ($this->CopyContentFromID) $this->HasBrokenLink = DataObject::get_by_id('SiteTree', $this->CopyContentFromID) ? false : true; Subsite::$disable_subsite_filter = $oldState; } public function onBeforeWrite() { parent::onBeforeWrite(); - + if($this->CustomMetaTitle) $this->MetaTitle = $this->CustomMetaTitle; else { - $this->MetaTitle = $this->ContentSource()->MetaTitle ? $this->ContentSource()->MetaTitle : $this->MetaTitle; + $this->MetaTitle = $this->ContentSource()->MetaTitle ? $this->ContentSource()->MetaTitle : $this->MetaTitle; } if($this->CustomMetaKeywords) $this->MetaKeywords = $this->CustomMetaKeywords; else { - $this->MetaKeywords = $this->ContentSource()->MetaKeywords ? $this->ContentSource()->MetaKeywords : $this->MetaKeywords; + $this->MetaKeywords = $this->ContentSource()->MetaKeywords ? $this->ContentSource()->MetaKeywords : $this->MetaKeywords; } if($this->CustomMetaDescription) $this->MetaDescription = $this->CustomMetaDescription; else { - $this->MetaDescription = $this->ContentSource()->MetaDescription ? $this->ContentSource()->MetaDescription : $this->MetaDescription; + $this->MetaDescription = $this->ContentSource()->MetaDescription ? $this->ContentSource()->MetaDescription : $this->MetaDescription; } if($this->CustomExtraMeta) $this->ExtraMeta = $this->CustomExtraMeta; else { - $this->ExtraMeta = $this->ContentSource()->ExtraMeta ? $this->ContentSource()->ExtraMeta : $this->ExtraMeta; + $this->ExtraMeta = $this->ContentSource()->ExtraMeta ? $this->ContentSource()->ExtraMeta : $this->ExtraMeta; } } - + public 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(Config::inst()->get('SilverStripe\\CMS\\Model\\SiteTree', 'nested_urls')) { + if(Config::inst()->get('SiteTree', 'nested_urls')) { if($this->ParentID) { $parentFilter = " AND \"SiteTree\".\"ParentID\" = $this->ParentID"; } else { $parentFilter = ' AND "SiteTree"."ParentID" = 0'; } } - + $origDisableSubsiteFilter = Subsite::$disable_subsite_filter; Subsite::$disable_subsite_filter = true; $existingPage = DataObject::get_one( - 'SilverStripe\\CMS\\Model\\SiteTree', + 'SiteTree', "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter", false // disable cache, it doesn't include subsite status in the key ); Subsite::$disable_subsite_filter = $origDisableSubsiteFilter; $existingPageInSubsite = DataObject::get_one( - 'SilverStripe\\CMS\\Model\\SiteTree', + 'SiteTree', "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter", false // disable cache, it doesn't include subsite status in the key ); @@ -201,7 +188,25 @@ class SubsitesVirtualPage extends VirtualPage { // be more specific and allow same URLSegments in different subsites $isValid = !($existingPage && $existingPageInSubsite); } - + return $isValid; } } + +class SubsitesVirtualPage_Controller extends VirtualPage_Controller { + + public function reloadContent() { + $this->failover->copyFrom($this->failover->CopyContentFrom()); + $this->failover->write(); + return; + } + + public function init(){ + $origDisableSubsiteFilter = Subsite::$disable_subsite_filter; + Subsite::$disable_subsite_filter = true; + + parent::init(); + + Subsite::$disable_subsite_filter = $origDisableSubsiteFilter; + } +} diff --git a/code/extensions/CMSPageAddControllerExtension.php b/code/extensions/CMSPageAddControllerExtension.php index 97f6309..8db4418 100644 --- a/code/extensions/CMSPageAddControllerExtension.php +++ b/code/extensions/CMSPageAddControllerExtension.php @@ -1,7 +1,4 @@ 0'); - + // Migrate global-access data DB::query('UPDATE "Group" SET "AccessAllSubsites" = 1 WHERE "SubsiteID" = 0'); - + // Move the field out of the way so that this migration doesn't get executed again DB::get_schema()->renameField('Group', 'SubsiteID', '_obsolete_SubsiteID'); - + // No subsite access on anything means that we've just installed the subsites module. // Make all previous groups global-access groups - } else if(!DB::query('SELECT "Group"."ID" FROM "Group" + } else if(!DB::query('SELECT "Group"."ID" FROM "Group" LEFT JOIN "Group_Subsites" ON "Group_Subsites"."GroupID" = "Group"."ID" AND "Group_Subsites"."SubsiteID" > 0 WHERE "AccessAllSubsites" = 1 OR "Group_Subsites"."GroupID" IS NOT NULL ')->value()) { - + DB::query('UPDATE "Group" SET "AccessAllSubsites" = 1'); } } - + function updateCMSFields(FieldList $fields) { if($this->owner->canEdit() ){ // i18n tab @@ -70,11 +58,11 @@ class GroupSubsites extends DataExtension implements PermissionProvider { // Prevent XSS injection $subsiteMap = Convert::raw2xml($subsiteMap); - + // Interface is different if you have the rights to modify subsite group values on // all subsites if(isset($subsiteMap[0])) { - $fields->addFieldToTab("Root.Subsites", new OptionsetField("AccessAllSubsites", + $fields->addFieldToTab("Root.Subsites", new OptionsetField("AccessAllSubsites", _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), array( 1 => _t('GroupSubsites.ACCESSALL', "All subsites"), @@ -88,11 +76,11 @@ class GroupSubsites extends DataExtension implements PermissionProvider { } else { if (sizeof($subsiteMap) <= 1) { - $fields->addFieldToTab("Root.Subsites", new ReadonlyField("SubsitesHuman", + $fields->addFieldToTab("Root.Subsites", new ReadonlyField("SubsitesHuman", _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), reset($subsiteMap))); } else { - $fields->addFieldToTab("Root.Subsites", new CheckboxSetField("Subsites", + $fields->addFieldToTab("Root.Subsites", new CheckboxSetField("Subsites", _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), $subsiteMap)); } @@ -128,7 +116,7 @@ class GroupSubsites extends DataExtension implements PermissionProvider { /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; else */$subsiteID = (int)Subsite::currentSubsiteID(); - + // Don't filter by Group_Subsites if we've already done that $hasGroupSubsites = false; foreach($query->getFrom() as $item) { @@ -137,10 +125,10 @@ class GroupSubsites extends DataExtension implements PermissionProvider { break; } } - + if(!$hasGroupSubsites) { if($subsiteID) { - $query->addLeftJoin("Group_Subsites", "\"Group_Subsites\".\"GroupID\" + $query->addLeftJoin("Group_Subsites", "\"Group_Subsites\".\"GroupID\" = \"Group\".\"ID\" AND \"Group_Subsites\".\"SubsiteID\" = $subsiteID"); $query->addWhere("(\"Group_Subsites\".\"SubsiteID\" IS NOT NULL OR \"Group\".\"AccessAllSubsites\" = 1)"); @@ -148,7 +136,7 @@ class GroupSubsites extends DataExtension implements PermissionProvider { $query->addWhere("\"Group\".\"AccessAllSubsites\" = 1"); } } - + // WORKAROUND for databases that complain about an ORDER BY when the column wasn't selected (e.g. SQL Server) $select=$query->getSelect(); if(isset($select[0]) && !$select[0] == 'COUNT(*)') { @@ -164,7 +152,7 @@ class GroupSubsites extends DataExtension implements PermissionProvider { $this->owner->AccessAllSubsites = 1; } } - + function onAfterWrite() { // New record test approximated by checking whether the ID has changed. // Note also that the after write test is only used when we're on a subsite @@ -178,7 +166,7 @@ class GroupSubsites extends DataExtension implements PermissionProvider { // Find the sites that this group belongs to and the sites where we have appropriate perm. $accessibleSites = Subsite::accessible_sites('CMS_ACCESS_SecurityAdmin')->column('ID'); $linkedSites = $this->owner->Subsites()->column('ID'); - + // We are allowed to access this site if at we have CMS_ACCESS_SecurityAdmin permission on // at least one of the sites return (bool)array_intersect($accessibleSites, $linkedSites); diff --git a/code/extensions/LeftAndMainSubsites.php b/code/extensions/LeftAndMainSubsites.php index 840168f..ae07712 100644 --- a/code/extensions/LeftAndMainSubsites.php +++ b/code/extensions/LeftAndMainSubsites.php @@ -1,19 +1,4 @@ duplicateToSubsite($subsite->ID, true); $response = $this->owner->getResponse(); diff --git a/code/extensions/SiteConfigSubsites.php b/code/extensions/SiteConfigSubsites.php index f2d9979..abc5474 100644 --- a/code/extensions/SiteConfigSubsites.php +++ b/code/extensions/SiteConfigSubsites.php @@ -1,11 +1,5 @@ 'Subsite', // The subsite that this page belongs to ); - + /** * Update any requests to limit the results to the current site */ diff --git a/code/extensions/SiteTreeSubsites.php b/code/extensions/SiteTreeSubsites.php index e99af73..9c3bab4 100644 --- a/code/extensions/SiteTreeSubsites.php +++ b/code/extensions/SiteTreeSubsites.php @@ -1,20 +1,5 @@ 'SilverStripe\\CMS\\Model\\SiteTree' // Stored separately, as the logic for URL rewriting is different + 'CrossSubsiteLinkTracking' => 'SiteTree' // Stored separately, as the logic for URL rewriting is different ); private static $many_many_extraFields = array( @@ -36,14 +21,14 @@ class SiteTreeSubsites extends DataExtension { if($this->owner->SubsiteID == 0) return true; return false; } - + /** * Update any requests to limit the results to the current site */ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null) { if(Subsite::$disable_subsite_filter) return; if($dataQuery->getQueryParam('Subsite.filter') === false) return; - + // If you're querying by ID, ignore the sub-site - this is a bit ugly... // if(!$query->where || (strpos($query->where[0], ".\"ID\" = ") === false && strpos($query->where[0], ".`ID` = ") === false && strpos($query->where[0], ".ID = ") === false && strpos($query->where[0], "ID = ") !== 0)) { if($query->filtersOnID()) return; @@ -62,10 +47,10 @@ class SiteTreeSubsites extends DataExtension { break; } } - + function onBeforeWrite() { if(!$this->owner->ID && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID(); - + parent::onBeforeWrite(); } @@ -73,7 +58,7 @@ class SiteTreeSubsites extends DataExtension { $subsites = Subsite::accessible_sites("CMS_ACCESS_CMSMain"); $subsitesMap = array(); if($subsites && $subsites->Count()) { - $subsitesMap = $subsites->map('ID', 'Title')->toArray(); + $subsitesMap = $subsites->map('ID', 'Title'); unset($subsitesMap[$this->owner->SubsiteID]); } @@ -83,8 +68,8 @@ class SiteTreeSubsites extends DataExtension { $fields->addFieldToTab( 'Root.Main', new DropdownField( - "CopyToSubsiteID", - _t('SiteTreeSubsites.CopyToSubsite', "Copy page to subsite"), + "CopyToSubsiteID", + _t('SiteTreeSubsites.CopyToSubsite', "Copy page to subsite"), $subsitesMap, '' ) @@ -92,30 +77,31 @@ class SiteTreeSubsites extends DataExtension { $fields->addFieldToTab( 'Root.Main', $copyAction = new InlineFormAction( - "copytosubsite", + "copytosubsite", _t('SiteTreeSubsites.CopyAction', "Copy") ) ); + $copyAction->includeDefaultJS(false); } // replace readonly link prefix $subsite = $this->owner->Subsite(); - $nested_urls_enabled = Config::inst()->get('SilverStripe\\CMS\\Model\\SiteTree', 'nested_urls'); + $nested_urls_enabled = Config::inst()->get('SiteTree', 'nested_urls'); if($subsite && $subsite->ID) { $baseUrl = Director::protocol() . $subsite->domain() . '/'; $baseLink = Controller::join_links ( $baseUrl, ($nested_urls_enabled && $this->owner->ParentID ? $this->owner->Parent()->RelativeLink(true) : null) ); - + $urlsegment = $fields->dataFieldByName('URLSegment'); $urlsegment->setURLPrefix($baseLink); } } - + function alternateSiteConfig() { if(!$this->owner->SubsiteID) return false; - $sc = DataObject::get_one('SilverStripe\\SiteConfig\\SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); + $sc = DataObject::get_one('SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); if(!$sc) { $sc = new SiteConfig(); $sc->SubsiteID = $this->owner->SubsiteID; @@ -125,18 +111,18 @@ class SiteTreeSubsites extends DataExtension { } return $sc; } - + /** * Only allow editing of a page if the member satisfies one of the following conditions: * - Is in a group which has access to the subsite this page belongs to * - Is in a group with edit permissions on the "main site" - * + * * @return boolean */ function canEdit($member = null) { if(!$member) $member = Member::currentUser(); - + // Find the sites that this user has access to $goodSites = Subsite::accessible_sites('CMS_ACCESS_CMSMain',true,'all',$member)->column('ID'); @@ -154,25 +140,25 @@ class SiteTreeSubsites extends DataExtension { // Return true if they have access to this object's site if(!(in_array(0, $goodSites) || in_array($subsiteID, $goodSites))) return false; } - + /** * @return boolean */ function canDelete($member = null) { if(!$member && $member !== FALSE) $member = Member::currentUser(); - + return $this->canEdit($member); } - + /** * @return boolean */ function canAddChildren($member = null) { if(!$member && $member !== FALSE) $member = Member::currentUser(); - + return $this->canEdit($member); } - + /** * @return boolean */ @@ -266,7 +252,7 @@ class SiteTreeSubsites extends DataExtension { $subsite = Subsite::currentSubsite(); if($subsite && $subsite->Theme){ - Config::inst()->update('SilverStripe\\View\\SSViewer', 'theme', Subsite::currentSubsite()->Theme); + Config::inst()->update('SSViewer', 'theme', Subsite::currentSubsite()->Theme); } } @@ -307,22 +293,22 @@ class SiteTreeSubsites extends DataExtension { // Set LinkTracking appropriately $links = HTTP::getLinksIn($this->owner->Content); $linkedPages = array(); - + if($links) foreach($links as $link) { if(substr($link, 0, strlen('http://')) == 'http://') { $withoutHttp = substr($link, strlen('http://')); if(strpos($withoutHttp, '/') && strpos($withoutHttp, '/') < strlen($withoutHttp)) { $domain = substr($withoutHttp, 0, strpos($withoutHttp, '/')); $rest = substr($withoutHttp, strpos($withoutHttp, '/') + 1); - + $subsiteID = Subsite::getSubsiteIDForDomain($domain); if($subsiteID == 0) continue; // We have no idea what the domain for the main site is, so cant track links to it $origDisableSubsiteFilter = Subsite::$disable_subsite_filter; Subsite::disable_subsite_filter(true); - $candidatePage = DataObject::get_one("SilverStripe\\CMS\\Model\\SiteTree", "\"URLSegment\" = '" . Convert::raw2sql(urldecode( $rest)) . "' AND \"SubsiteID\" = " . $subsiteID, false); + $candidatePage = DataObject::get_one("SiteTree", "\"URLSegment\" = '" . Convert::raw2sql(urldecode( $rest)) . "' AND \"SubsiteID\" = " . $subsiteID, false); Subsite::disable_subsite_filter($origDisableSubsiteFilter); - + if($candidatePage) { $linkedPages[] = $candidatePage->ID; } else { @@ -331,17 +317,17 @@ class SiteTreeSubsites extends DataExtension { } } } - + $this->owner->CrossSubsiteLinkTracking()->setByIDList($linkedPages); } - + /** * Return a piece of text to keep DataObject cache keys appropriately specific */ function cacheKeyComponent() { return 'subsite-'.Subsite::currentSubsiteID(); } - + /** * @param Member * @return boolean|null diff --git a/code/extensions/SubsiteMenuExtension.php b/code/extensions/SubsiteMenuExtension.php index fd0d003..aab9af2 100644 --- a/code/extensions/SubsiteMenuExtension.php +++ b/code/extensions/SubsiteMenuExtension.php @@ -1,7 +1,5 @@ subsiteID; } - function tree(HTTPRequest $request) { + function tree(SS_HTTPRequest $request) { $oldSubsiteID = Session::get('SubsiteID'); Session::set('SubsiteID', $this->subsiteID); diff --git a/code/model/Subsite.php b/code/model/Subsite.php index 62baa20..ca77cca 100644 --- a/code/model/Subsite.php +++ b/code/model/Subsite.php @@ -1,31 +1,4 @@ to the request. @@ -36,8 +9,8 @@ class Subsite extends DataObject { /** * @var $use_session_subsiteid Boolean Set to TRUE when using the CMS and FALSE - * when browsing the frontend of a website. - * + * when browsing the frontend of a website. + * * @todo Remove flag once the Subsite CMS works without session state, * similarly to the Translatable module. */ @@ -48,7 +21,7 @@ class Subsite extends DataObject { * to limit DataObject::get*() calls to a specific subsite. Useful for debugging. */ public static $disable_subsite_filter = false; - + /** * Allows you to force a specific subsite ID, or comma separated list of IDs. * Only works for reading. An object cannot be written to more than 1 subsite. @@ -60,10 +33,10 @@ class Subsite extends DataObject { * @var boolean */ public static $write_hostmap = true; - + /** * Memory cache of accessible sites - * + * * @array */ private static $_cache_accessible_sites = array(); @@ -81,7 +54,7 @@ class Subsite extends DataObject { * are listed. */ private static $allowed_themes = array(); - + /** * @var Boolean If set to TRUE, don't assume 'www.example.com' and 'example.com' are the same. * Doesn't affect wildcard matching, so '*.example.com' will match 'www.example.com' (but not 'example.com') @@ -105,13 +78,13 @@ class Subsite extends DataObject { /** * Set allowed themes - * + * * @param array $themes - Numeric array of all themes which are allowed to be selected for all subsites. */ public static function set_allowed_themes($themes) { self::$allowed_themes = $themes; } - + /** * Gets the subsite currently set in the session. * @@ -151,7 +124,7 @@ class Subsite extends DataObject { return (int)$id; } - + /** * Switch to another subsite through storing the subsite identifier in the current PHP session. * Only takes effect when {@link Subsite::$use_session_subsiteid} is set to TRUE. @@ -178,13 +151,13 @@ class Subsite extends DataObject { Permission::flush_permission_cache(); } - + /** * Get a matching subsite for the given host, or for the current HTTP_HOST. * Supports "fuzzy" matching of domains by placing an asterisk at the start of end of the string, * for example matching all subdomains on *.example.com with one subsite, * and all subdomains on *.example.org on another. - * + * * @param $host The host to find the subsite for. If not specified, $_SERVER['HTTP_HOST'] is used. * @return int Subsite ID */ @@ -203,7 +176,7 @@ class Subsite extends DataObject { $SQL_host = Convert::raw2sql($host); $matchingDomains = DataObject::get( - "SubsiteDomain", + "SubsiteDomain", "'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')", "\"IsPrimary\" DESC" )->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1"); @@ -237,7 +210,7 @@ class Subsite extends DataObject { } /** - * + * * @param string $className * @param string $filter * @param string $sort @@ -257,7 +230,7 @@ class Subsite extends DataObject { public static function disable_subsite_filter($disabled = true) { self::$disable_subsite_filter = $disabled; } - + /** * Flush caches on database reset */ @@ -265,7 +238,7 @@ class Subsite extends DataObject { self::$_cache_accessible_sites = array(); self::$_cache_subsite_for_domain = array(); } - + /** * Return all subsites, regardless of permissions (augmented with main site). * @@ -297,7 +270,7 @@ class Subsite extends DataObject { // Rationalise member arguments if(!$member) $member = Member::currentUser(); if(!$member) return new ArrayList(); - if(!is_object($member)) $member = DataObject::get_by_id('SilverStripe\\Security\\Member', $member); + if(!is_object($member)) $member = DataObject::get_by_id('Member', $member); $subsites = new ArrayList(); @@ -335,12 +308,12 @@ class Subsite extends DataObject { // Rationalise member arguments if(!$member) $member = Member::currentUser(); if(!$member) return new ArrayList(); - if(!is_object($member)) $member = DataObject::get_by_id('SilverStripe\\Security\\Member', $member); + if(!is_object($member)) $member = DataObject::get_by_id('Member', $member); - // Rationalise permCode argument + // Rationalise permCode argument if(is_array($permCode)) $SQL_codes = "'" . implode("', '", Convert::raw2sql($permCode)) . "'"; else $SQL_codes = "'" . Convert::raw2sql($permCode) . "'"; - + // Cache handling $cacheKey = $SQL_codes . '-' . $member->ID . '-' . $includeMainSite . '-' . $mainSiteTitle; if(isset(self::$_cache_accessible_sites[$cacheKey])) { @@ -379,19 +352,19 @@ class Subsite extends DataObject { if(!is_array($permCode)) $permCode = array($permCode); if(self::hasMainSitePermission($member, $permCode)) { $subsites=$subsites->toArray(); - + $mainSite = new Subsite(); $mainSite->Title = $mainSiteTitle; array_unshift($subsites, $mainSite); $subsites=ArrayList::create($subsites); } } - + self::$_cache_accessible_sites[$cacheKey] = $subsites; return $subsites; } - + /** * Write a host->domain map to subsites/host-map.php * @@ -402,22 +375,22 @@ class Subsite extends DataObject { */ public static function writeHostMap($file = null) { if (!self::$write_hostmap) return; - + if (!$file) $file = Director::baseFolder().'/subsites/host-map.php'; $hostmap = array(); - + $subsites = DataObject::get('Subsite'); - + if ($subsites) foreach($subsites as $subsite) { $domains = $subsite->Domains(); if ($domains) foreach($domains as $domain) { $domainStr = $domain->Domain; if(!self::$strict_subdomain_matching) $domainStr = preg_replace('/^www\./', '', $domainStr); - $hostmap[$domainStr] = $subsite->domain(); + $hostmap[$domainStr] = $subsite->domain(); } if ($subsite->DefaultSite) $hostmap['default'] = $subsite->domain(); } - + $data = "ID; - + // Count this user's groups which can access the main site $groupCount = DB::query(" SELECT COUNT(\"Permission\".\"ID\") @@ -480,7 +453,7 @@ class Subsite extends DataObject { // There has to be at least one that allows access. return ($groupCount + $roleCount > 0); } - + /** * * @var array @@ -495,7 +468,7 @@ class Subsite extends DataObject { // Used to hide unfinished/private subsites from public view. // If unset, will default to true 'IsPublic' => 'Boolean', - + // Comma-separated list of disallowed page types 'PageTypeBlacklist' => 'Text', ); @@ -507,13 +480,13 @@ class Subsite extends DataObject { private static $has_many = array( 'Domains' => 'SubsiteDomain', ); - + /** * * @var array */ private static $belongs_many_many = array( - "Groups" => "SilverStripe\\Security\\Group", + "Groups" => "Group", ); /** @@ -531,15 +504,15 @@ class Subsite extends DataObject { private static $searchable_fields = array( 'Title', 'Domains.Domain', - 'IsPublic', + 'IsPublic', ); - + /** * * @var string */ private static $default_sort = "\"Title\" ASC"; - + /** * @todo Possible security issue, don't grant edit permissions to everybody. * @return boolean @@ -550,30 +523,30 @@ class Subsite extends DataObject { /** * Show the configuration fields for each subsite - * + * * @return FieldList */ public function getCMSFields() { if($this->ID!=0) { $domainTable = new GridField( - "Domains", - _t('Subsite.DomainsListTitle',"Domains"), - $this->Domains(), + "Domains", + _t('Subsite.DomainsListTitle',"Domains"), + $this->Domains(), GridFieldConfig_RecordEditor::create(10) ); }else { $domainTable = new LiteralField( - 'Domains', + 'Domains', '

'._t('Subsite.DOMAINSAVEFIRST', 'You can only add domains after saving for the first time').'

' ); } - + $languageSelector = new DropdownField( - 'Language', + 'Language', $this->fieldLabel('Language'), i18n::get_common_locales() ); - + $pageTypeMap = array(); $pageTypes = SiteTree::page_type_classes(); foreach($pageTypes as $pageType) { @@ -586,12 +559,11 @@ class Subsite extends DataObject { new Tab( 'Configuration', _t('Subsite.TabTitleConfig', 'Configuration'), - new HeaderField('ConfigurationHeader', $this->getClassName() . ' configuration', 2), + new HeaderField($this->getClassName() . ' configuration', 2), new TextField('Title', $this->fieldLabel('Title'), $this->Title), - + new HeaderField( - 'DomainsHeader', - _t('Subsite.DomainsHeadline', "Domains for this subsite") + _t('Subsite.DomainsHeadline',"Domains for this subsite") ), $domainTable, $languageSelector, @@ -600,8 +572,8 @@ class Subsite extends DataObject { new CheckboxField('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic), new DropdownField('Theme',$this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme), - - + + new LiteralField( 'PageTypeBlacklistToggle', sprintf( @@ -610,7 +582,7 @@ class Subsite extends DataObject { ) ), new CheckboxSetField( - 'PageTypeBlacklist', + 'PageTypeBlacklist', false, $pageTypeMap ) @@ -625,9 +597,9 @@ class Subsite extends DataObject { $this->extend('updateCMSFields', $fields); return $fields; } - + /** - * + * * @param boolean $includerelations * @return array */ @@ -645,10 +617,10 @@ class Subsite extends DataObject { return $labels; } - + /** * Return the themes that can be used with this subsite, as an array of themecode => description - * + * * @return array */ public function allowedThemes() { @@ -680,7 +652,7 @@ class Subsite extends DataObject { } /** - * + * * @return ValidationResult */ public function validate() { @@ -700,11 +672,11 @@ class Subsite extends DataObject { Subsite::writeHostMap(); parent::onAfterWrite(); } - + /** * Return the primary domain of this site. Tries to "normalize" the domain name, * by replacing potential wildcards. - * + * * @return string The full domain name of this subsite (without protocol prefix) */ public function domain() { @@ -720,18 +692,18 @@ class Subsite extends DataObject { $domain = preg_replace('/^\*\./',"subsite.", $domain); // *Only* removes "intermediate" subdomains, so 'subdomain.www.domain.com' becomes 'subdomain.domain.com' $domain = str_replace('.www.','.', $domain); - + return $domain; } - + // SubsiteID = 0 is often used to refer to the main site, just return $_SERVER['HTTP_HOST'] } else { return $_SERVER['HTTP_HOST']; } } - + /** - * + * * @return string - The full domain name of this subsite (without protocol prefix) */ public function getPrimaryDomain() { @@ -739,8 +711,8 @@ class Subsite extends DataObject { } /** - * - * @return string + * + * @return string */ public function absoluteBaseURL() { return "http://" . $this->domain() . Director::baseURL(); @@ -755,8 +727,8 @@ class Subsite extends DataObject { /** * Javascript admin action to duplicate this subsite - * - * @return string - javascript + * + * @return string - javascript */ public function adminDuplicate() { $newItem = $this->duplicate(); @@ -765,7 +737,7 @@ class Subsite extends DataObject { 'Created a copy of {title}', array('title' => Convert::raw2js($this->Title)) ); - + return <<ID'); @@ -780,7 +752,7 @@ JS; } /** - * + * * @param array $permissionCodes * @return DataList */ @@ -792,14 +764,14 @@ JS; $SQL_permissionCodes = join("','", $SQL_permissionCodes); return DataObject::get( - 'SilverStripe\\Security\\Member', + 'Member', "\"Group\".\"SubsiteID\" = $this->ID AND \"Permission\".\"Code\" IN ('$SQL_permissionCodes')", '', "LEFT JOIN \"Group_Members\" ON \"Member\".\"ID\" = \"Group_Members\".\"MemberID\" LEFT JOIN \"Group\" ON \"Group\".\"ID\" = \"Group_Members\".\"GroupID\" LEFT JOIN \"Permission\" ON \"Permission\".\"GroupID\" = \"Group\".\"ID\"" ); - + } /** @@ -825,7 +797,7 @@ JS; if($children) { foreach($children as $child) { self::changeSubsite($duplicate->ID); //Change to destination subsite - + $childClone = $child->duplicateToSubsite($duplicate, false); $childClone->ParentID = $destParentID; $childClone->writeToStage('Stage'); diff --git a/code/model/SubsiteDomain.php b/code/model/SubsiteDomain.php index eaea00f..6f89573 100644 --- a/code/model/SubsiteDomain.php +++ b/code/model/SubsiteDomain.php @@ -1,11 +1,5 @@ 0) { list($sourceParentID, $destParentID) = array_pop($stack); - $children = Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); + $children = Versioned::get_by_stage('SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); if($children) { foreach($children as $child) { diff --git a/composer.json b/composer.json index 7579e94..7d27d13 100644 --- a/composer.json +++ b/composer.json @@ -12,8 +12,7 @@ "require": { "silverstripe/framework": "~4.0", - "silverstripe/cms": "~4.0", - "silverstripe/asset-admin": "~1.0.0" + "silverstripe/cms": "~4.0" }, "require-dev": { "phpunit/PHPUnit": "~4.8@stable" diff --git a/css/LeftAndMain_Subsites.css b/css/LeftAndMain_Subsites.css index c06a04d..4d751c4 100644 --- a/css/LeftAndMain_Subsites.css +++ b/css/LeftAndMain_Subsites.css @@ -25,17 +25,12 @@ } .cms-menu .cms-subsites{ - padding: 0 8px 12px; + padding:3px 0px 15px; } .cms-menu .cms-subsites .field.dropdown{ padding-bottom:0; margin-bottom:0; } - -.cms-menu .cms-subsites .field.dropdown span { - color: #4f5861; -} - .cms-menu.collapsed .cms-subsites { display: none; } diff --git a/templates/LeftAndMain_Menu.ss b/templates/LeftAndMain_Menu.ss new file mode 100644 index 0000000..bc3c310 --- /dev/null +++ b/templates/LeftAndMain_Menu.ss @@ -0,0 +1,45 @@ +
+
+ + + + <% if $ListSubsites %> + <% include SubsiteList %> + <% end_if %> +
+ +
+ +
+ +
+ + auto + » + « +
+
diff --git a/templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss b/templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss deleted file mode 100644 index d6f3266..0000000 --- a/templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss +++ /dev/null @@ -1,18 +0,0 @@ -
-
- <% include SilverStripe\\Admin\\LeftAndMain_MenuLogo %> - <% include SilverStripe\\Admin\\LeftAndMain_MenuStatus %> - - <% if $ListSubsites %> - <% include SubsiteList %> - <% end_if %> -
- -
- <% include SilverStripe\\Admin\\LeftAndMain_MenuList %> -
- -
- <% include SilverStripe\\Admin\\LeftAndMain_MenuToggle %> -
-
diff --git a/tests/BaseSubsiteTest.php b/tests/BaseSubsiteTest.php index d67b537..de0940e 100644 --- a/tests/BaseSubsiteTest.php +++ b/tests/BaseSubsiteTest.php @@ -1,6 +1,4 @@ assertEquals(' * FileTitle', $file->alternateTreeTitle()); $file->SubsiteID = $this->objFromFixture('Subsite', 'domaintest1')->ID; $this->assertEquals('FileTitle', $file->getTreeTitle()); - $this->assertTrue(singleton('SilverStripe\\Assets\\Folder')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('Folder')->getCMSFields() instanceof FieldList); Subsite::changeSubsite(1); $this->assertEquals($file->cacheKeyComponent(), 'subsite-1'); } function testWritingSubsiteID() { - $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')->logIn(); + $this->objFromFixture('Member', 'admin')->logIn(); $subsite = $this->objFromFixture('Subsite', 'domaintest1'); FileSubsites::$default_root_folders_global = true; @@ -59,7 +55,7 @@ class FileSubsitesTest extends BaseSubsiteTest { } function testSubsitesFolderDropdown() { - $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')->logIn(); + $this->objFromFixture('Member', 'admin')->logIn(); $file = new Folder(); diff --git a/tests/GroupSubsitesTest.php b/tests/GroupSubsitesTest.php index 4e7d1e3..6ab1fec 100644 --- a/tests/GroupSubsitesTest.php +++ b/tests/GroupSubsitesTest.php @@ -1,8 +1,5 @@ assertTrue(is_array(singleton('GroupSubsites')->extraStatics())); $this->assertTrue(is_array(singleton('GroupSubsites')->providePermissions())); - $this->assertTrue(singleton('SilverStripe\\Security\\Group')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('Group')->getCMSFields() instanceof FieldList); } function testAlternateTreeTitle() { diff --git a/tests/LeftAndMainSubsitesTest.php b/tests/LeftAndMainSubsitesTest.php index 6fa553b..0b2c6df 100644 --- a/tests/LeftAndMainSubsitesTest.php +++ b/tests/LeftAndMainSubsitesTest.php @@ -1,9 +1,5 @@ objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); + $member = $this->objFromFixture('Member', 'subsite1member'); - $cmsmain = singleton('SilverStripe\\CMS\\Controllers\\CMSMain'); + $cmsmain = singleton('CMSMain'); $subsites = $cmsmain->sectionSites(true, "Main site", $member); $this->assertDOSEquals(array( array('Title' =>'Subsite1 Template') @@ -32,9 +28,9 @@ class LeftAndMainSubsitesTest extends FunctionalTest { $subsites = $assetadmin->sectionSites(true, "Main site", $member); $this->assertDOSEquals(array(), $subsites, 'Does not list any sites for forbidden controller.'); - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); + $member = $this->objFromFixture('Member', 'editor'); - $cmsmain = singleton('SilverStripe\\CMS\\Controllers\\CMSMain'); + $cmsmain = singleton('CMSMain'); $subsites = $cmsmain->sectionSites(true, "Main site", $member); $this->assertDOSContains(array( array('Title' =>'Main site') @@ -42,7 +38,7 @@ class LeftAndMainSubsitesTest extends FunctionalTest { } function testAccessChecksDontChangeCurrentSubsite() { - $admin = $this->objFromFixture("SilverStripe\\Security\\Member","admin"); + $admin = $this->objFromFixture("Member","admin"); $this->loginAs($admin); $ids = array(); @@ -74,17 +70,17 @@ class LeftAndMainSubsitesTest extends FunctionalTest { $l = new LeftAndMain(); Config::inst()->nest(); - Config::inst()->update('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 'treats_subsite_0_as_global', false); - $this->assertTrue($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 0, 5)); - $this->assertFalse($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 0, 0)); - $this->assertTrue($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 1, 5)); - $this->assertFalse($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 1, 1)); + Config::inst()->update('CMSPageEditController', 'treats_subsite_0_as_global', false); + $this->assertTrue($l->shouldChangeSubsite('CMSPageEditController', 0, 5)); + $this->assertFalse($l->shouldChangeSubsite('CMSPageEditController', 0, 0)); + $this->assertTrue($l->shouldChangeSubsite('CMSPageEditController', 1, 5)); + $this->assertFalse($l->shouldChangeSubsite('CMSPageEditController', 1, 1)); - Config::inst()->update('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 'treats_subsite_0_as_global', true); - $this->assertFalse($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 0, 5)); - $this->assertFalse($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 0, 0)); - $this->assertTrue($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 1, 5)); - $this->assertFalse($l->shouldChangeSubsite('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 1, 1)); + Config::inst()->update('CMSPageEditController', 'treats_subsite_0_as_global', true); + $this->assertFalse($l->shouldChangeSubsite('CMSPageEditController', 0, 5)); + $this->assertFalse($l->shouldChangeSubsite('CMSPageEditController', 0, 0)); + $this->assertTrue($l->shouldChangeSubsite('CMSPageEditController', 1, 5)); + $this->assertFalse($l->shouldChangeSubsite('CMSPageEditController', 1, 1)); Config::inst()->unnest(); } diff --git a/tests/SiteConfigSubsitesTest.php b/tests/SiteConfigSubsitesTest.php index 263d55c..612ac32 100644 --- a/tests/SiteConfigSubsitesTest.php +++ b/tests/SiteConfigSubsitesTest.php @@ -1,7 +1,5 @@ array('Translatable') + 'SiteTree' => array('Translatable') ); - + function testPagesInDifferentSubsitesCanShareURLSegment() { $subsiteMain = $this->objFromFixture('Subsite', 'main'); $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - + $pageMain = new SiteTree(); $pageMain->URLSegment = 'testpage'; $pageMain->write(); $pageMain->publish('Stage', 'Live'); - + $pageMainOther = new SiteTree(); $pageMainOther->URLSegment = 'testpage'; $pageMainOther->write(); $pageMainOther->publish('Stage', 'Live'); - + $this->assertNotEquals($pageMain->URLSegment, $pageMainOther->URLSegment, 'Pages in same subsite cant share the same URL' ); - + Subsite::changeSubsite($subsite1->ID); - + $pageSubsite1 = new SiteTree(); $pageSubsite1->URLSegment = 'testpage'; $pageSubsite1->write(); $pageSubsite1->publish('Stage', 'Live'); - + $this->assertEquals($pageMain->URLSegment, $pageSubsite1->URLSegment, 'Pages in different subsites can share the same URL' ); } - + function testBasicSanity() { - $this->assertTrue(singleton('SilverStripe\\CMS\\Model\\SiteTree')->getSiteConfig() instanceof SiteConfig); + $this->assertTrue(singleton('SiteTree')->getSiteConfig() instanceof SiteConfig); // The following assert is breaking in Translatable. - $this->assertTrue(singleton('SilverStripe\\CMS\\Model\\SiteTree')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('SiteTree')->getCMSFields() instanceof FieldList); $this->assertTrue(singleton('SubsitesVirtualPage')->getCMSFields() instanceof FieldList); $this->assertTrue(is_array(singleton('SiteTreeSubsites')->extraStatics())); } - + function testErrorPageLocations() { $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); - + Subsite::changeSubsite($subsite1->ID); $path = SiteTreeSubsitesTest_ErrorPage::get_error_filename_spy(500); - + $expected_path = 'error-500-'.$subsite1->domain().'.html'; $this->assertEquals($expected_path, $path); } - + function testCanEditSiteTree() { - $admin = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); - $subsite1member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); - $subsite2member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite2member'); + $admin = $this->objFromFixture('Member', 'admin'); + $subsite1member = $this->objFromFixture('Member', 'subsite1member'); + $subsite2member = $this->objFromFixture('Member', 'subsite2member'); $mainpage = $this->objFromFixture('Page', 'home'); $subsite1page = $this->objFromFixture('Page', 'subsite1_home'); $subsite2page = $this->objFromFixture('Page', 'subsite2_home'); $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); $subsite2 = $this->objFromFixture('Subsite', 'subsite2'); - + // Cant pass member as arguments to canEdit() because of GroupSubsites Session::set("loggedInAs", $admin->ID); $this->assertTrue( (bool)$subsite1page->canEdit(), 'Administrators can edit all subsites' ); - + // @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state Subsite::changeSubsite($subsite1); - + Session::set("loggedInAs", $subsite1member->ID); $this->assertTrue( (bool)$subsite1page->canEdit(), 'Members can edit pages on a subsite if they are in a group belonging to this subsite' ); - + Session::set("loggedInAs", $subsite2member->ID); $this->assertFalse( (bool)$subsite1page->canEdit(), 'Members cant edit pages on a subsite if they are not in a group belonging to this subsite' ); - + // @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state Subsite::changeSubsite(0); $this->assertFalse( @@ -110,7 +101,7 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { 'Members cant edit pages on the main site if they are not in a group allowing this' ); } - + /** * Similar to {@link SubsitesVirtualPageTest->testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite()}. */ @@ -118,7 +109,7 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { // Set up a couple of pages with the same URL on different subsites $s1 = $this->objFromFixture('Subsite','domaintest1'); $s2 = $this->objFromFixture('Subsite','domaintest2'); - + $p1 = new SiteTree(); $p1->Title = $p1->URLSegment = "test-page"; $p1->SubsiteID = $s1->ID; @@ -132,7 +123,7 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { // Check that the URLs weren't modified in our set-up $this->assertEquals($p1->URLSegment, 'test-page'); $this->assertEquals($p2->URLSegment, 'test-page'); - + // Check that if we switch between the different subsites, we receive the correct pages Subsite::changeSubsite($s1); $this->assertEquals($p1->ID, SiteTree::get_by_link('test-page')->ID); @@ -140,71 +131,71 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { Subsite::changeSubsite($s2); $this->assertEquals($p2->ID, SiteTree::get_by_link('test-page')->ID); } - + function testPageTypesBlacklistInClassDropdown() { - $editor = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); + $editor = $this->objFromFixture('Member', 'editor'); Session::set("loggedInAs", $editor->ID); - + $s1 = $this->objFromFixture('Subsite','domaintest1'); $s2 = $this->objFromFixture('Subsite','domaintest2'); - $page = singleton('SilverStripe\\CMS\\Model\\SiteTree'); - + $page = singleton('SiteTree'); + $s1->PageTypeBlacklist = 'SiteTreeSubsitesTest_ClassA,ErrorPage'; $s1->write(); - + Subsite::changeSubsite($s1); $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); - - $this->assertArrayNotHasKey('SilverStripe\\CMS\\Model\\ErrorPage', + + $this->assertArrayNotHasKey('ErrorPage', $settingsFields ); - $this->assertArrayNotHasKey('SiteTreeSubsitesTest_ClassA', + $this->assertArrayNotHasKey('SiteTreeSubsitesTest_ClassA', $settingsFields ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', $settingsFields ); Subsite::changeSubsite($s2); $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); - $this->assertArrayHasKey('SilverStripe\\CMS\\Model\\ErrorPage', + $this->assertArrayHasKey('ErrorPage', $settingsFields ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassA', + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassA', $settingsFields ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', $settingsFields ); } - + function testPageTypesBlacklistInCMSMain() { - $editor = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); + $editor = $this->objFromFixture('Member', 'editor'); Session::set("loggedInAs", $editor->ID); - + $cmsmain = new CMSMain(); - + $s1 = $this->objFromFixture('Subsite','domaintest1'); $s2 = $this->objFromFixture('Subsite','domaintest2'); - + $s1->PageTypeBlacklist = 'SiteTreeSubsitesTest_ClassA,ErrorPage'; $s1->write(); Subsite::changeSubsite($s1); $hints = Convert::json2array($cmsmain->SiteTreeHints()); $classes = $hints['Root']['disallowedChildren']; - $this->assertContains('SilverStripe\\CMS\\Model\\ErrorPage', $classes); + $this->assertContains('ErrorPage', $classes); $this->assertContains('SiteTreeSubsitesTest_ClassA', $classes); $this->assertNotContains('SiteTreeSubsitesTest_ClassB', $classes); Subsite::changeSubsite($s2); $hints = Convert::json2array($cmsmain->SiteTreeHints()); $classes = $hints['Root']['disallowedChildren']; - $this->assertNotContains('SilverStripe\\CMS\\Model\\ErrorPage', $classes); + $this->assertNotContains('ErrorPage', $classes); $this->assertNotContains('SiteTreeSubsitesTest_ClassA', $classes); $this->assertNotContains('SiteTreeSubsitesTest_ClassB', $classes); } - + } class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly {} @@ -222,4 +213,4 @@ class SiteTreeSubsitesTest_ErrorPage extends ErrorPage implements TestOnly { public static function get_error_filename_spy($statusCode) { return self::get_error_filename($statusCode); } -} +} \ No newline at end of file diff --git a/tests/SubsiteAdminFunctionalTest.php b/tests/SubsiteAdminFunctionalTest.php index d77c19e..02f393f 100644 --- a/tests/SubsiteAdminFunctionalTest.php +++ b/tests/SubsiteAdminFunctionalTest.php @@ -1,9 +1,5 @@ objFromFixture('SilverStripe\\Security\\Member', 'admin'); + $member = $this->objFromFixture('Member', 'admin'); Session::set("loggedInAs", $member->ID); $this->getAndFollowAll('admin/pages/?SubsiteID=0'); @@ -61,7 +57,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { } function testAdminIsRedirectedToObjectsSubsite() { - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); + $member = $this->objFromFixture('Member', 'admin'); Session::set("loggedInAs", $member->ID); $mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage'); @@ -69,13 +65,13 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { Config::inst()->nest(); - Config::inst()->update('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 'treats_subsite_0_as_global', false); + Config::inst()->update('CMSPageEditController', 'treats_subsite_0_as_global', false); Subsite::changeSubsite(0); $this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID"); $this->assertEquals(Subsite::currentSubsiteID(), $subsite1Home->SubsiteID, 'Loading an object switches the subsite'); $this->assertRegExp("#^admin/pages.*#", $this->mainSession->lastUrl(), 'Lands on the correct section'); - Config::inst()->update('SilverStripe\\CMS\\Controllers\\CMSPageEditController', 'treats_subsite_0_as_global', true); + Config::inst()->update('CMSPageEditController', 'treats_subsite_0_as_global', true); Subsite::changeSubsite(0); $this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID"); $this->assertEquals(Subsite::currentSubsiteID(), $subsite1Home->SubsiteID, 'Loading a non-main-site object still switches the subsite if configured with treats_subsite_0_as_global'); @@ -93,7 +89,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { * even though he does not have the ADMIN permission. */ function testEditorCanAccessAllSubsites() { - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); + $member = $this->objFromFixture('Member', 'editor'); Session::set("loggedInAs", $member->ID); $this->getAndFollowAll('admin/pages/?SubsiteID=0'); @@ -114,7 +110,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { * Test a member who only has access to one subsite (subsite1) and only some sections (pages and security). */ function testSubsiteAdmin() { - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); + $member = $this->objFromFixture('Member', 'subsite1member'); Session::set("loggedInAs", $member->ID); $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); diff --git a/tests/SubsiteAdminTest.php b/tests/SubsiteAdminTest.php index 40288c4..3b9fb0f 100644 --- a/tests/SubsiteAdminTest.php +++ b/tests/SubsiteAdminTest.php @@ -1,15 +1,11 @@ $this->idFromFixture('SilverStripe\\Security\\Member', 'admin') + 'loggedInAs' => $this->idFromFixture('Member', 'admin') )); } @@ -35,7 +31,7 @@ class SubsiteAdminTest extends BaseSubsiteTest { * of whether he is in a subsite-specific group or not. */ function testMainsiteAdminCanAccessAllSubsites() { - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); + $member = $this->objFromFixture('Member', 'admin'); Session::set("loggedInAs", $member->ID); $cmsMain = new CMSMain(); diff --git a/tests/SubsiteTest.php b/tests/SubsiteTest.php index fa63eda..16ee493 100644 --- a/tests/SubsiteTest.php +++ b/tests/SubsiteTest.php @@ -1,8 +1,5 @@ Count(); foreach($pages as $page) { $this->assertEquals($template->ID, $page->SubsiteID); @@ -259,7 +256,7 @@ class SubsiteTest extends BaseSubsiteTest { } function testAllAccessibleSites() { - $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); + $member = $this->objFromFixture('Member', 'subsite1member'); $subsites = Subsite::all_accessible_sites(true, 'Main site', $member); $this->assertDOSEquals(array( @@ -272,13 +269,13 @@ class SubsiteTest extends BaseSubsiteTest { */ function testAccessibleSites() { $member1Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member')); + $this->objFromFixture('Member', 'subsite1member')); $member1SiteTitles = $member1Sites->column("Title"); sort($member1SiteTitles); $this->assertEquals('Subsite1 Template', $member1SiteTitles[0], 'Member can get to a subsite via a group'); $adminSites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')); + $this->objFromFixture('Member', 'admin')); $adminSiteTitles = $adminSites->column("Title"); sort($adminSiteTitles); $this->assertEquals(array( @@ -291,17 +288,17 @@ class SubsiteTest extends BaseSubsiteTest { ), $adminSiteTitles); $member2Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member2')); + $this->objFromFixture('Member', 'subsite1member2')); $member2SiteTitles = $member2Sites->column("Title"); sort($member2SiteTitles); $this->assertEquals('Subsite1 Template', $member2SiteTitles[0], 'Member can get to subsite via a group role'); } function testhasMainSitePermission() { - $admin = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); - $subsite1member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); - $subsite1admin = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1admin'); - $allsubsitesauthor = $this->objFromFixture('SilverStripe\\Security\\Member', 'allsubsitesauthor'); + $admin = $this->objFromFixture('Member', 'admin'); + $subsite1member = $this->objFromFixture('Member', 'subsite1member'); + $subsite1admin = $this->objFromFixture('Member', 'subsite1admin'); + $allsubsitesauthor = $this->objFromFixture('Member', 'allsubsitesauthor'); $this->assertTrue( Subsite::hasMainSitePermission($admin), diff --git a/tests/SubsiteTest.yml b/tests/SubsiteTest.yml index dc2126c..96bffb3 100644 --- a/tests/SubsiteTest.yml +++ b/tests/SubsiteTest.yml @@ -75,14 +75,14 @@ Page: Title: 'Contact Us (Subsite 2)' SubsiteID: =>Subsite.subsite2 -SilverStripe\Security\PermissionRoleCode: +PermissionRoleCode: roleCode1: Code: CMS_ACCESS_CMSMain -SilverStripe\Security\PermissionRole: +PermissionRole: role1: Title: role1 - Codes: =>SilverStripe\Security\PermissionRoleCode.roleCode1 -SilverStripe\Security\Group: + Codes: =>PermissionRoleCode.roleCode1 +Group: admin: Title: Admin Code: admin @@ -114,71 +114,71 @@ SilverStripe\Security\Group: Title: subsite1_group_via_role Code: subsite1_group_via_role AccessAllSubsites: 1 - Roles: =>SilverStripe\Security\PermissionRole.role1 -SilverStripe\Security\Permission: + Roles: =>PermissionRole.role1 +Permission: admin: Code: ADMIN - GroupID: =>SilverStripe\Security\Group.admin + GroupID: =>Group.admin editor1: Code: CMS_ACCESS_CMSMain - GroupID: =>SilverStripe\Security\Group.editor + GroupID: =>Group.editor editor2: Code: SITETREE_VIEW_ALL - GroupID: =>SilverStripe\Security\Group.editor + GroupID: =>Group.editor editor3: Code: VIEW_DRAFT_CONTENT - GroupID: =>SilverStripe\Security\Group.editor + GroupID: =>Group.editor accesscmsmain1: Code: CMS_ACCESS_CMSMain - GroupID: =>SilverStripe\Security\Group.subsite1_group + GroupID: =>Group.subsite1_group accesscmsmain2: Code: CMS_ACCESS_CMSMain - GroupID: =>SilverStripe\Security\Group.subsite2_group + GroupID: =>Group.subsite2_group accesscmsmain3: Code: CMS_ACCESS_CMSMain - GroupID: =>SilverStripe\Security\Group.subsite1admins + GroupID: =>Group.subsite1admins accesscmsmain4: Code: CMS_ACCESS_CMSMain - GroupID: =>SilverStripe\Security\Group.allsubsitesauthors + GroupID: =>Group.allsubsitesauthors securityaccess1: Code: CMS_ACCESS_SecurityAdmin - GroupID: =>SilverStripe\Security\Group.subsite1_group + GroupID: =>Group.subsite1_group securityaccess2: Code: CMS_ACCESS_SecurityAdmin - GroupID: =>SilverStripe\Security\Group.subsite2_group + GroupID: =>Group.subsite2_group adminsubsite1: Code: ADMIN - GroupID: =>SilverStripe\Security\Group.subsite1admins + GroupID: =>Group.subsite1admins -SilverStripe\Security\Member: +Member: admin: FirstName: Admin Surname: User Email: admin@test.com Password: rangi - Groups: =>SilverStripe\Security\Group.admin + Groups: =>Group.admin editor: FirstName: Editor Surname: User Email: editor@test.com Password: rangi - Groups: =>SilverStripe\Security\Group.editor + Groups: =>Group.editor subsite1member: Email: subsite1member@test.com - Groups: =>SilverStripe\Security\Group.subsite1_group + Groups: =>Group.subsite1_group subsite2member: Email: subsite2member@test.com - Groups: =>SilverStripe\Security\Group.subsite2_group + Groups: =>Group.subsite2_group subsite1admin: Email: subsite1admin@test.com - Groups: =>SilverStripe\Security\Group.subsite1admins + Groups: =>Group.subsite1admins allsubsitesauthor: Email: allsubsitesauthor@test.com - Groups: =>SilverStripe\Security\Group.allsubsitesauthors + Groups: =>Group.allsubsitesauthors subsite1member2: Email: subsite1member2@test.com - Groups: =>SilverStripe\Security\Group.subsite1_group_via_role + Groups: =>Group.subsite1_group_via_role -SilverStripe\SiteConfig\SiteConfig: +SiteConfig: config: CanCreateTopLevelType: LoggedInUsers diff --git a/tests/SubsitesVirtualPageTest.php b/tests/SubsitesVirtualPageTest.php index 27dc1ca..59eab99 100644 --- a/tests/SubsitesVirtualPageTest.php +++ b/tests/SubsitesVirtualPageTest.php @@ -1,10 +1,5 @@ objFromFixture('SilverStripe\\Assets\\File', 'file1'); - $page = $this->objFromFixture('SilverStripe\\CMS\\Model\\SiteTree', 'page1'); + $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)); @@ -62,7 +57,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { $this->logInWithPermission('ADMIN'); // Publish the source page - $page = $this->objFromFixture('SilverStripe\\CMS\\Model\\SiteTree', 'page1'); + $page = $this->objFromFixture('SiteTree', 'page1'); $this->assertTrue($page->doPublish()); // Create a virtual page from it, and publish that @@ -72,7 +67,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { $svp->doPublish(); // Rename the file - $file = $this->objFromFixture('SilverStripe\\Assets\\File', 'file1'); + $file = $this->objFromFixture('File', 'file1'); $file->Name = 'renamed-test-file.pdf'; $file->write(); @@ -266,8 +261,8 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { function fixVersionNumberCache($page) { $pages = func_get_args(); foreach($pages as $p) { - Versioned::prepopulate_versionnumber_cache('SilverStripe\\CMS\\Model\\SiteTree', 'Stage', array($p->ID)); - Versioned::prepopulate_versionnumber_cache('SilverStripe\\CMS\\Model\\SiteTree', 'Live', array($p->ID)); + Versioned::prepopulate_versionnumber_cache('SiteTree', 'Stage', array($p->ID)); + Versioned::prepopulate_versionnumber_cache('SiteTree', 'Live', array($p->ID)); } } diff --git a/tests/SubsitesVirtualPageTest.yml b/tests/SubsitesVirtualPageTest.yml index 7e17e63..501d547 100644 --- a/tests/SubsitesVirtualPageTest.yml +++ b/tests/SubsitesVirtualPageTest.yml @@ -1,11 +1,11 @@ # These need to come first so that SiteTree has the link meta-data written. -SilverStripe\Assets\File: +File: file1: FileFilename: testscript-test-file.pdf FileHash: 464dedb70af0dc7f8f3360e7f3ae43cbbf1cdf4e Name: testscript-test-file.pdf -SilverStripe\CMS\Model\SiteTree: +SiteTree: page1: Title: page1 URLSegment: page1 diff --git a/tests/behat/features/bootstrap/Context/FeatureContext.php b/tests/behat/features/bootstrap/Context/FeatureContext.php index b5be73d..1ac5c27 100644 --- a/tests/behat/features/bootstrap/Context/FeatureContext.php +++ b/tests/behat/features/bootstrap/Context/FeatureContext.php @@ -11,9 +11,6 @@ use SilverStripe\BehatExtension\Context\SilverStripeContext, SilverStripe\Framework\Test\Behaviour\CmsFormsContext, SilverStripe\Framework\Test\Behaviour\CmsUiContext, SilverStripe\Cms\Test\Behaviour; -use SilverStripe\Core\Injector\Injector; -use SilverStripe\Core\ClassInfo; - // PHPUnit require_once 'PHPUnit/Autoload.php'; @@ -52,15 +49,15 @@ class FeatureContext extends SilverStripeContext { // Use blueprints to set user name from identifier $factory = $fixtureContext->getFixtureFactory(); - $blueprint = Injector::inst()->create('SilverStripe\\Dev\\FixtureBlueprint', 'SilverStripe\\Security\\Member'); + $blueprint = \Injector::inst()->create('FixtureBlueprint', 'Member'); $blueprint->addCallback('beforeCreate', function($identifier, &$data, &$fixtures) { if(!isset($data['FirstName'])) $data['FirstName'] = $identifier; }); - $factory->define('SilverStripe\\Security\\Member', $blueprint); + $factory->define('Member', $blueprint); // Auto-publish pages - foreach(ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\SiteTree') as $id => $class) { - $blueprint = Injector::inst()->create('SilverStripe\\Dev\\FixtureBlueprint', $class); + foreach(\ClassInfo::subclassesFor('SiteTree') as $id => $class) { + $blueprint = \Injector::inst()->create('FixtureBlueprint', $class); $blueprint->addCallback('afterCreate', function($obj, $identifier, &$data, &$fixtures) { $obj->publish('Stage', 'Live'); }); @@ -81,7 +78,7 @@ class FeatureContext extends SilverStripeContext { */ public function getFixtureFactory() { if(!$this->fixtureFactory) { - $this->fixtureFactory = Injector::inst()->create('SilverStripe\\Dev\\BehatFixtureFactory'); + $this->fixtureFactory = \Injector::inst()->create('BehatFixtureFactory'); } return $this->fixtureFactory;