From e8f5f58bb082794350558daca29e6321f5437e38 Mon Sep 17 00:00:00 2001 From: Loz Calver Date: Thu, 22 Sep 2016 15:38:29 +0100 Subject: [PATCH] SS4 namespaces compatibility --- _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, 521 insertions(+), 365 deletions(-) delete mode 100644 templates/LeftAndMain_Menu.ss create mode 100644 templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss diff --git a/_config.php b/_config.php index 0cbece5..93cca78 100644 --- a/_config.php +++ b/_config.php @@ -1,5 +1,21 @@ Fields()->dataFieldByName('Subsite'); if($grid) { - $grid->getConfig()->removeComponentsByType('GridFieldDetailForm'); + $grid->getConfig()->removeComponentsByType('SilverStripe\\Forms\\GridField\\GridFieldDetailForm'); $grid->getConfig()->addComponent(new GridFieldSubsiteDetailForm()); } diff --git a/code/SubsiteReportWrapper.php b/code/SubsiteReportWrapper.php index 2774cfc..104499d 100644 --- a/code/SubsiteReportWrapper.php +++ b/code/SubsiteReportWrapper.php @@ -1,10 +1,14 @@ renderWith('SubsiteList'); + return $this->renderWith('Includes/SubsiteList'); } } diff --git a/code/SubsitesVirtualPage.php b/code/SubsitesVirtualPage.php index c63fa13..72b5b0b 100644 --- a/code/SubsitesVirtualPage.php +++ b/code/SubsitesVirtualPage.php @@ -1,4 +1,17 @@ '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"), - "SiteTree", + "CopyContentFromID", + _t('VirtualPage.CHOOSE', "Choose a page to link to"), + "SilverStripe\\CMS\\Model\\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; } @@ -113,73 +126,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('SiteTree', $this->CopyContentFromID) ? false : true; + if ($this->CopyContentFromID) $this->HasBrokenLink = DataObject::get_by_id('SilverStripe\\CMS\\Model\\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('SiteTree', 'nested_urls')) { + if(Config::inst()->get('SilverStripe\\CMS\\Model\\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( - 'SiteTree', + 'SilverStripe\\CMS\\Model\\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( - 'SiteTree', + 'SilverStripe\\CMS\\Model\\SiteTree', "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter", false // disable cache, it doesn't include subsite status in the key ); @@ -188,25 +201,7 @@ 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 8db4418..97f6309 100644 --- a/code/extensions/CMSPageAddControllerExtension.php +++ b/code/extensions/CMSPageAddControllerExtension.php @@ -1,4 +1,7 @@ 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 @@ -58,11 +70,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"), @@ -76,11 +88,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)); } @@ -116,7 +128,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) { @@ -125,10 +137,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)"); @@ -136,7 +148,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(*)') { @@ -152,7 +164,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 @@ -166,7 +178,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 ae07712..840168f 100644 --- a/code/extensions/LeftAndMainSubsites.php +++ b/code/extensions/LeftAndMainSubsites.php @@ -1,4 +1,19 @@ duplicateToSubsite($subsite->ID, true); $response = $this->owner->getResponse(); diff --git a/code/extensions/SiteConfigSubsites.php b/code/extensions/SiteConfigSubsites.php index abc5474..f2d9979 100644 --- a/code/extensions/SiteConfigSubsites.php +++ b/code/extensions/SiteConfigSubsites.php @@ -1,5 +1,11 @@ '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 9c3bab4..e99af73 100644 --- a/code/extensions/SiteTreeSubsites.php +++ b/code/extensions/SiteTreeSubsites.php @@ -1,5 +1,20 @@ 'SiteTree' // Stored separately, as the logic for URL rewriting is different + 'CrossSubsiteLinkTracking' => 'SilverStripe\\CMS\\Model\\SiteTree' // Stored separately, as the logic for URL rewriting is different ); private static $many_many_extraFields = array( @@ -21,14 +36,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; @@ -47,10 +62,10 @@ class SiteTreeSubsites extends DataExtension { break; } } - + function onBeforeWrite() { if(!$this->owner->ID && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID(); - + parent::onBeforeWrite(); } @@ -58,7 +73,7 @@ class SiteTreeSubsites extends DataExtension { $subsites = Subsite::accessible_sites("CMS_ACCESS_CMSMain"); $subsitesMap = array(); if($subsites && $subsites->Count()) { - $subsitesMap = $subsites->map('ID', 'Title'); + $subsitesMap = $subsites->map('ID', 'Title')->toArray(); unset($subsitesMap[$this->owner->SubsiteID]); } @@ -68,8 +83,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, '' ) @@ -77,31 +92,30 @@ 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('SiteTree', 'nested_urls'); + $nested_urls_enabled = Config::inst()->get('SilverStripe\\CMS\\Model\\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('SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); + $sc = DataObject::get_one('SilverStripe\\SiteConfig\\SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); if(!$sc) { $sc = new SiteConfig(); $sc->SubsiteID = $this->owner->SubsiteID; @@ -111,18 +125,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'); @@ -140,25 +154,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 */ @@ -252,7 +266,7 @@ class SiteTreeSubsites extends DataExtension { $subsite = Subsite::currentSubsite(); if($subsite && $subsite->Theme){ - Config::inst()->update('SSViewer', 'theme', Subsite::currentSubsite()->Theme); + Config::inst()->update('SilverStripe\\View\\SSViewer', 'theme', Subsite::currentSubsite()->Theme); } } @@ -293,22 +307,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("SiteTree", "\"URLSegment\" = '" . Convert::raw2sql(urldecode( $rest)) . "' AND \"SubsiteID\" = " . $subsiteID, false); + $candidatePage = DataObject::get_one("SilverStripe\\CMS\\Model\\SiteTree", "\"URLSegment\" = '" . Convert::raw2sql(urldecode( $rest)) . "' AND \"SubsiteID\" = " . $subsiteID, false); Subsite::disable_subsite_filter($origDisableSubsiteFilter); - + if($candidatePage) { $linkedPages[] = $candidatePage->ID; } else { @@ -317,17 +331,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 aab9af2..fd0d003 100644 --- a/code/extensions/SubsiteMenuExtension.php +++ b/code/extensions/SubsiteMenuExtension.php @@ -1,5 +1,7 @@ subsiteID; } - function tree(SS_HTTPRequest $request) { + function tree(HTTPRequest $request) { $oldSubsiteID = Session::get('SubsiteID'); Session::set('SubsiteID', $this->subsiteID); diff --git a/code/model/Subsite.php b/code/model/Subsite.php index ca77cca..62baa20 100644 --- a/code/model/Subsite.php +++ b/code/model/Subsite.php @@ -1,4 +1,31 @@ to the request. @@ -9,8 +36,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. */ @@ -21,7 +48,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. @@ -33,10 +60,10 @@ class Subsite extends DataObject { * @var boolean */ public static $write_hostmap = true; - + /** * Memory cache of accessible sites - * + * * @array */ private static $_cache_accessible_sites = array(); @@ -54,7 +81,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') @@ -78,13 +105,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. * @@ -124,7 +151,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. @@ -151,13 +178,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 */ @@ -176,7 +203,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"); @@ -210,7 +237,7 @@ class Subsite extends DataObject { } /** - * + * * @param string $className * @param string $filter * @param string $sort @@ -230,7 +257,7 @@ class Subsite extends DataObject { public static function disable_subsite_filter($disabled = true) { self::$disable_subsite_filter = $disabled; } - + /** * Flush caches on database reset */ @@ -238,7 +265,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). * @@ -270,7 +297,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('Member', $member); + if(!is_object($member)) $member = DataObject::get_by_id('SilverStripe\\Security\\Member', $member); $subsites = new ArrayList(); @@ -308,12 +335,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('Member', $member); + if(!is_object($member)) $member = DataObject::get_by_id('SilverStripe\\Security\\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])) { @@ -352,19 +379,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 * @@ -375,22 +402,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\") @@ -453,7 +480,7 @@ class Subsite extends DataObject { // There has to be at least one that allows access. return ($groupCount + $roleCount > 0); } - + /** * * @var array @@ -468,7 +495,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', ); @@ -480,13 +507,13 @@ class Subsite extends DataObject { private static $has_many = array( 'Domains' => 'SubsiteDomain', ); - + /** * * @var array */ private static $belongs_many_many = array( - "Groups" => "Group", + "Groups" => "SilverStripe\\Security\\Group", ); /** @@ -504,15 +531,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 @@ -523,30 +550,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) { @@ -559,11 +586,12 @@ class Subsite extends DataObject { new Tab( 'Configuration', _t('Subsite.TabTitleConfig', 'Configuration'), - new HeaderField($this->getClassName() . ' configuration', 2), + new HeaderField('ConfigurationHeader', $this->getClassName() . ' configuration', 2), new TextField('Title', $this->fieldLabel('Title'), $this->Title), - + new HeaderField( - _t('Subsite.DomainsHeadline',"Domains for this subsite") + 'DomainsHeader', + _t('Subsite.DomainsHeadline', "Domains for this subsite") ), $domainTable, $languageSelector, @@ -572,8 +600,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( @@ -582,7 +610,7 @@ class Subsite extends DataObject { ) ), new CheckboxSetField( - 'PageTypeBlacklist', + 'PageTypeBlacklist', false, $pageTypeMap ) @@ -597,9 +625,9 @@ class Subsite extends DataObject { $this->extend('updateCMSFields', $fields); return $fields; } - + /** - * + * * @param boolean $includerelations * @return array */ @@ -617,10 +645,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() { @@ -652,7 +680,7 @@ class Subsite extends DataObject { } /** - * + * * @return ValidationResult */ public function validate() { @@ -672,11 +700,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() { @@ -692,18 +720,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() { @@ -711,8 +739,8 @@ class Subsite extends DataObject { } /** - * - * @return string + * + * @return string */ public function absoluteBaseURL() { return "http://" . $this->domain() . Director::baseURL(); @@ -727,8 +755,8 @@ class Subsite extends DataObject { /** * Javascript admin action to duplicate this subsite - * - * @return string - javascript + * + * @return string - javascript */ public function adminDuplicate() { $newItem = $this->duplicate(); @@ -737,7 +765,7 @@ class Subsite extends DataObject { 'Created a copy of {title}', array('title' => Convert::raw2js($this->Title)) ); - + return <<ID'); @@ -752,7 +780,7 @@ JS; } /** - * + * * @param array $permissionCodes * @return DataList */ @@ -764,14 +792,14 @@ JS; $SQL_permissionCodes = join("','", $SQL_permissionCodes); return DataObject::get( - 'Member', + 'SilverStripe\\Security\\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\"" ); - + } /** @@ -797,7 +825,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 6f89573..eaea00f 100644 --- a/code/model/SubsiteDomain.php +++ b/code/model/SubsiteDomain.php @@ -1,5 +1,11 @@ 0) { list($sourceParentID, $destParentID) = array_pop($stack); - $children = Versioned::get_by_stage('SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); + $children = Versioned::get_by_stage('SilverStripe\\CMS\\Model\\SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); if($children) { foreach($children as $child) { diff --git a/composer.json b/composer.json index 67682c5..dc289d1 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "require": { "silverstripe/framework": "~4.0", - "silverstripe/cms": "~4.0" + "silverstripe/cms": "~4.0", + "silverstripe/asset-admin": "~1.0.0" }, "require-dev": { "phpunit/PHPUnit": "~3.7@stable" diff --git a/css/LeftAndMain_Subsites.css b/css/LeftAndMain_Subsites.css index 4d751c4..c06a04d 100644 --- a/css/LeftAndMain_Subsites.css +++ b/css/LeftAndMain_Subsites.css @@ -25,12 +25,17 @@ } .cms-menu .cms-subsites{ - padding:3px 0px 15px; + padding: 0 8px 12px; } .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 deleted file mode 100644 index bc3c310..0000000 --- a/templates/LeftAndMain_Menu.ss +++ /dev/null @@ -1,45 +0,0 @@ -
-
- - - - <% 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 new file mode 100644 index 0000000..d6f3266 --- /dev/null +++ b/templates/SilverStripe/Admin/Includes/LeftAndMain_Menu.ss @@ -0,0 +1,18 @@ +
+
+ <% 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 de0940e..d67b537 100644 --- a/tests/BaseSubsiteTest.php +++ b/tests/BaseSubsiteTest.php @@ -1,4 +1,6 @@ assertEquals(' * FileTitle', $file->alternateTreeTitle()); $file->SubsiteID = $this->objFromFixture('Subsite', 'domaintest1')->ID; $this->assertEquals('FileTitle', $file->getTreeTitle()); - $this->assertTrue(singleton('Folder')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('SilverStripe\\Assets\\Folder')->getCMSFields() instanceof FieldList); Subsite::changeSubsite(1); $this->assertEquals($file->cacheKeyComponent(), 'subsite-1'); } function testWritingSubsiteID() { - $this->objFromFixture('Member', 'admin')->logIn(); + $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')->logIn(); $subsite = $this->objFromFixture('Subsite', 'domaintest1'); FileSubsites::$default_root_folders_global = true; @@ -55,7 +59,7 @@ class FileSubsitesTest extends BaseSubsiteTest { } function testSubsitesFolderDropdown() { - $this->objFromFixture('Member', 'admin')->logIn(); + $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')->logIn(); $file = new Folder(); diff --git a/tests/GroupSubsitesTest.php b/tests/GroupSubsitesTest.php index 6ab1fec..4e7d1e3 100644 --- a/tests/GroupSubsitesTest.php +++ b/tests/GroupSubsitesTest.php @@ -1,5 +1,8 @@ assertTrue(is_array(singleton('GroupSubsites')->extraStatics())); $this->assertTrue(is_array(singleton('GroupSubsites')->providePermissions())); - $this->assertTrue(singleton('Group')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('SilverStripe\\Security\\Group')->getCMSFields() instanceof FieldList); } function testAlternateTreeTitle() { diff --git a/tests/LeftAndMainSubsitesTest.php b/tests/LeftAndMainSubsitesTest.php index 0b2c6df..6fa553b 100644 --- a/tests/LeftAndMainSubsitesTest.php +++ b/tests/LeftAndMainSubsitesTest.php @@ -1,5 +1,9 @@ objFromFixture('Member', 'subsite1member'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); - $cmsmain = singleton('CMSMain'); + $cmsmain = singleton('SilverStripe\\CMS\\Controllers\\CMSMain'); $subsites = $cmsmain->sectionSites(true, "Main site", $member); $this->assertDOSEquals(array( array('Title' =>'Subsite1 Template') @@ -28,9 +32,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('Member', 'editor'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); - $cmsmain = singleton('CMSMain'); + $cmsmain = singleton('SilverStripe\\CMS\\Controllers\\CMSMain'); $subsites = $cmsmain->sectionSites(true, "Main site", $member); $this->assertDOSContains(array( array('Title' =>'Main site') @@ -38,7 +42,7 @@ class LeftAndMainSubsitesTest extends FunctionalTest { } function testAccessChecksDontChangeCurrentSubsite() { - $admin = $this->objFromFixture("Member","admin"); + $admin = $this->objFromFixture("SilverStripe\\Security\\Member","admin"); $this->loginAs($admin); $ids = array(); @@ -70,17 +74,17 @@ class LeftAndMainSubsitesTest extends FunctionalTest { $l = new LeftAndMain(); Config::inst()->nest(); - 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', 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', 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()->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()->unnest(); } diff --git a/tests/SiteConfigSubsitesTest.php b/tests/SiteConfigSubsitesTest.php index 612ac32..263d55c 100644 --- a/tests/SiteConfigSubsitesTest.php +++ b/tests/SiteConfigSubsitesTest.php @@ -1,5 +1,7 @@ array('Translatable') + 'SilverStripe\CMS\Model\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('SiteTree')->getSiteConfig() instanceof SiteConfig); + $this->assertTrue(singleton('SilverStripe\\CMS\\Model\\SiteTree')->getSiteConfig() instanceof SiteConfig); // The following assert is breaking in Translatable. - $this->assertTrue(singleton('SiteTree')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('SilverStripe\\CMS\\Model\\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('Member', 'admin'); - $subsite1member = $this->objFromFixture('Member', 'subsite1member'); - $subsite2member = $this->objFromFixture('Member', 'subsite2member'); + $admin = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); + $subsite1member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); + $subsite2member = $this->objFromFixture('SilverStripe\\Security\\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( @@ -101,7 +110,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()}. */ @@ -109,7 +118,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; @@ -123,7 +132,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); @@ -131,71 +140,71 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest { Subsite::changeSubsite($s2); $this->assertEquals($p2->ID, SiteTree::get_by_link('test-page')->ID); } - + function testPageTypesBlacklistInClassDropdown() { - $editor = $this->objFromFixture('Member', 'editor'); + $editor = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); Session::set("loggedInAs", $editor->ID); - + $s1 = $this->objFromFixture('Subsite','domaintest1'); $s2 = $this->objFromFixture('Subsite','domaintest2'); - $page = singleton('SiteTree'); - + $page = singleton('SilverStripe\\CMS\\Model\\SiteTree'); + $s1->PageTypeBlacklist = 'SiteTreeSubsitesTest_ClassA,ErrorPage'; $s1->write(); - + Subsite::changeSubsite($s1); $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); - - $this->assertArrayNotHasKey('ErrorPage', + + $this->assertArrayNotHasKey('SilverStripe\\CMS\\Model\\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('ErrorPage', + $this->assertArrayHasKey('SilverStripe\\CMS\\Model\\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('Member', 'editor'); + $editor = $this->objFromFixture('SilverStripe\\Security\\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('ErrorPage', $classes); + $this->assertContains('SilverStripe\\CMS\\Model\\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('ErrorPage', $classes); + $this->assertNotContains('SilverStripe\\CMS\\Model\\ErrorPage', $classes); $this->assertNotContains('SiteTreeSubsitesTest_ClassA', $classes); $this->assertNotContains('SiteTreeSubsitesTest_ClassB', $classes); } - + } class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly {} @@ -213,4 +222,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 02f393f..d77c19e 100644 --- a/tests/SubsiteAdminFunctionalTest.php +++ b/tests/SubsiteAdminFunctionalTest.php @@ -1,5 +1,9 @@ objFromFixture('Member', 'admin'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); Session::set("loggedInAs", $member->ID); $this->getAndFollowAll('admin/pages/?SubsiteID=0'); @@ -57,7 +61,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { } function testAdminIsRedirectedToObjectsSubsite() { - $member = $this->objFromFixture('Member', 'admin'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); Session::set("loggedInAs", $member->ID); $mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage'); @@ -65,13 +69,13 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { Config::inst()->nest(); - Config::inst()->update('CMSPageEditController', 'treats_subsite_0_as_global', false); + Config::inst()->update('SilverStripe\\CMS\\Controllers\\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('CMSPageEditController', 'treats_subsite_0_as_global', true); + Config::inst()->update('SilverStripe\\CMS\\Controllers\\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'); @@ -89,7 +93,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest { * even though he does not have the ADMIN permission. */ function testEditorCanAccessAllSubsites() { - $member = $this->objFromFixture('Member', 'editor'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'editor'); Session::set("loggedInAs", $member->ID); $this->getAndFollowAll('admin/pages/?SubsiteID=0'); @@ -110,7 +114,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('Member', 'subsite1member'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); Session::set("loggedInAs", $member->ID); $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); diff --git a/tests/SubsiteAdminTest.php b/tests/SubsiteAdminTest.php index 3b9fb0f..40288c4 100644 --- a/tests/SubsiteAdminTest.php +++ b/tests/SubsiteAdminTest.php @@ -1,11 +1,15 @@ $this->idFromFixture('Member', 'admin') + 'loggedInAs' => $this->idFromFixture('SilverStripe\\Security\\Member', 'admin') )); } @@ -31,7 +35,7 @@ class SubsiteAdminTest extends BaseSubsiteTest { * of whether he is in a subsite-specific group or not. */ function testMainsiteAdminCanAccessAllSubsites() { - $member = $this->objFromFixture('Member', 'admin'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'admin'); Session::set("loggedInAs", $member->ID); $cmsMain = new CMSMain(); diff --git a/tests/SubsiteTest.php b/tests/SubsiteTest.php index 16ee493..fa63eda 100644 --- a/tests/SubsiteTest.php +++ b/tests/SubsiteTest.php @@ -1,5 +1,8 @@ Count(); foreach($pages as $page) { $this->assertEquals($template->ID, $page->SubsiteID); @@ -256,7 +259,7 @@ class SubsiteTest extends BaseSubsiteTest { } function testAllAccessibleSites() { - $member = $this->objFromFixture('Member', 'subsite1member'); + $member = $this->objFromFixture('SilverStripe\\Security\\Member', 'subsite1member'); $subsites = Subsite::all_accessible_sites(true, 'Main site', $member); $this->assertDOSEquals(array( @@ -269,13 +272,13 @@ class SubsiteTest extends BaseSubsiteTest { */ function testAccessibleSites() { $member1Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('Member', 'subsite1member')); + $this->objFromFixture('SilverStripe\\Security\\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('Member', 'admin')); + $this->objFromFixture('SilverStripe\\Security\\Member', 'admin')); $adminSiteTitles = $adminSites->column("Title"); sort($adminSiteTitles); $this->assertEquals(array( @@ -288,17 +291,17 @@ class SubsiteTest extends BaseSubsiteTest { ), $adminSiteTitles); $member2Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('Member', 'subsite1member2')); + $this->objFromFixture('SilverStripe\\Security\\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('Member', 'admin'); - $subsite1member = $this->objFromFixture('Member', 'subsite1member'); - $subsite1admin = $this->objFromFixture('Member', 'subsite1admin'); - $allsubsitesauthor = $this->objFromFixture('Member', 'allsubsitesauthor'); + $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'); $this->assertTrue( Subsite::hasMainSitePermission($admin), diff --git a/tests/SubsiteTest.yml b/tests/SubsiteTest.yml index 96bffb3..dc2126c 100644 --- a/tests/SubsiteTest.yml +++ b/tests/SubsiteTest.yml @@ -75,14 +75,14 @@ Page: Title: 'Contact Us (Subsite 2)' SubsiteID: =>Subsite.subsite2 -PermissionRoleCode: +SilverStripe\Security\PermissionRoleCode: roleCode1: Code: CMS_ACCESS_CMSMain -PermissionRole: +SilverStripe\Security\PermissionRole: role1: Title: role1 - Codes: =>PermissionRoleCode.roleCode1 -Group: + Codes: =>SilverStripe\Security\PermissionRoleCode.roleCode1 +SilverStripe\Security\Group: admin: Title: Admin Code: admin @@ -114,71 +114,71 @@ Group: Title: subsite1_group_via_role Code: subsite1_group_via_role AccessAllSubsites: 1 - Roles: =>PermissionRole.role1 -Permission: + Roles: =>SilverStripe\Security\PermissionRole.role1 +SilverStripe\Security\Permission: admin: Code: ADMIN - GroupID: =>Group.admin + GroupID: =>SilverStripe\Security\Group.admin editor1: Code: CMS_ACCESS_CMSMain - GroupID: =>Group.editor + GroupID: =>SilverStripe\Security\Group.editor editor2: Code: SITETREE_VIEW_ALL - GroupID: =>Group.editor + GroupID: =>SilverStripe\Security\Group.editor editor3: Code: VIEW_DRAFT_CONTENT - GroupID: =>Group.editor + GroupID: =>SilverStripe\Security\Group.editor accesscmsmain1: Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1_group + GroupID: =>SilverStripe\Security\Group.subsite1_group accesscmsmain2: Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite2_group + GroupID: =>SilverStripe\Security\Group.subsite2_group accesscmsmain3: Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1admins + GroupID: =>SilverStripe\Security\Group.subsite1admins accesscmsmain4: Code: CMS_ACCESS_CMSMain - GroupID: =>Group.allsubsitesauthors + GroupID: =>SilverStripe\Security\Group.allsubsitesauthors securityaccess1: Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite1_group + GroupID: =>SilverStripe\Security\Group.subsite1_group securityaccess2: Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite2_group + GroupID: =>SilverStripe\Security\Group.subsite2_group adminsubsite1: Code: ADMIN - GroupID: =>Group.subsite1admins + GroupID: =>SilverStripe\Security\Group.subsite1admins -Member: +SilverStripe\Security\Member: admin: FirstName: Admin Surname: User Email: admin@test.com Password: rangi - Groups: =>Group.admin + Groups: =>SilverStripe\Security\Group.admin editor: FirstName: Editor Surname: User Email: editor@test.com Password: rangi - Groups: =>Group.editor + Groups: =>SilverStripe\Security\Group.editor subsite1member: Email: subsite1member@test.com - Groups: =>Group.subsite1_group + Groups: =>SilverStripe\Security\Group.subsite1_group subsite2member: Email: subsite2member@test.com - Groups: =>Group.subsite2_group + Groups: =>SilverStripe\Security\Group.subsite2_group subsite1admin: Email: subsite1admin@test.com - Groups: =>Group.subsite1admins + Groups: =>SilverStripe\Security\Group.subsite1admins allsubsitesauthor: Email: allsubsitesauthor@test.com - Groups: =>Group.allsubsitesauthors + Groups: =>SilverStripe\Security\Group.allsubsitesauthors subsite1member2: Email: subsite1member2@test.com - Groups: =>Group.subsite1_group_via_role + Groups: =>SilverStripe\Security\Group.subsite1_group_via_role -SiteConfig: +SilverStripe\SiteConfig\SiteConfig: config: CanCreateTopLevelType: LoggedInUsers diff --git a/tests/SubsitesVirtualPageTest.php b/tests/SubsitesVirtualPageTest.php index 59eab99..27dc1ca 100644 --- a/tests/SubsitesVirtualPageTest.php +++ b/tests/SubsitesVirtualPageTest.php @@ -1,5 +1,10 @@ objFromFixture('File', 'file1'); - $page = $this->objFromFixture('SiteTree', 'page1'); + $file = $this->objFromFixture('SilverStripe\\Assets\\File', 'file1'); + $page = $this->objFromFixture('SilverStripe\\CMS\\Model\\SiteTree', 'page1'); $fromPath = __DIR__ . '/testscript-test-file.pdf'; $destPath = AssetStoreTest_SpyStore::getLocalPath($file); Filesystem::makeFolder(dirname($destPath)); @@ -57,7 +62,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { $this->logInWithPermission('ADMIN'); // Publish the source page - $page = $this->objFromFixture('SiteTree', 'page1'); + $page = $this->objFromFixture('SilverStripe\\CMS\\Model\\SiteTree', 'page1'); $this->assertTrue($page->doPublish()); // Create a virtual page from it, and publish that @@ -67,7 +72,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { $svp->doPublish(); // Rename the file - $file = $this->objFromFixture('File', 'file1'); + $file = $this->objFromFixture('SilverStripe\\Assets\\File', 'file1'); $file->Name = 'renamed-test-file.pdf'; $file->write(); @@ -261,8 +266,8 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest { function fixVersionNumberCache($page) { $pages = func_get_args(); foreach($pages as $p) { - Versioned::prepopulate_versionnumber_cache('SiteTree', 'Stage', array($p->ID)); - Versioned::prepopulate_versionnumber_cache('SiteTree', 'Live', array($p->ID)); + Versioned::prepopulate_versionnumber_cache('SilverStripe\\CMS\\Model\\SiteTree', 'Stage', array($p->ID)); + Versioned::prepopulate_versionnumber_cache('SilverStripe\\CMS\\Model\\SiteTree', 'Live', array($p->ID)); } } diff --git a/tests/SubsitesVirtualPageTest.yml b/tests/SubsitesVirtualPageTest.yml index 501d547..7e17e63 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. -File: +SilverStripe\Assets\File: file1: FileFilename: testscript-test-file.pdf FileHash: 464dedb70af0dc7f8f3360e7f3ae43cbbf1cdf4e Name: testscript-test-file.pdf -SiteTree: +SilverStripe\CMS\Model\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 1ac5c27..b5be73d 100644 --- a/tests/behat/features/bootstrap/Context/FeatureContext.php +++ b/tests/behat/features/bootstrap/Context/FeatureContext.php @@ -11,6 +11,9 @@ 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'; @@ -49,15 +52,15 @@ class FeatureContext extends SilverStripeContext { // Use blueprints to set user name from identifier $factory = $fixtureContext->getFixtureFactory(); - $blueprint = \Injector::inst()->create('FixtureBlueprint', 'Member'); + $blueprint = Injector::inst()->create('SilverStripe\\Dev\\FixtureBlueprint', 'SilverStripe\\Security\\Member'); $blueprint->addCallback('beforeCreate', function($identifier, &$data, &$fixtures) { if(!isset($data['FirstName'])) $data['FirstName'] = $identifier; }); - $factory->define('Member', $blueprint); + $factory->define('SilverStripe\\Security\\Member', $blueprint); // Auto-publish pages - foreach(\ClassInfo::subclassesFor('SiteTree') as $id => $class) { - $blueprint = \Injector::inst()->create('FixtureBlueprint', $class); + foreach(ClassInfo::subclassesFor('SilverStripe\\CMS\\Model\\SiteTree') as $id => $class) { + $blueprint = Injector::inst()->create('SilverStripe\\Dev\\FixtureBlueprint', $class); $blueprint->addCallback('afterCreate', function($obj, $identifier, &$data, &$fixtures) { $obj->publish('Stage', 'Live'); }); @@ -78,7 +81,7 @@ class FeatureContext extends SilverStripeContext { */ public function getFixtureFactory() { if(!$this->fixtureFactory) { - $this->fixtureFactory = \Injector::inst()->create('BehatFixtureFactory'); + $this->fixtureFactory = Injector::inst()->create('SilverStripe\\Dev\\BehatFixtureFactory'); } return $this->fixtureFactory;