From 984d5d9a59635fabf1c8fcaea701a7e9c36d08eb Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 17 Nov 2015 16:07:38 +1300 Subject: [PATCH 01/38] Update translations --- lang/ar.yml | 9 ++++----- lang/cs.yml | 33 +++++++++++++++++++++++++++++++++ lang/de.yml | 14 +++++++++----- lang/eo.yml | 15 ++++++++++----- lang/fi.yml | 9 ++++----- lang/id.yml | 4 ++-- lang/ja.yml | 4 ++-- lang/lt.yml | 44 ++++++++++++++++++++++++++++++++++++++++++++ lang/mi.yml | 9 ++++----- lang/nb_NO.yml | 4 ++-- lang/nl.yml | 5 ++--- lang/pl_PL.yml | 4 ++-- lang/tr_TR.yml | 4 ++-- lang/zh.yml | 9 ++++----- 14 files changed, 124 insertions(+), 43 deletions(-) create mode 100644 lang/cs.yml create mode 100644 lang/lt.yml diff --git a/lang/ar.yml b/lang/ar.yml index 54e70f4..9e40060 100644 --- a/lang/ar.yml +++ b/lang/ar.yml @@ -1,8 +1,4 @@ ar: - SubsiteAdmin: - MENUTITLE: مواقع فرعية - SubsiteXHRController: - MENUTITLE: المراقب XHR للموقع الفرعي ASSETADMIN: SUBSITENOTICE: 'يمكن الوصول إلى المجلدات والملفات التي تم إنشاؤها في الموقع الرئيسي من طرف كل المواقع الفرعية.' FileSubsites: @@ -42,6 +38,8 @@ ar: SiteConfigTitle: 'اسم موقعك' TabTitleConfig: المواصفات ValidateTitle: 'الرجاء إضافة "عنوان"' + SubsiteAdmin: + MENUTITLE: مواقع فرعية SubsiteDomain: DOMAIN: نطاق IS_PRIMARY: 'هو نطاق أساسي' @@ -49,6 +47,8 @@ ar: SINGULARNAME: 'نطاق موقع فرعي' SubsiteReportWrapper: ReportDropdown: المواقع + SubsiteXHRController: + MENUTITLE: المراقب XHR للموقع الفرعي Subsites: DefaultSiteFieldLabel: 'الموقع الافتراضي' DomainFieldLabel: النطاق @@ -62,6 +62,5 @@ ar: TitleFieldLabel: 'اسم الموقع الفرعي' SubsitesVirtualPage: DESCRIPTION: 'يعرض محتوى صفحة على موقع فرعي آخر' - PLURALNAME: 'قاعدة الصفحات' SINGULARNAME: 'الصفحة الإفتراضية للمواقع الفرعية' SubsiteField: الموقع الفرعي diff --git a/lang/cs.yml b/lang/cs.yml new file mode 100644 index 0000000..0f4a891 --- /dev/null +++ b/lang/cs.yml @@ -0,0 +1,33 @@ +cs: + LeftAndMain_Menu: + Hello: Ahoj + LOGOUT: 'Odhlásit se' + SiteTreeSubsites: + CopyAction: Kopírovat + Subsite: + CustomExtraMeta: 'Vlastní meta tagy' + CustomMetaDescription: Popis + CustomMetaKeywords: Klíčová slova + CustomMetaTitle: Název + DOMAINSAVEFIRST: 'Domény můžete přidávat až po uložení' + DomainsHeadline: 'Domény pro tento web' + DomainsListTitle: Domény + SiteConfigSubtitle: 'Slogan Vašeho webu' + SiteConfigTitle: 'Název Vašeho webu' + TabTitleConfig: Konfigurace + ValidateTitle: 'Prosím vložte "Název"' + SubsiteAdmin: + MENUTITLE: Subsites + SubsiteDomain: + DOMAIN: Doména + IS_PRIMARY: 'Výchozí' + PLURALNAME: 'Domény webů' + SINGULARNAME: 'Doména webu' + SubsiteReportWrapper: + ReportDropdown: Weby + Subsites: + DefaultSiteFieldLabel: 'Výchozí web' + DomainFieldLabel: Doména + LanguageFieldLabel: Jazyk + ThemeFieldLabel: Téma + TitleFieldLabel: 'Název subsite' diff --git a/lang/de.yml b/lang/de.yml index 02e8379..23cc6f4 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -1,8 +1,4 @@ de: - SubsiteAdmin: - MENUTITLE: Subsites - SubsiteXHRController: - MENUTITLE: SubsiteXHRController ASSETADMIN: SUBSITENOTICE: 'Auf Ordner und Dateien der Hauptseite kann von allen Subsites zugegriffen werden.' FileSubsites: @@ -20,6 +16,9 @@ de: SECURITYTABTITLE: Subsites LeftAndMainSubsites: Saved: 'Gespeichert.' + LeftAndMain_Menu: + Hello: Hallo + LOGOUT: 'Abmelden' SiteTreeSubsites: CopyAction: Kopieren CopyToSubsite: 'Seite auf Subseite Kopieren' @@ -42,6 +41,8 @@ de: SiteConfigTitle: 'Name Ihrer Website' TabTitleConfig: Einstellungen ValidateTitle: 'Bitte geben Sie einen Titel an' + SubsiteAdmin: + MENUTITLE: Subsites SubsiteDomain: DOMAIN: Domain IS_PRIMARY: 'Ist primäre Domain' @@ -49,6 +50,8 @@ de: SINGULARNAME: 'Subsite Domain' SubsiteReportWrapper: ReportDropdown: Seiten + SubsiteXHRController: + MENUTITLE: SubsiteXHRController Subsites: DefaultSiteFieldLabel: 'Standard Seite' DomainFieldLabel: Domäne @@ -62,6 +65,7 @@ de: TitleFieldLabel: 'Name der Subsite' SubsitesVirtualPage: DESCRIPTION: 'Zeigt den Inhalt einer anderen Seite von einer anderen Subsite an' - PLURALNAME: 'Subsites Virtuelle Seiten' SINGULARNAME: 'Subsites Virtuelle Seite' SubsiteField: Subsite + VirtualPage: + EDITCONTENT: 'Klicken Sie hier, um den Inhalt zu bearbeiten' diff --git a/lang/eo.yml b/lang/eo.yml index 19bbe25..23e7f44 100644 --- a/lang/eo.yml +++ b/lang/eo.yml @@ -1,8 +1,4 @@ eo: - SubsiteAdmin: - MENUTITLE: Subretejoj - SubsiteXHRController: - MENUTITLE: SubsiteXHRController ASSETADMIN: SUBSITENOTICE: 'Dosierujoj kaj dosieroj kreitaj en la ĉefa retejo estas alireblaj de ĉiuj retejoj' FileSubsites: @@ -20,6 +16,9 @@ eo: SECURITYTABTITLE: Subsites LeftAndMainSubsites: Saved: 'Konservita, bonvole ĝisdatigi rilatajn paĝojn.' + LeftAndMain_Menu: + Hello: Saluton + LOGOUT: 'Elsaluti' SiteTreeSubsites: CopyAction: Kopio CopyToSubsite: 'Kopii paĝon al subretejo' @@ -42,6 +41,8 @@ eo: SiteConfigTitle: 'Nomo de via retejo' TabTitleConfig: Agordaro ValidateTitle: 'Bonvole aldonu "Titolon"' + SubsiteAdmin: + MENUTITLE: Subretejoj SubsiteDomain: DOMAIN: Domajno IS_PRIMARY: 'Estas unuaranga domajno' @@ -49,6 +50,8 @@ eo: SINGULARNAME: 'Subreteja domajno' SubsiteReportWrapper: ReportDropdown: Retejoj + SubsiteXHRController: + MENUTITLE: SubsiteXHRController Subsites: DefaultSiteFieldLabel: 'Apriora retejo' DomainFieldLabel: Domajno @@ -62,6 +65,8 @@ eo: TitleFieldLabel: 'Nomo de subretejo' SubsitesVirtualPage: DESCRIPTION: 'Vidigas la enhavon de paĝo en alia subretejo' - PLURALNAME: 'Virtualaj paĝoj de subretejoj' + PLURALNAME: 'Bazaj paĝoj' SINGULARNAME: 'Virtuala paĝo de subretejoj' SubsiteField: Subretejo + VirtualPage: + EDITCONTENT: 'Alklaku ĉi tie por redakti la enhavon' diff --git a/lang/fi.yml b/lang/fi.yml index ba4d7c5..5c016ac 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -1,8 +1,4 @@ fi: - SubsiteAdmin: - MENUTITLE: Alasivustot - SubsiteXHRController: - MENUTITLE: SubsiteXHRController ASSETADMIN: SUBSITENOTICE: 'Kansiot ja tiedostot, jotka on luotu pääsivustolla, ovat käytettävissä kaikissa alisivustoissa.' FileSubsites: @@ -42,6 +38,8 @@ fi: SiteConfigTitle: 'Sivuston nimi' TabTitleConfig: Asetukset ValidateTitle: 'Lisää "Otsikko"' + SubsiteAdmin: + MENUTITLE: Alasivustot SubsiteDomain: DOMAIN: Domain IS_PRIMARY: 'On päädomain' @@ -49,6 +47,8 @@ fi: SINGULARNAME: 'Alisivuston domain-osoite' SubsiteReportWrapper: ReportDropdown: Sivustot + SubsiteXHRController: + MENUTITLE: SubsiteXHRController Subsites: DefaultSiteFieldLabel: 'Oletussivusto' DomainFieldLabel: Domain @@ -62,6 +62,5 @@ fi: TitleFieldLabel: 'Alisivuston nimi' SubsitesVirtualPage: DESCRIPTION: 'Näyttää sisällön toisen alisivuston sivulta' - PLURALNAME: 'Alisivustojen virtuaaliset sivut' SINGULARNAME: 'Alisivuston Virtuaalisivu' SubsiteField: Alisivu diff --git a/lang/id.yml b/lang/id.yml index 52c3151..3ef2942 100644 --- a/lang/id.yml +++ b/lang/id.yml @@ -1,6 +1,4 @@ id: - SubsiteAdmin: - MENUTITLE: Subsitus FileSubsites: SubsiteFieldLabel: Subsitus GroupSubsites: @@ -11,6 +9,8 @@ id: CustomMetaTitle: Judul PLURALNAME: Subsitus SINGULARNAME: Subsitus + SubsiteAdmin: + MENUTITLE: Subsitus SubsiteReportWrapper: ReportDropdown: Situs Subsites: diff --git a/lang/ja.yml b/lang/ja.yml index 7eedf0d..65dae93 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -1,6 +1,4 @@ ja: - SubsiteAdmin: - MENUTITLE: サブサイト GridFieldAddFromTemplateButton: AddFromTemplate: 'テンプレートから新しく追加' GroupSubsites: @@ -8,6 +6,8 @@ ja: ACCESSONLY: 'これらのサブサイトのみ' ACCESSRADIOTITLE: 'このグループに選択先へのアクセス権を与える' SECURITYTABTITLE: サブサイト + SubsiteAdmin: + MENUTITLE: サブサイト SubsiteDomain: DOMAIN: ドメイン IS_PRIMARY: 'プライマリドメイン' diff --git a/lang/lt.yml b/lang/lt.yml new file mode 100644 index 0000000..c00811b --- /dev/null +++ b/lang/lt.yml @@ -0,0 +1,44 @@ +lt: + FileSubsites: + AllSitesDropdownOpt: 'Visos svetainės' + GridFieldAddFromTemplateButton: + AddFromTemplate: 'Sukurti naują pagal šabloną' + LeftAndMainSubsites: + Saved: 'Išsaugota, prašome atnaujinti susijusius puslapius' + LeftAndMain_Menu: + Hello: Sveiki + LOGOUT: 'Atsijungti' + SiteTreeSubsites: + CopyAction: Kopijuoti + CopyToSubsite: 'Kopijuoti puslapį į kitą svetainę' + Subsite: + COPYSTRUCTURE: 'Kopijuoti struktūrą iš:' + CopyMessage: 'Sukurta {title} kopija' + CustomExtraMeta: 'Kitos meta žymės' + CustomMetaDescription: Aprašymas + CustomMetaKeywords: Raktažodžiai + CustomMetaTitle: Pavadinimas + DomainsHeadline: 'Šio puslapio domenai' + DomainsListTitle: Domenai + NOTEMPLATE: 'Nėra šablono' + PageTypeBlacklistField: 'Neleidžiami puslapių tipai' + SiteConfigSubtitle: 'Jūsų svetainės šūkis' + SiteConfigTitle: 'Jūsų svetainės pavadinimas' + TabTitleConfig: Nustatymai + ValidateTitle: 'Prašome įvesti "Pavadinimą"' + SubsiteDomain: + DOMAIN: Domenas + IS_PRIMARY: 'Pagrindinis domenas' + SubsiteReportWrapper: + ReportDropdown: Svetainės + SubsiteXHRController: + MENUTITLE: SubsiteXHRController + Subsites: + DefaultSiteFieldLabel: 'Pagrindinė svetainė' + DomainFieldLabel: Domenas + IsPublicFieldLabel: 'Leisti pasiekti visiems' + LanguageFieldLabel: Kalba + MainSiteTitle: 'Pagrindinis puslapis' + PrimaryDomainFieldLabel: 'Pagrindinis domenas' + RedirectURLFieldLabel: 'Nukreipimo nuoroda' + ThemeFieldLabel: Tema diff --git a/lang/mi.yml b/lang/mi.yml index 6b67cb7..5909ee2 100644 --- a/lang/mi.yml +++ b/lang/mi.yml @@ -1,8 +1,4 @@ mi: - SubsiteAdmin: - MENUTITLE: Ngā pae iti - SubsiteXHRController: - MENUTITLE: ManaXHRPaeiti ASSETADMIN: SUBSITENOTICE: 'Ka taea ngā kōpaki me ngā kōnae kua hangaia i te pae matua te uru mā ngā pae iti katoa.' FileSubsites: @@ -42,6 +38,8 @@ mi: SiteConfigTitle: 'Tō Ingoa Pae' TabTitleConfig: Whirihoranga ValidateTitle: 'Tāurua he "Taitara"' + SubsiteAdmin: + MENUTITLE: Ngā pae iti SubsiteDomain: DOMAIN: Rohe IS_PRIMARY: 'Ko Te Rohe Matua' @@ -49,6 +47,8 @@ mi: SINGULARNAME: 'Rohe Pae Iti' SubsiteReportWrapper: ReportDropdown: Ngā Pae + SubsiteXHRController: + MENUTITLE: ManaXHRPaeiti Subsites: DefaultSiteFieldLabel: 'Pae taunoa' DomainFieldLabel: Rohe @@ -62,6 +62,5 @@ mi: TitleFieldLabel: 'Ingoa Pae Iti' SubsitesVirtualPage: DESCRIPTION: 'Ka whakaatu i ngā ihirangi o tētahi whārangi ki tētahi atu pae iti' - PLURALNAME: 'Ngā Whārangi Taketake' SINGULARNAME: 'Whārangi Mariko Pae Iti' SubsiteField: Pae iti diff --git a/lang/nb_NO.yml b/lang/nb_NO.yml index dbee77f..7c33cf0 100644 --- a/lang/nb_NO.yml +++ b/lang/nb_NO.yml @@ -1,6 +1,4 @@ nb_NO: - SubsiteAdmin: - MENUTITLE: Underdomener GridFieldAddFromTemplateButton: AddFromTemplate: 'Add New from Template' GroupSubsites: @@ -8,6 +6,8 @@ nb_NO: ACCESSONLY: 'Only these subsites' ACCESSRADIOTITLE: 'Give this group access to' SECURITYTABTITLE: subdomener + SubsiteAdmin: + MENUTITLE: Underdomener SubsiteDomain: DOMAIN: Domain IS_PRIMARY: 'Is Primary Domain' diff --git a/lang/nl.yml b/lang/nl.yml index aef2937..3c5bed2 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -1,6 +1,4 @@ nl: - SubsiteAdmin: - MENUTITLE: Subsites FileSubsites: SubsiteFieldLabel: Subsite GridFieldAddFromTemplateButton: @@ -17,6 +15,8 @@ nl: SINGULARNAME: Subsite SiteConfigTitle: 'Jouw Site Naam' TabTitleConfig: Configuratie + SubsiteAdmin: + MENUTITLE: Subsites SubsiteDomain: DOMAIN: Domein IS_PRIMARY: 'Is Primaire domein' @@ -29,6 +29,5 @@ nl: ThemeFieldLabel: Thema TitleFieldLabel: 'Subsite naam' SubsitesVirtualPage: - PLURALNAME: 'Subsites Virtuele pagina' SINGULARNAME: 'Subsites Virtuele pagina' SubsiteField: Subsite diff --git a/lang/pl_PL.yml b/lang/pl_PL.yml index dc57ca0..bee5b83 100644 --- a/lang/pl_PL.yml +++ b/lang/pl_PL.yml @@ -1,6 +1,4 @@ pl_PL: - SubsiteAdmin: - MENUTITLE: Podwitryny GridFieldAddFromTemplateButton: AddFromTemplate: 'Dodaj nową na podstawie szablonu' GroupSubsites: @@ -8,6 +6,8 @@ pl_PL: ACCESSONLY: 'Tylko te podwitryny' ACCESSRADIOTITLE: 'Daj tej grupie dostęp do' SECURITYTABTITLE: Podwitryny + SubsiteAdmin: + MENUTITLE: Podwitryny SubsiteDomain: DOMAIN: Domena IS_PRIMARY: 'Ma priorytet?' diff --git a/lang/tr_TR.yml b/lang/tr_TR.yml index c515f0a..2df21f7 100644 --- a/lang/tr_TR.yml +++ b/lang/tr_TR.yml @@ -1,6 +1,4 @@ tr_TR: - SubsiteAdmin: - MENUTITLE: Alt Siteler GridFieldAddFromTemplateButton: AddFromTemplate: 'Add New from Template' GroupSubsites: @@ -8,6 +6,8 @@ tr_TR: ACCESSONLY: 'Only these subsites' ACCESSRADIOTITLE: 'Give this group access to' SECURITYTABTITLE: Alt Siteler + SubsiteAdmin: + MENUTITLE: Alt Siteler SubsiteDomain: DOMAIN: Domain IS_PRIMARY: 'Is Primary Domain' diff --git a/lang/zh.yml b/lang/zh.yml index 6af6b7b..5f95f08 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -1,8 +1,4 @@ zh: - SubsiteAdmin: - MENUTITLE: 多个子网站 - SubsiteXHRController: - MENUTITLE: 子网站 XHR 控制器 ASSETADMIN: SUBSITENOTICE: '主网站上创建的文件夹和文件可以被所有子网站访问。' FileSubsites: @@ -42,6 +38,8 @@ zh: SiteConfigTitle: '您的网站名称' TabTitleConfig: 配置 ValidateTitle: '请添加一个“标题”' + SubsiteAdmin: + MENUTITLE: 多个子网站 SubsiteDomain: DOMAIN: 域名 IS_PRIMARY: '是主域名' @@ -49,6 +47,8 @@ zh: SINGULARNAME: '子网站域名' SubsiteReportWrapper: ReportDropdown: 网站 + SubsiteXHRController: + MENUTITLE: 子网站 XHR 控制器 Subsites: DefaultSiteFieldLabel: '默认网站' DomainFieldLabel: 域名 @@ -62,6 +62,5 @@ zh: TitleFieldLabel: '子网站名称' SubsitesVirtualPage: DESCRIPTION: '显示另一个子网站上一个页面的内容' - PLURALNAME: '基本页面' SINGULARNAME: '子网站虚拟页面' SubsiteField: 子网站 From 1fc2fe54407b4024d7eef04d887aaad30f0b5774 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 19 Nov 2015 15:34:55 +1300 Subject: [PATCH 02/38] Add changelog for 1.1.0 release --- CHANGELOG | 0 CHANGELOG.md | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) delete mode 100644 CHANGELOG create mode 100644 CHANGELOG.md diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index e69de29..0000000 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fb77637 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +This project adheres to [Semantic Versioning](http://semver.org/). + +## [1.1.0] + +* Changelog added. +* Fixes #135: LeftAndMain switching between subsites +* BUG Fix incompatibility with framework 3.2 +* Adjusted tests to new SiteTree->canCreate() logic in 3.1.11+ +* Fix subsites to use correct permissions +* Wrong edit link in SubsitesVirtualPage +* Added missing route to `SubsiteXHRController` for SilverStripe 3.2 compatibility. +* Add sticky nav toggle button +* BUG Subsites selection on SubsitesVirtualPage (fixes #45 and #47) +* Update translations From a0ede56c0e4e7a5b197be0538f77c3806cc8895b Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Mon, 23 Nov 2015 16:53:45 +1300 Subject: [PATCH 03/38] Reformat for psr-2 --- _config.php | 1 - code/SubsiteAdmin.php | 40 +- code/SubsiteReportWrapper.php | 118 +- code/SubsiteXHRController.php | 73 +- code/SubsitesVirtualPage.php | 419 ++--- .../CMSPageAddControllerExtension.php | 12 +- code/extensions/ControllerSubsites.php | 32 +- code/extensions/ErrorPageSubsite.php | 79 +- code/extensions/FileSubsites.php | 230 +-- code/extensions/GroupSubsites.php | 329 ++-- code/extensions/LeftAndMainSubsites.php | 532 +++--- code/extensions/SiteConfigSubsites.php | 88 +- code/extensions/SiteTreeSubsites.php | 585 ++++--- code/extensions/SubsiteMenuExtension.php | 12 +- code/forms/GridFieldSubsiteDetailForm.php | 93 +- code/forms/SubsitesTreeDropdownField.php | 78 +- code/model/Subsite.php | 1506 +++++++++-------- code/model/SubsiteDomain.php | 136 +- code/tasks/SubsiteCopyPagesTask.php | 108 +- tests/BaseSubsiteTest.php | 46 +- tests/FileSubsitesTest.php | 141 +- tests/GroupSubsitesTest.php | 49 +- tests/LeftAndMainSubsitesTest.php | 144 +- tests/SiteConfigSubsitesTest.php | 67 +- tests/SiteTreeSubsitesTest.php | 392 ++--- tests/SubsiteAdminFunctionalTest.php | 235 +-- tests/SubsiteAdminTest.php | 59 +- tests/SubsiteTest.php | 704 ++++---- tests/SubsitesVirtualPageTest.php | 532 +++--- .../bootstrap/Context/FeatureContext.php | 52 +- 30 files changed, 3602 insertions(+), 3290 deletions(-) diff --git a/_config.php b/_config.php index 0cbece5..e0b5703 100644 --- a/_config.php +++ b/_config.php @@ -25,4 +25,3 @@ CMSMain::add_extension('SubsiteMenuExtension'); CMSPagesController::add_extension('SubsiteMenuExtension'); SubsiteAdmin::add_extension('SubsiteMenuExtension'); CMSSettingsController::add_extension('SubsiteMenuExtension'); - diff --git a/code/SubsiteAdmin.php b/code/SubsiteAdmin.php index abea9a1..7de900d 100644 --- a/code/SubsiteAdmin.php +++ b/code/SubsiteAdmin.php @@ -4,30 +4,30 @@ * * @package subsites */ -class SubsiteAdmin extends ModelAdmin { - - private static $managed_models = array('Subsite'); +class SubsiteAdmin extends ModelAdmin +{ + private static $managed_models = array('Subsite'); - private static $url_segment = 'subsites'; - - private static $menu_title = "Subsites"; + private static $url_segment = 'subsites'; + + private static $menu_title = "Subsites"; - private static $menu_icon = "subsites/images/subsites.png"; - - public $showImportForm=false; + private static $menu_icon = "subsites/images/subsites.png"; + + public $showImportForm=false; - private static $tree_class = 'Subsite'; + private static $tree_class = 'Subsite'; - public function getEditForm($id = null, $fields = null) { - $form = parent::getEditForm($id, $fields); + public function getEditForm($id = null, $fields = null) + { + $form = parent::getEditForm($id, $fields); - $grid=$form->Fields()->dataFieldByName('Subsite'); - if($grid) { - $grid->getConfig()->removeComponentsByType('GridFieldDetailForm'); - $grid->getConfig()->addComponent(new GridFieldSubsiteDetailForm()); - } - - return $form; - } + $grid=$form->Fields()->dataFieldByName('Subsite'); + if ($grid) { + $grid->getConfig()->removeComponentsByType('GridFieldDetailForm'); + $grid->getConfig()->addComponent(new GridFieldSubsiteDetailForm()); + } + return $form; + } } diff --git a/code/SubsiteReportWrapper.php b/code/SubsiteReportWrapper.php index 2774cfc..3e85c24 100644 --- a/code/SubsiteReportWrapper.php +++ b/code/SubsiteReportWrapper.php @@ -4,62 +4,66 @@ * Creates a subsite-aware version of another report. * Pass another report (or its classname) into the constructor. */ -class SubsiteReportWrapper extends SS_ReportWrapper { - /////////////////////////////////////////////////////////////////////////////////////////// - // Filtering - - function parameterFields() { - $subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', true); - $options = $subsites->toDropdownMap('ID', 'Title'); - - $subsiteField = new TreeMultiselectField( - 'Subsites', - _t('SubsiteReportWrapper.ReportDropdown', 'Sites'), - $options - ); - $subsiteField->setValue(array_keys($options)); +class SubsiteReportWrapper extends SS_ReportWrapper +{ + /////////////////////////////////////////////////////////////////////////////////////////// + // Filtering - // We don't need to make the field editable if only one subsite is available - if(sizeof($options) <= 1) { - $subsiteField = $subsiteField->performReadonlyTransformation(); - } - - $fields = parent::parameterFields(); - if($fields) { - $fields->insertBefore($subsiteField, $fields->First()->Name()); - } else { - $fields = new FieldList($subsiteField); - } - return $fields; - } + public function parameterFields() + { + $subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', true); + $options = $subsites->toDropdownMap('ID', 'Title'); + + $subsiteField = new TreeMultiselectField( + 'Subsites', + _t('SubsiteReportWrapper.ReportDropdown', 'Sites'), + $options + ); + $subsiteField->setValue(array_keys($options)); - /////////////////////////////////////////////////////////////////////////////////////////// - // Columns - - function columns() { - $columns = parent::columns(); - $columns['Subsite.Title'] = "Subsite"; - return $columns; - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Querying - - function beforeQuery($params) { - // The user has select a few specific sites - if(!empty($params['Subsites'])) { - Subsite::$force_subsite = $params['Subsites']; - - // Default: restrict to all accessible sites - } else { - $subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain'); - $options = $subsites->toDropdownMap('ID', 'Title'); - Subsite::$force_subsite = join(',', array_keys($options)); - } - } - function afterQuery() { - // Manually manage the subsite filtering - Subsite::$force_subsite = null; - } - -} \ No newline at end of file + // We don't need to make the field editable if only one subsite is available + if (sizeof($options) <= 1) { + $subsiteField = $subsiteField->performReadonlyTransformation(); + } + + $fields = parent::parameterFields(); + if ($fields) { + $fields->insertBefore($subsiteField, $fields->First()->Name()); + } else { + $fields = new FieldList($subsiteField); + } + return $fields; + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Columns + + public function columns() + { + $columns = parent::columns(); + $columns['Subsite.Title'] = "Subsite"; + return $columns; + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Querying + + public function beforeQuery($params) + { + // The user has select a few specific sites + if (!empty($params['Subsites'])) { + Subsite::$force_subsite = $params['Subsites']; + + // Default: restrict to all accessible sites + } else { + $subsites = Subsite::accessible_sites('CMS_ACCESS_CMSMain'); + $options = $subsites->toDropdownMap('ID', 'Title'); + Subsite::$force_subsite = join(',', array_keys($options)); + } + } + public function afterQuery() + { + // Manually manage the subsite filtering + Subsite::$force_subsite = null; + } +} diff --git a/code/SubsiteXHRController.php b/code/SubsiteXHRController.php index 052768e..7468732 100644 --- a/code/SubsiteXHRController.php +++ b/code/SubsiteXHRController.php @@ -3,43 +3,52 @@ /** * Section-agnostic PJAX controller. */ -class SubsiteXHRController extends LeftAndMain { +class SubsiteXHRController extends LeftAndMain +{ + /** + * Relax the access permissions, so anyone who has access to any CMS subsite can access this controller. + */ + public function canView($member = null) + { + if (parent::canView()) { + return true; + } - /** - * Relax the access permissions, so anyone who has access to any CMS subsite can access this controller. - */ - public function canView($member = null) { - if (parent::canView()) return true; + if (Subsite::all_accessible_sites()->count()>0) { + return true; + } - if (Subsite::all_accessible_sites()->count()>0) return true; + return false; + } - return false; - } + /** + * Similar as above, but for the LeftAndMainSubsites - allow access if user allowed into the CMS at all. + */ + public function canAccess() + { + if (Subsite::all_accessible_sites()->count()>0) { + return true; + } + } - /** - * Similar as above, but for the LeftAndMainSubsites - allow access if user allowed into the CMS at all. - */ - public function canAccess() { - if (Subsite::all_accessible_sites()->count()>0) return true; - } + public function getResponseNegotiator() + { + $negotiator = parent::getResponseNegotiator(); + $self = $this; - public function getResponseNegotiator() { - $negotiator = parent::getResponseNegotiator(); - $self = $this; + // Register a new callback + $negotiator->setCallback('SubsiteList', function () use (&$self) { + return $self->SubsiteList(); + }); - // Register a new callback - $negotiator->setCallback('SubsiteList', function() use(&$self) { - return $self->SubsiteList(); - }); - - return $negotiator; - } - - /** - * Provide the list of available subsites as a cms-section-agnostic PJAX handler. - */ - public function SubsiteList() { - return $this->renderWith('SubsiteList'); - } + return $negotiator; + } + /** + * Provide the list of available subsites as a cms-section-agnostic PJAX handler. + */ + public function SubsiteList() + { + return $this->renderWith('SubsiteList'); + } } diff --git a/code/SubsitesVirtualPage.php b/code/SubsitesVirtualPage.php index c63fa13..ccc801d 100644 --- a/code/SubsitesVirtualPage.php +++ b/code/SubsitesVirtualPage.php @@ -1,212 +1,233 @@ 'Varchar(255)', + 'CustomMetaKeywords' => 'Varchar(255)', + 'CustomMetaDescription' => '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))); - private static $db = array( - 'CustomMetaTitle' => 'Varchar(255)', - 'CustomMetaKeywords' => 'Varchar(255)', - 'CustomMetaDescription' => '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"), + $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", + "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') . + ""; + $fields->removeByName("VirtualPageContentLinkLabel"); + $fields->addFieldToTab( + "Root.Main", + $linkToContentLabelField = new LabelField('VirtualPageContentLinkLabel', $linkToContent), + 'Title' + ); + $linkToContentLabelField->setAllowHTML(true); + } + + + $fields->addFieldToTab( + 'Root.Main', + TextField::create( + 'CustomMetaTitle', + $this->fieldLabel('CustomMetaTitle') + )->setDescription(_t('SubsitesVirtualPage.OverrideNote', 'Overrides inherited value from the source')), + 'MetaTitle' + ); + $fields->addFieldToTab( + 'Root.Main', + TextareaField::create( + 'CustomMetaKeywords', + $this->fieldLabel('CustomMetaTitle') + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + 'MetaKeywords' + ); + $fields->addFieldToTab( + 'Root.Main', + TextareaField::create( + 'CustomMetaDescription', + $this->fieldLabel('CustomMetaTitle') + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + 'MetaDescription' + ); + $fields->addFieldToTab( + 'Root.Main', + TextField::create( + 'CustomExtraMeta', + $this->fieldLabel('CustomMetaTitle') + )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), + 'ExtraMeta' + ); + + return $fields; + } - $fields->addFieldToTab( - 'Root.Main', - DropdownField::create( - "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", - "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') . - ""; - $fields->removeByName("VirtualPageContentLinkLabel"); - $fields->addFieldToTab( - "Root.Main", - $linkToContentLabelField = new LabelField('VirtualPageContentLinkLabel', $linkToContent), - 'Title' - ); - $linkToContentLabelField->setAllowHTML(true); - } - - - $fields->addFieldToTab( - 'Root.Main', - TextField::create( - 'CustomMetaTitle', - $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote', 'Overrides inherited value from the source')), - 'MetaTitle' - ); - $fields->addFieldToTab( - 'Root.Main', - TextareaField::create( - 'CustomMetaKeywords', - $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), - 'MetaKeywords' - ); - $fields->addFieldToTab( - 'Root.Main', - TextareaField::create( - 'CustomMetaDescription', - $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), - 'MetaDescription' - ); - $fields->addFieldToTab( - 'Root.Main', - TextField::create( - 'CustomExtraMeta', - $this->fieldLabel('CustomMetaTitle') - )->setDescription(_t('SubsitesVirtualPage.OverrideNote')), - 'ExtraMeta' - ); - - return $fields; - } + public function fieldLabels($includerelations = true) + { + $labels = parent::fieldLabels($includerelations); + $labels['CustomMetaTitle'] = _t('Subsite.CustomMetaTitle', 'Title'); + $labels['CustomMetaKeywords'] = _t('Subsite.CustomMetaKeywords', 'Keywords'); + $labels['CustomMetaDescription'] = _t('Subsite.CustomMetaDescription', 'Description'); + $labels['CustomExtraMeta'] = _t('Subsite.CustomExtraMeta', 'Custom Meta Tags'); - public function fieldLabels($includerelations = true) { - $labels = parent::fieldLabels($includerelations); - $labels['CustomMetaTitle'] = _t('Subsite.CustomMetaTitle','Title'); - $labels['CustomMetaKeywords'] = _t('Subsite.CustomMetaKeywords','Keywords'); - $labels['CustomMetaDescription'] = _t('Subsite.CustomMetaDescription','Description'); - $labels['CustomExtraMeta'] = _t('Subsite.CustomExtraMeta','Custom Meta Tags'); + return $labels; + } - return $labels; - } + 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)]); + } + } - 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; + } + Subsite::$disable_subsite_filter = $oldState; + } - 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; - 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; + } + if ($this->CustomMetaKeywords) { + $this->MetaKeywords = $this->CustomMetaKeywords; + } else { + $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; + } + if ($this->CustomExtraMeta) { + $this->ExtraMeta = $this->CustomExtraMeta; + } else { + $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; - public function onBeforeWrite() { - parent::onBeforeWrite(); - - if($this->CustomMetaTitle) $this->MetaTitle = $this->CustomMetaTitle; - else { - $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; - } - if($this->CustomMetaDescription) $this->MetaDescription = $this->CustomMetaDescription; - else { - $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; - } - } - - 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 ($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', + "\"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', + "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter", + false // disable cache, it doesn't include subsite status in the key + ); - 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( - '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', - "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter", - false // disable cache, it doesn't include subsite status in the key - ); - - // If URL has been vetoed because of an existing page, - // be more specific and allow same URLSegments in different subsites - $isValid = !($existingPage && $existingPageInSubsite); - } - - return $isValid; - } + // If URL has been vetoed because of an existing page, + // be more specific and allow same URLSegments in different subsites + $isValid = !($existingPage && $existingPageInSubsite); + } + + return $isValid; + } } -class SubsitesVirtualPage_Controller extends VirtualPage_Controller { - - 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; - } +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..d740289 100644 --- a/code/extensions/CMSPageAddControllerExtension.php +++ b/code/extensions/CMSPageAddControllerExtension.php @@ -1,8 +1,8 @@ push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID())); - } - +class CMSPageAddControllerExtension extends Extension +{ + public function updatePageOptions(&$fields) + { + $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID())); + } } diff --git a/code/extensions/ControllerSubsites.php b/code/extensions/ControllerSubsites.php index 82b3cfd..6ad723d 100644 --- a/code/extensions/ControllerSubsites.php +++ b/code/extensions/ControllerSubsites.php @@ -2,19 +2,21 @@ /** * @package subsites */ -class ControllerSubsites extends Extension { - function controllerAugmentInit(){ - if($subsite = Subsite::currentSubsite()){ - if($theme = $subsite->Theme) - SSViewer::set_theme($theme); - } - } - - function CurrentSubsite(){ - if($subsite = Subsite::currentSubsite()){ - return $subsite; - } - } +class ControllerSubsites extends Extension +{ + public function controllerAugmentInit() + { + if ($subsite = Subsite::currentSubsite()) { + if ($theme = $subsite->Theme) { + SSViewer::set_theme($theme); + } + } + } + + public function CurrentSubsite() + { + if ($subsite = Subsite::currentSubsite()) { + return $subsite; + } + } } - -?> \ No newline at end of file diff --git a/code/extensions/ErrorPageSubsite.php b/code/extensions/ErrorPageSubsite.php index 0e620ca..5129767 100644 --- a/code/extensions/ErrorPageSubsite.php +++ b/code/extensions/ErrorPageSubsite.php @@ -1,40 +1,43 @@ get($this->owner->ClassName, 'static_filepath'); - $subdomainPart = ""; - - // Try to get current subsite from session - $subsite = Subsite::currentSubsite(false); - - // since this function is called from Page class before the controller is created, we have to get subsite from domain instead - if(!$subsite) { - $subsiteID = Subsite::getSubsiteIDForDomain(); - if($subsiteID != 0) $subsite = DataObject::get_by_id("Subsite", $subsiteID); - else $subsite = null; - } - - if($subsite) { - $subdomain = $subsite->domain(); - $subdomainPart = "-{$subdomain}"; - } - - if(singleton('SiteTree')->hasExtension('Translatable') && $locale && $locale != Translatable::default_locale()) { - $filepath = $static_filepath . "/error-{$statusCode}-{$locale}{$subdomainPart}.html"; - } else { - $filepath = $static_filepath . "/error-{$statusCode}{$subdomainPart}.html"; - } +class ErrorPageSubsite extends DataExtension +{ + /** + * Alter file path to generated a static (static) error page file to handle error page template on different sub-sites + * + * @see Error::get_filepath_for_errorcode() + * + * FIXME since {@link Subsite::currentSubsite()} partly relies on Session, viewing other sub-site (including main site) between + * opening ErrorPage in the CMS and publish ErrorPage causes static error page to get generated incorrectly. + */ + public function alternateFilepathForErrorcode($statusCode, $locale = null) + { + $static_filepath = Config::inst()->get($this->owner->ClassName, 'static_filepath'); + $subdomainPart = ""; + + // Try to get current subsite from session + $subsite = Subsite::currentSubsite(false); + + // since this function is called from Page class before the controller is created, we have to get subsite from domain instead + if (!$subsite) { + $subsiteID = Subsite::getSubsiteIDForDomain(); + if ($subsiteID != 0) { + $subsite = DataObject::get_by_id("Subsite", $subsiteID); + } else { + $subsite = null; + } + } + + if ($subsite) { + $subdomain = $subsite->domain(); + $subdomainPart = "-{$subdomain}"; + } + + if (singleton('SiteTree')->hasExtension('Translatable') && $locale && $locale != Translatable::default_locale()) { + $filepath = $static_filepath . "/error-{$statusCode}-{$locale}{$subdomainPart}.html"; + } else { + $filepath = $static_filepath . "/error-{$statusCode}{$subdomainPart}.html"; + } - return $filepath; - } - -} \ No newline at end of file + return $filepath; + } +} diff --git a/code/extensions/FileSubsites.php b/code/extensions/FileSubsites.php index 2aee52c..db760dd 100644 --- a/code/extensions/FileSubsites.php +++ b/code/extensions/FileSubsites.php @@ -4,126 +4,138 @@ * * @package subsites */ -class FileSubsites extends DataExtension { - - // If this is set to true, all folders created will be default be - // considered 'global', unless set otherwise - static $default_root_folders_global = false; - - private static $has_one=array( - 'Subsite' => 'Subsite', - ); +class FileSubsites extends DataExtension +{ + // If this is set to true, all folders created will be default be + // considered 'global', unless set otherwise + public static $default_root_folders_global = false; + + private static $has_one=array( + 'Subsite' => 'Subsite', + ); - /** - * Amends the CMS tree title for folders in the Files & Images section. - * Prefixes a '* ' to the folders that are accessible from all subsites. - */ - function alternateTreeTitle() { - if($this->owner->SubsiteID == 0) return " * " . $this->owner->Title; - else return $this->owner->Title; - } + /** + * Amends the CMS tree title for folders in the Files & Images section. + * Prefixes a '* ' to the folders that are accessible from all subsites. + */ + public function alternateTreeTitle() + { + if ($this->owner->SubsiteID == 0) { + return " * " . $this->owner->Title; + } else { + return $this->owner->Title; + } + } - /** - * Add subsites-specific fields to the folder editor. - */ - function updateCMSFields(FieldList $fields) { - if($this->owner instanceof Folder) { - $sites = Subsite::accessible_sites('CMS_ACCESS_AssetAdmin'); - $values = array(); - $values[0] = _t('FileSubsites.AllSitesDropdownOpt','All sites'); - foreach ($sites as $site) { - $values[$site->ID] = $site->Title; - } - ksort($values); - if($sites){ - //Dropdown needed to move folders between subsites - $dropdown = new DropdownField( - 'SubsiteID', - _t('FileSubsites.SubsiteFieldLabel','Subsite'), - $values - ); - $dropdown->addExtraClass('subsites-move-dropdown'); - $fields->push($dropdown); - $fields->push(new LiteralField( - 'Message', - '

'. - _t('ASSETADMIN.SUBSITENOTICE', 'Folders and files created in the main site are accessible by all subsites.') - .'

' - )); - } - } - } + /** + * Add subsites-specific fields to the folder editor. + */ + public function updateCMSFields(FieldList $fields) + { + if ($this->owner instanceof Folder) { + $sites = Subsite::accessible_sites('CMS_ACCESS_AssetAdmin'); + $values = array(); + $values[0] = _t('FileSubsites.AllSitesDropdownOpt', 'All sites'); + foreach ($sites as $site) { + $values[$site->ID] = $site->Title; + } + ksort($values); + if ($sites) { + //Dropdown needed to move folders between subsites + $dropdown = new DropdownField( + 'SubsiteID', + _t('FileSubsites.SubsiteFieldLabel', 'Subsite'), + $values + ); + $dropdown->addExtraClass('subsites-move-dropdown'); + $fields->push($dropdown); + $fields->push(new LiteralField( + 'Message', + '

'. + _t('ASSETADMIN.SUBSITENOTICE', 'Folders and files created in the main site are accessible by all subsites.') + .'

' + )); + } + } + } - /** - * Update any requests to limit the results to the current site - */ - public function augmentSQL(SQLQuery &$query) { - if(Subsite::$disable_subsite_filter) return; + /** + * Update any requests to limit the results to the current site + */ + public function augmentSQL(SQLQuery &$query) + { + if (Subsite::$disable_subsite_filter) { + return; + } - // If you're querying by ID, ignore the sub-site - this is a bit ugly... (but it was WAYYYYYYYYY worse) - //@TODO I don't think excluding if SiteTree_ImageTracking is a good idea however because of the SS 3.0 api and ManyManyList::removeAll() changing the from table after this function is called there isn't much of a choice + // If you're querying by ID, ignore the sub-site - this is a bit ugly... (but it was WAYYYYYYYYY worse) + //@TODO I don't think excluding if SiteTree_ImageTracking is a good idea however because of the SS 3.0 api and ManyManyList::removeAll() changing the from table after this function is called there isn't much of a choice - $from = $query->getFrom(); - if(isset($from['SiteTree_ImageTracking']) || $query->filtersOnID()) return; + $from = $query->getFrom(); + if (isset($from['SiteTree_ImageTracking']) || $query->filtersOnID()) { + return; + } - $subsiteID = (int) Subsite::currentSubsiteID(); + $subsiteID = (int) Subsite::currentSubsiteID(); - // The foreach is an ugly way of getting the first key :-) - foreach($query->getFrom() as $tableName => $info) { - $where = "\"$tableName\".\"SubsiteID\" IN (0, $subsiteID)"; - $query->addWhere($where); - break; - } + // The foreach is an ugly way of getting the first key :-) + foreach ($query->getFrom() as $tableName => $info) { + $where = "\"$tableName\".\"SubsiteID\" IN (0, $subsiteID)"; + $query->addWhere($where); + break; + } - $sect=array_values($query->getSelect()); - $isCounting = strpos($sect[0], 'COUNT') !== false; + $sect=array_values($query->getSelect()); + $isCounting = strpos($sect[0], 'COUNT') !== false; - // Ordering when deleting or counting doesn't apply - if(!$isCounting) { - $query->addOrderBy("\"SubsiteID\""); - } - } + // Ordering when deleting or counting doesn't apply + if (!$isCounting) { + $query->addOrderBy("\"SubsiteID\""); + } + } - function onBeforeWrite() { - if (!$this->owner->ID && !$this->owner->SubsiteID) { - if (self::$default_root_folders_global) { - $this->owner->SubsiteID = 0; - } else { - $this->owner->SubsiteID = Subsite::currentSubsiteID(); - } - } - } + public function onBeforeWrite() + { + if (!$this->owner->ID && !$this->owner->SubsiteID) { + if (self::$default_root_folders_global) { + $this->owner->SubsiteID = 0; + } else { + $this->owner->SubsiteID = Subsite::currentSubsiteID(); + } + } + } - function onAfterUpload() { - // If we have a parent, use it's subsite as our subsite - if ($this->owner->Parent()) { - $this->owner->SubsiteID = $this->owner->Parent()->SubsiteID; - } else { - $this->owner->SubsiteID = Subsite::currentSubsiteID(); - } - $this->owner->write(); - } + public function onAfterUpload() + { + // If we have a parent, use it's subsite as our subsite + if ($this->owner->Parent()) { + $this->owner->SubsiteID = $this->owner->Parent()->SubsiteID; + } else { + $this->owner->SubsiteID = Subsite::currentSubsiteID(); + } + $this->owner->write(); + } - function canEdit($member = null) { - // Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group - $subsiteID = Session::get('SubsiteID'); - if($subsiteID&&$subsiteID == $this->owner->SubsiteID) { - return true; - } else { - Session::set('SubsiteID', $this->owner->SubsiteID); - $access = Permission::check(array('CMS_ACCESS_AssetAdmin', 'CMS_ACCESS_LeftAndMain')); - Session::set('SubsiteID', $subsiteID); + public function canEdit($member = null) + { + // Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group + $subsiteID = Session::get('SubsiteID'); + if ($subsiteID&&$subsiteID == $this->owner->SubsiteID) { + return true; + } else { + Session::set('SubsiteID', $this->owner->SubsiteID); + $access = Permission::check(array('CMS_ACCESS_AssetAdmin', 'CMS_ACCESS_LeftAndMain')); + Session::set('SubsiteID', $subsiteID); - return $access; - } - } - - /** - * Return a piece of text to keep DataObject cache keys appropriately specific - */ - function cacheKeyComponent() { - return 'subsite-'.Subsite::currentSubsiteID(); - } - + return $access; + } + } + + /** + * Return a piece of text to keep DataObject cache keys appropriately specific + */ + public function cacheKeyComponent() + { + return 'subsite-'.Subsite::currentSubsiteID(); + } } - diff --git a/code/extensions/GroupSubsites.php b/code/extensions/GroupSubsites.php index 11f0b9d..06558b9 100644 --- a/code/extensions/GroupSubsites.php +++ b/code/extensions/GroupSubsites.php @@ -4,185 +4,192 @@ * * @package subsites */ -class GroupSubsites extends DataExtension implements PermissionProvider { +class GroupSubsites extends DataExtension implements PermissionProvider +{ + private static $db = array( + 'AccessAllSubsites' => 'Boolean' + ); - private static $db = array( - 'AccessAllSubsites' => 'Boolean' - ); + private static $many_many = array( + 'Subsites' => 'Subsite' + ); - private static $many_many = array( - 'Subsites' => 'Subsite' - ); + private static $defaults = array( + 'AccessAllSubsites' => true + ); - private static $defaults = array( - 'AccessAllSubsites' => true - ); - - /** - * Migrations for GroupSubsites data. - */ - function requireDefaultRecords() { - // Migration for Group.SubsiteID data from when Groups only had a single subsite - $groupFields = DB::field_list('Group'); - - // Detection of SubsiteID field is the trigger for old-style-subsiteID migration - if(isset($groupFields['SubsiteID'])) { - // Migrate subsite-specific data - DB::query('INSERT INTO "Group_Subsites" ("GroupID", "SubsiteID") + /** + * Migrations for GroupSubsites data. + */ + public function requireDefaultRecords() + { + // Migration for Group.SubsiteID data from when Groups only had a single subsite + $groupFields = DB::field_list('Group'); + + // Detection of SubsiteID field is the trigger for old-style-subsiteID migration + if (isset($groupFields['SubsiteID'])) { + // Migrate subsite-specific data + DB::query('INSERT INTO "Group_Subsites" ("GroupID", "SubsiteID") SELECT "ID", "SubsiteID" FROM "Group" WHERE "SubsiteID" > 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" + + // 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 + } elseif (!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 - $fields->findOrMakeTab('Root.Subsites',_t('GroupSubsites.SECURITYTABTITLE','Subsites')); + DB::query('UPDATE "Group" SET "AccessAllSubsites" = 1'); + } + } + + public function updateCMSFields(FieldList $fields) + { + if ($this->owner->canEdit()) { + // i18n tab + $fields->findOrMakeTab('Root.Subsites', _t('GroupSubsites.SECURITYTABTITLE', 'Subsites')); - $subsites = Subsite::accessible_sites(array('ADMIN', 'SECURITY_SUBSITE_GROUP'), true); - $subsiteMap = $subsites->map(); + $subsites = Subsite::accessible_sites(array('ADMIN', 'SECURITY_SUBSITE_GROUP'), true); + $subsiteMap = $subsites->map(); - // 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", - _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), - array( - 1 => _t('GroupSubsites.ACCESSALL', "All subsites"), - 0 => _t('GroupSubsites.ACCESSONLY', "Only these subsites"), - ) - )); + // 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", + _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), + array( + 1 => _t('GroupSubsites.ACCESSALL', "All subsites"), + 0 => _t('GroupSubsites.ACCESSONLY', "Only these subsites"), + ) + )); - unset($subsiteMap[0]); - $fields->addFieldToTab("Root.Subsites", new CheckboxSetField("Subsites", "", - $subsiteMap)); + unset($subsiteMap[0]); + $fields->addFieldToTab("Root.Subsites", new CheckboxSetField("Subsites", "", + $subsiteMap)); + } else { + if (sizeof($subsiteMap) <= 1) { + $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", + _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), + $subsiteMap)); + } + } + } + } - } else { - if (sizeof($subsiteMap) <= 1) { - $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", - _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), - $subsiteMap)); - } - } - } - } + /** + * If this group belongs to a subsite, + * append the subsites title to the group title + * to make it easy to distinguish in the tree-view + * of the security admin interface. + */ + public function alternateTreeTitle() + { + if ($this->owner->AccessAllSubsites) { + $title = _t('GroupSubsites.GlobalGroup', 'global group'); + return htmlspecialchars($this->owner->Title, ENT_QUOTES) . ' (' . $title . ')'; + } else { + $subsites = Convert::raw2xml(implode(", ", $this->owner->Subsites()->column('Title'))); + return htmlspecialchars($this->owner->Title) . " ($subsites)"; + } + } - /** - * If this group belongs to a subsite, - * append the subsites title to the group title - * to make it easy to distinguish in the tree-view - * of the security admin interface. - */ - function alternateTreeTitle() { - if($this->owner->AccessAllSubsites) { - $title = _t('GroupSubsites.GlobalGroup', 'global group'); - return htmlspecialchars($this->owner->Title, ENT_QUOTES) . ' (' . $title . ')'; - } else { - $subsites = Convert::raw2xml(implode(", ", $this->owner->Subsites()->column('Title'))); - return htmlspecialchars($this->owner->Title) . " ($subsites)"; - } - } + /** + * Update any requests to limit the results to the current site + */ + public function augmentSQL(SQLQuery &$query) + { + if (Subsite::$disable_subsite_filter) { + return; + } + if (Cookie::get('noSubsiteFilter') == 'true') { + return; + } - /** - * Update any requests to limit the results to the current site - */ - public function augmentSQL(SQLQuery &$query) { - if(Subsite::$disable_subsite_filter) return; - if(Cookie::get('noSubsiteFilter') == 'true') return; + // If you're querying by ID, ignore the sub-site - this is a bit ugly... + if (!$query->filtersOnID()) { - // If you're querying by ID, ignore the sub-site - this is a bit ugly... - if(!$query->filtersOnID()) { - - /*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) { - if((is_array($item) && strpos($item['table'], 'Group_Subsites')!==false) || (!is_array($item) && strpos($item, 'Group_Subsites')!==false)) { - $hasGroupSubsites = true; - break; - } - } - - if(!$hasGroupSubsites) { - if($subsiteID) { - $query->addLeftJoin("Group_Subsites", "\"Group_Subsites\".\"GroupID\" + /*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) { + if ((is_array($item) && strpos($item['table'], 'Group_Subsites')!==false) || (!is_array($item) && strpos($item, 'Group_Subsites')!==false)) { + $hasGroupSubsites = true; + break; + } + } + + if (!$hasGroupSubsites) { + if ($subsiteID) { + $query->addLeftJoin("Group_Subsites", "\"Group_Subsites\".\"GroupID\" = \"Group\".\"ID\" AND \"Group_Subsites\".\"SubsiteID\" = $subsiteID"); - $query->addWhere("(\"Group_Subsites\".\"SubsiteID\" IS NOT NULL OR + $query->addWhere("(\"Group_Subsites\".\"SubsiteID\" IS NOT NULL OR \"Group\".\"AccessAllSubsites\" = 1)"); - } else { - $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(*)') { - $query->orderby = "\"AccessAllSubsites\" DESC" . ($query->orderby ? ', ' : '') . $query->orderby; - } - } - } + } else { + $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(*)') { + $query->orderby = "\"AccessAllSubsites\" DESC" . ($query->orderby ? ', ' : '') . $query->orderby; + } + } + } - function onBeforeWrite() { - // New record test approximated by checking whether the ID has changed. - // Note also that the after write test is only used when we're *not* on a subsite - if($this->owner->isChanged('ID') && !Subsite::currentSubsiteID()) { - $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 - if($this->owner->isChanged('ID') && $currentSubsiteID = Subsite::currentSubsiteID()) { - $subsites = $this->owner->Subsites(); - $subsites->add($currentSubsiteID); - } - } + public function onBeforeWrite() + { + // New record test approximated by checking whether the ID has changed. + // Note also that the after write test is only used when we're *not* on a subsite + if ($this->owner->isChanged('ID') && !Subsite::currentSubsiteID()) { + $this->owner->AccessAllSubsites = 1; + } + } + + public 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 + if ($this->owner->isChanged('ID') && $currentSubsiteID = Subsite::currentSubsiteID()) { + $subsites = $this->owner->Subsites(); + $subsites->add($currentSubsiteID); + } + } - function alternateCanEdit() { - // 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'); + public function alternateCanEdit() + { + // 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); - } - - function providePermissions() { - return array( - 'SECURITY_SUBSITE_GROUP' => array( - 'name' => _t('GroupSubsites.MANAGE_SUBSITES', 'Manage subsites for groups'), - 'category' => _t('Permissions.PERMISSIONS_CATEGORY', 'Roles and access permissions'), - 'help' => _t('GroupSubsites.MANAGE_SUBSITES_HELP', 'Ability to limit the permissions for a group to one or more subsites.'), - 'sort' => 200 - ) - ); - } + // 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); + } + public function providePermissions() + { + return array( + 'SECURITY_SUBSITE_GROUP' => array( + 'name' => _t('GroupSubsites.MANAGE_SUBSITES', 'Manage subsites for groups'), + 'category' => _t('Permissions.PERMISSIONS_CATEGORY', 'Roles and access permissions'), + 'help' => _t('GroupSubsites.MANAGE_SUBSITES_HELP', 'Ability to limit the permissions for a group to one or more subsites.'), + 'sort' => 200 + ) + ); + } } - -?> diff --git a/code/extensions/LeftAndMainSubsites.php b/code/extensions/LeftAndMainSubsites.php index ae07712..6d16314 100644 --- a/code/extensions/LeftAndMainSubsites.php +++ b/code/extensions/LeftAndMainSubsites.php @@ -4,303 +4,325 @@ * * @package subsites */ -class LeftAndMainSubsites extends Extension { +class LeftAndMainSubsites extends Extension +{ + private static $allowed_actions = array('CopyToSubsite'); - private static $allowed_actions = array('CopyToSubsite'); + /** + * Normally SubsiteID=0 on a DataObject means it is only accessible from the special "main site". + * However in some situations SubsiteID=0 will be understood as a "globally accessible" object in which + * case this property is set to true (i.e. in AssetAdmin). + */ + private static $treats_subsite_0_as_global = false; - /** - * Normally SubsiteID=0 on a DataObject means it is only accessible from the special "main site". - * However in some situations SubsiteID=0 will be understood as a "globally accessible" object in which - * case this property is set to true (i.e. in AssetAdmin). - */ - private static $treats_subsite_0_as_global = false; + public function init() + { + Requirements::css('subsites/css/LeftAndMain_Subsites.css'); + Requirements::javascript('subsites/javascript/LeftAndMain_Subsites.js'); + Requirements::javascript('subsites/javascript/VirtualPage_Subsites.js'); + } - function init() { - Requirements::css('subsites/css/LeftAndMain_Subsites.css'); - Requirements::javascript('subsites/javascript/LeftAndMain_Subsites.js'); - Requirements::javascript('subsites/javascript/VirtualPage_Subsites.js'); - } + /** + * Set the title of the CMS tree + */ + public function getCMSTreeTitle() + { + $subsite = Subsite::currentSubSite(); + return $subsite ? Convert::raw2xml($subsite->Title) : _t('LeftAndMain.SITECONTENTLEFT'); + } + + public function updatePageOptions(&$fields) + { + $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID())); + } - /** - * Set the title of the CMS tree - */ - function getCMSTreeTitle() { - $subsite = Subsite::currentSubSite(); - return $subsite ? Convert::raw2xml($subsite->Title) : _t('LeftAndMain.SITECONTENTLEFT'); - } - - function updatePageOptions(&$fields) { - $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID())); - } + /** + * Find all subsites accessible for current user on this controller. + * + * @return ArrayList of {@link Subsite} instances. + */ + public function sectionSites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) + { + if ($mainSiteTitle == 'Main site') { + $mainSiteTitle = _t('Subsites.MainSiteTitle', 'Main site'); + } - /** - * Find all subsites accessible for current user on this controller. - * - * @return ArrayList of {@link Subsite} instances. - */ - function sectionSites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) { - if($mainSiteTitle == 'Main site') { - $mainSiteTitle = _t('Subsites.MainSiteTitle', 'Main site'); - } + // Rationalise member arguments + if (!$member) { + $member = Member::currentUser(); + } + if (!$member) { + return new ArrayList(); + } + if (!is_object($member)) { + $member = DataObject::get_by_id('Member', $member); + } - // Rationalise member arguments - if(!$member) $member = Member::currentUser(); - if(!$member) return new ArrayList(); - if(!is_object($member)) $member = DataObject::get_by_id('Member', $member); + // Collect permissions - honour the LeftAndMain::required_permission_codes, current model requires + // us to check if the user satisfies ALL permissions. Code partly copied from LeftAndMain::canView. + $codes = array(); + $extraCodes = Config::inst()->get($this->owner->class, 'required_permission_codes'); + if ($extraCodes !== false) { + if ($extraCodes) { + $codes = array_merge($codes, (array)$extraCodes); + } else { + $codes[] = "CMS_ACCESS_{$this->owner->class}"; + } + } else { + // Check overriden - all subsites accessible. + return Subsite::all_sites(); + } - // Collect permissions - honour the LeftAndMain::required_permission_codes, current model requires - // us to check if the user satisfies ALL permissions. Code partly copied from LeftAndMain::canView. - $codes = array(); - $extraCodes = Config::inst()->get($this->owner->class, 'required_permission_codes'); - if($extraCodes !== false) { - if($extraCodes) $codes = array_merge($codes, (array)$extraCodes); - else $codes[] = "CMS_ACCESS_{$this->owner->class}"; - } else { - // Check overriden - all subsites accessible. - return Subsite::all_sites(); - } + // Find subsites satisfying all permissions for the Member. + $codesPerSite = array(); + $sitesArray = array(); + foreach ($codes as $code) { + $sites = Subsite::accessible_sites($code, $includeMainSite, $mainSiteTitle, $member); + foreach ($sites as $site) { + // Build the structure for checking how many codes match. + $codesPerSite[$site->ID][$code] = true; - // Find subsites satisfying all permissions for the Member. - $codesPerSite = array(); - $sitesArray = array(); - foreach ($codes as $code) { - $sites = Subsite::accessible_sites($code, $includeMainSite, $mainSiteTitle, $member); - foreach ($sites as $site) { - // Build the structure for checking how many codes match. - $codesPerSite[$site->ID][$code] = true; + // Retain Subsite objects for later. + $sitesArray[$site->ID] = $site; + } + } - // Retain Subsite objects for later. - $sitesArray[$site->ID] = $site; - } - } + // Find sites that satisfy all codes conjuncitvely. + $accessibleSites = new ArrayList(); + foreach ($codesPerSite as $siteID => $siteCodes) { + if (count($siteCodes)==count($codes)) { + $accessibleSites->push($sitesArray[$siteID]); + } + } - // Find sites that satisfy all codes conjuncitvely. - $accessibleSites = new ArrayList(); - foreach ($codesPerSite as $siteID => $siteCodes) { - if (count($siteCodes)==count($codes)) { - $accessibleSites->push($sitesArray[$siteID]); - } - } + return $accessibleSites; + } - return $accessibleSites; - } + /* + * Returns a list of the subsites accessible to the current user. + * It's enough for any section to be accessible for the section to be included. + */ + public function Subsites() + { + return Subsite::all_accessible_sites(); + } - /* - * Returns a list of the subsites accessible to the current user. - * It's enough for any section to be accessible for the section to be included. - */ - public function Subsites() { - return Subsite::all_accessible_sites(); - } + /* + * Generates a list of subsites with the data needed to + * produce a dropdown site switcher + * @return ArrayList + */ - /* - * Generates a list of subsites with the data needed to - * produce a dropdown site switcher - * @return ArrayList - */ + public function ListSubsites() + { + $list = $this->Subsites(); + $currentSubsiteID = Subsite::currentSubsiteID(); - public function ListSubsites(){ - $list = $this->Subsites(); - $currentSubsiteID = Subsite::currentSubsiteID(); + if ($list == null || $list->Count() == 1 && $list->First()->DefaultSite == true) { + return false; + } - if($list == null || $list->Count() == 1 && $list->First()->DefaultSite == true){ - return false; - } + Requirements::javascript('subsites/javascript/LeftAndMain_Subsites.js'); - Requirements::javascript('subsites/javascript/LeftAndMain_Subsites.js'); + $output = new ArrayList(); - $output = new ArrayList(); + foreach ($list as $subsite) { + $CurrentState = $subsite->ID == $currentSubsiteID ? 'selected' : ''; + + $output->push(new ArrayData(array( + 'CurrentState' => $CurrentState, + 'ID' => $subsite->ID, + 'Title' => Convert::raw2xml($subsite->Title) + ))); + } - foreach($list as $subsite) { - $CurrentState = $subsite->ID == $currentSubsiteID ? 'selected' : ''; - - $output->push(new ArrayData(array( - 'CurrentState' => $CurrentState, - 'ID' => $subsite->ID, - 'Title' => Convert::raw2xml($subsite->Title) - ))); - } + return $output; + } - return $output; - } + public function alternateMenuDisplayCheck($controllerName) + { + if (!class_exists($controllerName)) { + return false; + } - public function alternateMenuDisplayCheck($controllerName) { - if(!class_exists($controllerName)){ - return false; - } + // Check subsite support. + if (Subsite::currentSubsiteID() == 0) { + // Main site always supports everything. + return true; + } else { + $controller = singleton($controllerName); + if ($controller->hasMethod('subsiteCMSShowInMenu') && $controller->subsiteCMSShowInMenu()) { + return true; + } + } - // Check subsite support. - if(Subsite::currentSubsiteID() == 0){ - // Main site always supports everything. - return true; - } else { - $controller = singleton($controllerName); - if($controller->hasMethod('subsiteCMSShowInMenu') && $controller->subsiteCMSShowInMenu()){ - return true; - } - } + // It's not necessary to check access permissions here. Framework calls canView on the controller, + // which in turn uses the Permission API which is augmented by our GroupSubsites. - // It's not necessary to check access permissions here. Framework calls canView on the controller, - // which in turn uses the Permission API which is augmented by our GroupSubsites. + return false; + } - return false; - } + public function CanAddSubsites() + { + return Permission::check("ADMIN", "any", null, "all"); + } - public function CanAddSubsites() { - return Permission::check("ADMIN", "any", null, "all"); - } + /** + * Helper for testing if the subsite should be adjusted. + */ + public function shouldChangeSubsite($adminClass, $recordSubsiteID, $currentSubsiteID) + { + if (Config::inst()->get($adminClass, 'treats_subsite_0_as_global') && $recordSubsiteID==0) { + return false; + } + if ($recordSubsiteID!=$currentSubsiteID) { + return true; + } + return false; + } - /** - * Helper for testing if the subsite should be adjusted. - */ - public function shouldChangeSubsite($adminClass, $recordSubsiteID, $currentSubsiteID) { - if (Config::inst()->get($adminClass, 'treats_subsite_0_as_global') && $recordSubsiteID==0) return false; - if ($recordSubsiteID!=$currentSubsiteID) return true; - return false; - } + /** + * Check if the current controller is accessible for this user on this subsite. + */ + public function canAccess() + { + // Admin can access everything, no point in checking. + $member = Member::currentUser(); + if ($member && + ( + Permission::checkMember($member, 'ADMIN') || // 'Full administrative rights' in SecurityAdmin + Permission::checkMember($member, 'CMS_ACCESS_LeftAndMain') // 'Access to all CMS sections' in SecurityAdmin + )) { + return true; + } - /** - * Check if the current controller is accessible for this user on this subsite. - */ - function canAccess() { - // Admin can access everything, no point in checking. - $member = Member::currentUser(); - if($member && - ( - Permission::checkMember($member, 'ADMIN') || // 'Full administrative rights' in SecurityAdmin - Permission::checkMember($member, 'CMS_ACCESS_LeftAndMain') // 'Access to all CMS sections' in SecurityAdmin - )) { - return true; - } + // Check if we have access to current section on the current subsite. + $accessibleSites = $this->owner->sectionSites(true, "Main site", $member); + if ($accessibleSites->count() && $accessibleSites->find('ID', Subsite::currentSubsiteID())) { + // Current section can be accessed on the current site, all good. + return true; + } - // Check if we have access to current section on the current subsite. - $accessibleSites = $this->owner->sectionSites(true, "Main site", $member); - if ($accessibleSites->count() && $accessibleSites->find('ID', Subsite::currentSubsiteID())) { - // Current section can be accessed on the current site, all good. - return true; - } + return false; + } - return false; - } + /** + * Prevent accessing disallowed resources. This happens after onBeforeInit has executed, + * so all redirections should've already taken place. + */ + public function alternateAccessCheck() + { + return $this->owner->canAccess(); + } - /** - * Prevent accessing disallowed resources. This happens after onBeforeInit has executed, - * so all redirections should've already taken place. - */ - public function alternateAccessCheck() { - return $this->owner->canAccess(); - } + /** + * Redirect the user to something accessible if the current section/subsite is forbidden. + * + * This is done via onBeforeInit as it needs to be done before the LeftAndMain::init has a + * chance to forbids access via alternateAccessCheck. + * + * If we need to change the subsite we force the redirection to /admin/ so the frontend is + * fully re-synchronised with the internal session. This is better than risking some panels + * showing data from another subsite. + */ + public function onBeforeInit() + { + // We are accessing the CMS, so we need to let Subsites know we will be using the session. + Subsite::$use_session_subsiteid = true; - /** - * Redirect the user to something accessible if the current section/subsite is forbidden. - * - * This is done via onBeforeInit as it needs to be done before the LeftAndMain::init has a - * chance to forbids access via alternateAccessCheck. - * - * If we need to change the subsite we force the redirection to /admin/ so the frontend is - * fully re-synchronised with the internal session. This is better than risking some panels - * showing data from another subsite. - */ - public function onBeforeInit() { - // We are accessing the CMS, so we need to let Subsites know we will be using the session. - Subsite::$use_session_subsiteid = true; + // FIRST, check if we need to change subsites due to the URL. - // FIRST, check if we need to change subsites due to the URL. + // Catch forced subsite changes that need to cause CMS reloads. + if (isset($_GET['SubsiteID'])) { + // Clear current page when subsite changes (or is set for the first time) + if (!Session::get('SubsiteID') || $_GET['SubsiteID'] != Session::get('SubsiteID')) { + Session::clear("{$this->owner->class}.currentPage"); + } - // Catch forced subsite changes that need to cause CMS reloads. - if(isset($_GET['SubsiteID'])) { - // Clear current page when subsite changes (or is set for the first time) - if(!Session::get('SubsiteID') || $_GET['SubsiteID'] != Session::get('SubsiteID')) { - Session::clear("{$this->owner->class}.currentPage"); - } + // Update current subsite in session + Subsite::changeSubsite($_GET['SubsiteID']); - // Update current subsite in session - Subsite::changeSubsite($_GET['SubsiteID']); + //Redirect to clear the current page + if ($this->owner->canView(Member::currentUser())) { + //Redirect to clear the current page + return $this->owner->redirect($this->owner->Link()); + } + //Redirect to the default CMS section + return $this->owner->redirect('admin/'); + } - //Redirect to clear the current page - if ($this->owner->canView(Member::currentUser())) { - //Redirect to clear the current page - return $this->owner->redirect($this->owner->Link()); - } - //Redirect to the default CMS section - return $this->owner->redirect('admin/'); - } + // Automatically redirect the session to appropriate subsite when requesting a record. + // This is needed to properly initialise the session in situations where someone opens the CMS via a link. + $record = $this->owner->currentPage(); + if ($record && isset($record->SubsiteID) && is_numeric($record->SubsiteID) && isset($this->owner->urlParams['ID'])) { + if ($this->shouldChangeSubsite($this->owner->class, $record->SubsiteID, Subsite::currentSubsiteID())) { + // Update current subsite in session + Subsite::changeSubsite($record->SubsiteID); - // Automatically redirect the session to appropriate subsite when requesting a record. - // This is needed to properly initialise the session in situations where someone opens the CMS via a link. - $record = $this->owner->currentPage(); - if($record && isset($record->SubsiteID) && is_numeric($record->SubsiteID) && isset($this->owner->urlParams['ID'])) { + if ($this->owner->canView(Member::currentUser())) { + //Redirect to clear the current page + return $this->owner->redirect($this->owner->Link()); + } + //Redirect to the default CMS section + return $this->owner->redirect('admin/'); + } + } - if ($this->shouldChangeSubsite($this->owner->class, $record->SubsiteID, Subsite::currentSubsiteID())) { - // Update current subsite in session - Subsite::changeSubsite($record->SubsiteID); + // SECOND, check if we need to change subsites due to lack of permissions. - if ($this->owner->canView(Member::currentUser())) { - //Redirect to clear the current page - return $this->owner->redirect($this->owner->Link()); - } - //Redirect to the default CMS section - return $this->owner->redirect('admin/'); - } + if (!$this->owner->canAccess()) { + $member = Member::currentUser(); - } + // Current section is not accessible, try at least to stick to the same subsite. + $menu = CMSMenu::get_menu_items(); + foreach ($menu as $candidate) { + if ($candidate->controller && $candidate->controller!=$this->owner->class) { + $accessibleSites = singleton($candidate->controller)->sectionSites(true, 'Main site', $member); + if ($accessibleSites->count() && $accessibleSites->find('ID', Subsite::currentSubsiteID())) { + // Section is accessible, redirect there. + return $this->owner->redirect(singleton($candidate->controller)->Link()); + } + } + } - // SECOND, check if we need to change subsites due to lack of permissions. + // If no section is available, look for other accessible subsites. + foreach ($menu as $candidate) { + if ($candidate->controller) { + $accessibleSites = singleton($candidate->controller)->sectionSites(true, 'Main site', $member); + if ($accessibleSites->count()) { + Subsite::changeSubsite($accessibleSites->First()->ID); + return $this->owner->redirect(singleton($candidate->controller)->Link()); + } + } + } - if (!$this->owner->canAccess()) { + // We have not found any accessible section or subsite. User should be denied access. + return Security::permissionFailure($this->owner); + } - $member = Member::currentUser(); + // Current site is accessible. Allow through. + return; + } - // Current section is not accessible, try at least to stick to the same subsite. - $menu = CMSMenu::get_menu_items(); - foreach($menu as $candidate) { - if($candidate->controller && $candidate->controller!=$this->owner->class) { + public function augmentNewSiteTreeItem(&$item) + { + $item->SubsiteID = isset($_POST['SubsiteID']) ? $_POST['SubsiteID'] : Subsite::currentSubsiteID(); + } - $accessibleSites = singleton($candidate->controller)->sectionSites(true, 'Main site', $member); - if ($accessibleSites->count() && $accessibleSites->find('ID', Subsite::currentSubsiteID())) { - // Section is accessible, redirect there. - return $this->owner->redirect(singleton($candidate->controller)->Link()); - } - } - } - - // If no section is available, look for other accessible subsites. - foreach($menu as $candidate) { - if($candidate->controller) { - $accessibleSites = singleton($candidate->controller)->sectionSites(true, 'Main site', $member); - if ($accessibleSites->count()) { - Subsite::changeSubsite($accessibleSites->First()->ID); - return $this->owner->redirect(singleton($candidate->controller)->Link()); - } - } - } - - // We have not found any accessible section or subsite. User should be denied access. - return Security::permissionFailure($this->owner); - - } - - // Current site is accessible. Allow through. - return; - } - - function augmentNewSiteTreeItem(&$item) { - $item->SubsiteID = isset($_POST['SubsiteID']) ? $_POST['SubsiteID'] : Subsite::currentSubsiteID(); - } - - function onAfterSave($record) { - if($record->hasMethod('NormalRelated') && ($record->NormalRelated() || $record->ReverseRelated())) { - $this->owner->response->addHeader('X-Status', rawurlencode(_t('LeftAndMainSubsites.Saved', 'Saved, please update related pages.'))); - } - } - - function copytosubsite($data, $form) { - $page = DataObject::get_by_id('SiteTree', $data['ID']); - $subsite = DataObject::get_by_id('Subsite', $data['CopyToSubsiteID']); - $newPage = $page->duplicateToSubsite($subsite->ID, true); - $response = $this->owner->getResponse(); - $response->addHeader('X-Reload', true); - return $this->owner->redirect(Controller::join_links($this->owner->Link('show'), $newPage->ID)); - } + public function onAfterSave($record) + { + if ($record->hasMethod('NormalRelated') && ($record->NormalRelated() || $record->ReverseRelated())) { + $this->owner->response->addHeader('X-Status', rawurlencode(_t('LeftAndMainSubsites.Saved', 'Saved, please update related pages.'))); + } + } + public function copytosubsite($data, $form) + { + $page = DataObject::get_by_id('SiteTree', $data['ID']); + $subsite = DataObject::get_by_id('Subsite', $data['CopyToSubsiteID']); + $newPage = $page->duplicateToSubsite($subsite->ID, true); + $response = $this->owner->getResponse(); + $response->addHeader('X-Reload', true); + return $this->owner->redirect(Controller::join_links($this->owner->Link('show'), $newPage->ID)); + } } diff --git a/code/extensions/SiteConfigSubsites.php b/code/extensions/SiteConfigSubsites.php index c0f66c2..ad5789b 100644 --- a/code/extensions/SiteConfigSubsites.php +++ b/code/extensions/SiteConfigSubsites.php @@ -3,47 +3,61 @@ /** * Extension for the SiteConfig object to add subsites support */ -class SiteConfigSubsites extends DataExtension { +class SiteConfigSubsites extends DataExtension +{ + private static $has_one = array( + 'Subsite' => 'Subsite', // The subsite that this page belongs to + ); + + /** + * Update any requests to limit the results to the current site + */ + public function augmentSQL(SQLQuery &$query) + { + if (Subsite::$disable_subsite_filter) { + return; + } - private static $has_one = array( - 'Subsite' => 'Subsite', // The subsite that this page belongs to - ); - - /** - * Update any requests to limit the results to the current site - */ - public function augmentSQL(SQLQuery &$query) { - if(Subsite::$disable_subsite_filter) return; + // If you're querying by ID, ignore the sub-site - this is a bit ugly... + if ($query->filtersOnID()) { + return; + } + $regexp = '/^(.*\.)?("|`)?SubsiteID("|`)?\s?=/'; + foreach ($query->getWhereParameterised($parameters) as $predicate) { + if (preg_match($regexp, $predicate)) { + return; + } + } - // If you're querying by ID, ignore the sub-site - this is a bit ugly... - if($query->filtersOnID()) return; - $regexp = '/^(.*\.)?("|`)?SubsiteID("|`)?\s?=/'; - foreach($query->getWhereParameterised($parameters) as $predicate) { - if(preg_match($regexp, $predicate)) return; - } + /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; + else */$subsiteID = (int)Subsite::currentSubsiteID(); - /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; - else */$subsiteID = (int)Subsite::currentSubsiteID(); + $froms=$query->getFrom(); + $froms=array_keys($froms); + $tableName = array_shift($froms); + if ($tableName != 'SiteConfig') { + return; + } + $query->addWhere("\"$tableName\".\"SubsiteID\" IN ($subsiteID)"); + } - $froms=$query->getFrom(); - $froms=array_keys($froms); - $tableName = array_shift($froms); - if($tableName != 'SiteConfig') return; - $query->addWhere("\"$tableName\".\"SubsiteID\" IN ($subsiteID)"); - } + public function onBeforeWrite() + { + if ((!is_numeric($this->owner->ID) || !$this->owner->ID) && !$this->owner->SubsiteID) { + $this->owner->SubsiteID = Subsite::currentSubsiteID(); + } + } - function onBeforeWrite() { - if((!is_numeric($this->owner->ID) || !$this->owner->ID) && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID(); - } + /** + * Return a piece of text to keep DataObject cache keys appropriately specific + */ + public function cacheKeyComponent() + { + return 'subsite-'.Subsite::currentSubsiteID(); + } - /** - * Return a piece of text to keep DataObject cache keys appropriately specific - */ - function cacheKeyComponent() { - return 'subsite-'.Subsite::currentSubsiteID(); - } - - function updateCMSFields(FieldList $fields) { - $fields->push(new HiddenField('SubsiteID','SubsiteID', Subsite::currentSubsiteID())); - } + public function updateCMSFields(FieldList $fields) + { + $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID())); + } } diff --git a/code/extensions/SiteTreeSubsites.php b/code/extensions/SiteTreeSubsites.php index 2a82701..540f665 100644 --- a/code/extensions/SiteTreeSubsites.php +++ b/code/extensions/SiteTreeSubsites.php @@ -3,297 +3,346 @@ /** * Extension for the SiteTree object to add subsites support */ -class SiteTreeSubsites extends DataExtension { +class SiteTreeSubsites extends DataExtension +{ + private static $has_one = array( + 'Subsite' => 'Subsite', // The subsite that this page belongs to + ); - private static $has_one = array( - 'Subsite' => 'Subsite', // The subsite that this page belongs to - ); + private static $many_many = array( + 'CrossSubsiteLinkTracking' => 'SiteTree' // Stored separately, as the logic for URL rewriting is different + ); - private static $many_many = array( - 'CrossSubsiteLinkTracking' => 'SiteTree' // Stored separately, as the logic for URL rewriting is different - ); + private static $many_many_extraFields = array( + "CrossSubsiteLinkTracking" => array("FieldName" => "Varchar") + ); - private static $many_many_extraFields = array( - "CrossSubsiteLinkTracking" => array("FieldName" => "Varchar") - ); + public function isMainSite() + { + if ($this->owner->SubsiteID == 0) { + return true; + } + return false; + } + + /** + * Update any requests to limit the results to the current site + */ + public function augmentSQL(SQLQuery &$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; + } - function isMainSite() { - if($this->owner->SubsiteID == 0) return true; - return false; - } - - /** - * Update any requests to limit the results to the current site - */ - public function augmentSQL(SQLQuery &$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; + if (Subsite::$force_subsite) { + $subsiteID = Subsite::$force_subsite; + } else { + /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; + else */$subsiteID = (int)Subsite::currentSubsiteID(); + } - if (Subsite::$force_subsite) $subsiteID = Subsite::$force_subsite; - else { - /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; - else */$subsiteID = (int)Subsite::currentSubsiteID(); - } + // The foreach is an ugly way of getting the first key :-) + foreach ($query->getFrom() as $tableName => $info) { + // The tableName should be SiteTree or SiteTree_Live... + if (strpos($tableName, 'SiteTree') === false) { + break; + } + $query->addWhere("\"$tableName\".\"SubsiteID\" IN ($subsiteID)"); + break; + } + } + + public function onBeforeWrite() + { + if (!$this->owner->ID && !$this->owner->SubsiteID) { + $this->owner->SubsiteID = Subsite::currentSubsiteID(); + } + + parent::onBeforeWrite(); + } - // The foreach is an ugly way of getting the first key :-) - foreach($query->getFrom() as $tableName => $info) { - // The tableName should be SiteTree or SiteTree_Live... - if(strpos($tableName,'SiteTree') === false) break; - $query->addWhere("\"$tableName\".\"SubsiteID\" IN ($subsiteID)"); - break; - } - } - - function onBeforeWrite() { - if(!$this->owner->ID && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID(); - - parent::onBeforeWrite(); - } + public function updateCMSFields(FieldList $fields) + { + $subsites = Subsite::accessible_sites("CMS_ACCESS_CMSMain"); + $subsitesMap = array(); + if ($subsites && $subsites->Count()) { + $subsitesMap = $subsites->map('ID', 'Title'); + unset($subsitesMap[$this->owner->SubsiteID]); + } - function updateCMSFields(FieldList $fields) { - $subsites = Subsite::accessible_sites("CMS_ACCESS_CMSMain"); - $subsitesMap = array(); - if($subsites && $subsites->Count()) { - $subsitesMap = $subsites->map('ID', 'Title'); - unset($subsitesMap[$this->owner->SubsiteID]); - } + // Master page edit field (only allowed from default subsite to avoid inconsistent relationships) + $isDefaultSubsite = $this->owner->SubsiteID == 0 || $this->owner->Subsite()->DefaultSite; + if ($isDefaultSubsite && $subsitesMap) { + $fields->addFieldToTab( + 'Root.Main', + new DropdownField( + "CopyToSubsiteID", + _t('SiteTreeSubsites.CopyToSubsite', "Copy page to subsite"), + $subsitesMap, + '' + ) + ); + $fields->addFieldToTab( + 'Root.Main', + $copyAction = new InlineFormAction( + "copytosubsite", + _t('SiteTreeSubsites.CopyAction', "Copy") + ) + ); + $copyAction->includeDefaultJS(false); + } - // Master page edit field (only allowed from default subsite to avoid inconsistent relationships) - $isDefaultSubsite = $this->owner->SubsiteID == 0 || $this->owner->Subsite()->DefaultSite; - if($isDefaultSubsite && $subsitesMap) { - $fields->addFieldToTab( - 'Root.Main', - new DropdownField( - "CopyToSubsiteID", - _t('SiteTreeSubsites.CopyToSubsite', "Copy page to subsite"), - $subsitesMap, - '' - ) - ); - $fields->addFieldToTab( - 'Root.Main', - $copyAction = new InlineFormAction( - "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'); + 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); + } + } + + public function alternateSiteConfig() + { + if (!$this->owner->SubsiteID) { + return false; + } + $sc = DataObject::get_one('SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); + if (!$sc) { + $sc = new SiteConfig(); + $sc->SubsiteID = $this->owner->SubsiteID; + $sc->Title = _t('Subsite.SiteConfigTitle', 'Your Site Name'); + $sc->Tagline = _t('Subsite.SiteConfigSubtitle', 'Your tagline here'); + $sc->write(); + } + 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 + */ + public 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'); - // replace readonly link prefix - $subsite = $this->owner->Subsite(); - $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('SiteConfig', '"SubsiteID" = ' . $this->owner->SubsiteID); - if(!$sc) { - $sc = new SiteConfig(); - $sc->SubsiteID = $this->owner->SubsiteID; - $sc->Title = _t('Subsite.SiteConfigTitle','Your Site Name'); - $sc->Tagline = _t('Subsite.SiteConfigSubtitle','Your tagline here'); - $sc->write(); - } - 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 (!is_null($this->owner->SubsiteID)) { + $subsiteID = $this->owner->SubsiteID; + } else { + // The relationships might not be available during the record creation when using a GridField. + // In this case the related objects will have empty fields, and SubsiteID will not be available. + // + // We do the second best: fetch the likely SubsiteID from the session. The drawback is this might + // make it possible to force relations to point to other (forbidden) subsites. + $subsiteID = Subsite::currentSubsiteID(); + } - 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'); + // Return true if they have access to this object's site + if (!(in_array(0, $goodSites) || in_array($subsiteID, $goodSites))) { + return false; + } + } + + /** + * @return boolean + */ + public function canDelete($member = null) + { + if (!$member && $member !== false) { + $member = Member::currentUser(); + } + + return $this->canEdit($member); + } + + /** + * @return boolean + */ + public function canAddChildren($member = null) + { + if (!$member && $member !== false) { + $member = Member::currentUser(); + } + + return $this->canEdit($member); + } + + /** + * @return boolean + */ + public function canPublish($member = null) + { + if (!$member && $member !== false) { + $member = Member::currentUser(); + } - if (!is_null($this->owner->SubsiteID)) { - $subsiteID = $this->owner->SubsiteID; - } else { - // The relationships might not be available during the record creation when using a GridField. - // In this case the related objects will have empty fields, and SubsiteID will not be available. - // - // We do the second best: fetch the likely SubsiteID from the session. The drawback is this might - // make it possible to force relations to point to other (forbidden) subsites. - $subsiteID = Subsite::currentSubsiteID(); - } + return $this->canEdit($member); + } - // 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 - */ - function canPublish($member = null) { - if(!$member && $member !== FALSE) $member = Member::currentUser(); + /** + * Create a duplicate of this page and save it to another subsite + * @param $subsiteID int|Subsite The Subsite to copy to, or its ID + */ + public function duplicateToSubsite($subsiteID = null) + { + if (is_object($subsiteID)) { + $subsite = $subsiteID; + $subsiteID = $subsite->ID; + } else { + $subsite = DataObject::get_by_id('Subsite', $subsiteID); + } + + $oldSubsite=Subsite::currentSubsiteID(); + if ($subsiteID) { + Subsite::changeSubsite($subsiteID); + } else { + $subsiteID=$oldSubsite; + } - return $this->canEdit($member); - } + $page = $this->owner->duplicate(false); - /** - * Create a duplicate of this page and save it to another subsite - * @param $subsiteID int|Subsite The Subsite to copy to, or its ID - */ - public function duplicateToSubsite($subsiteID = null) { - if(is_object($subsiteID)) { - $subsite = $subsiteID; - $subsiteID = $subsite->ID; - } else $subsite = DataObject::get_by_id('Subsite', $subsiteID); - - $oldSubsite=Subsite::currentSubsiteID(); - if($subsiteID) { - Subsite::changeSubsite($subsiteID); - }else { - $subsiteID=$oldSubsite; - } + $page->CheckedPublicationDifferences = $page->AddedToStage = true; + $subsiteID = ($subsiteID ? $subsiteID : $oldSubsite); + $page->SubsiteID = $subsiteID; - $page = $this->owner->duplicate(false); + // MasterPageID is here for legacy purposes, to satisfy the subsites_relatedpages module + $page->MasterPageID = $this->owner->ID; + $page->write(); - $page->CheckedPublicationDifferences = $page->AddedToStage = true; - $subsiteID = ($subsiteID ? $subsiteID : $oldSubsite); - $page->SubsiteID = $subsiteID; + Subsite::changeSubsite($oldSubsite); - // MasterPageID is here for legacy purposes, to satisfy the subsites_relatedpages module - $page->MasterPageID = $this->owner->ID; - $page->write(); + return $page; + } - Subsite::changeSubsite($oldSubsite); + /** + * Called by ContentController::init(); + */ + public static function contentcontrollerInit($controller) + { + $subsite = Subsite::currentSubsite(); - return $page; - } + if ($subsite && $subsite->Theme) { + Config::inst()->update('SSViewer', 'theme', Subsite::currentSubsite()->Theme); + } + } - /** - * Called by ContentController::init(); - */ - static function contentcontrollerInit($controller) { - $subsite = Subsite::currentSubsite(); + public function alternateAbsoluteLink() + { + // Generate the existing absolute URL and replace the domain with the subsite domain. + // This helps deal with Link() returning an absolute URL. + $url = Director::absoluteURL($this->owner->Link()); + if ($this->owner->SubsiteID) { + $url = preg_replace('/\/\/[^\/]+\//', '//' . $this->owner->Subsite()->domain() . '/', $url); + } + return $url; + } - if($subsite && $subsite->Theme){ - Config::inst()->update('SSViewer', 'theme', Subsite::currentSubsite()->Theme); - } - } + /** + * Use the CMS domain for iframed CMS previews to prevent single-origin violations + * and SSL cert problems. + */ + public function alternatePreviewLink($action = null) + { + $url = Director::absoluteURL($this->owner->Link()); + if ($this->owner->SubsiteID) { + $url = HTTP::setGetVar('SubsiteID', $this->owner->SubsiteID, $url); + } + return $url; + } - function alternateAbsoluteLink() { - // Generate the existing absolute URL and replace the domain with the subsite domain. - // This helps deal with Link() returning an absolute URL. - $url = Director::absoluteURL($this->owner->Link()); - if($this->owner->SubsiteID) { - $url = preg_replace('/\/\/[^\/]+\//', '//' . $this->owner->Subsite()->domain() . '/', $url); - } - return $url; - } + /** + * Inject the subsite ID into the content so it can be used by frontend scripts. + */ + public function MetaTags(&$tags) + { + if ($this->owner->SubsiteID) { + $tags .= "owner->SubsiteID . "\" />\n"; + } - /** - * Use the CMS domain for iframed CMS previews to prevent single-origin violations - * and SSL cert problems. - */ - function alternatePreviewLink($action = null) { - $url = Director::absoluteURL($this->owner->Link()); - if($this->owner->SubsiteID) { - $url = HTTP::setGetVar('SubsiteID', $this->owner->SubsiteID, $url); - } - return $url; - } + return $tags; + } - /** - * Inject the subsite ID into the content so it can be used by frontend scripts. - */ - function MetaTags(&$tags) { - if($this->owner->SubsiteID) { - $tags .= "owner->SubsiteID . "\" />\n"; - } + public function augmentSyncLinkTracking() + { + // 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 - return $tags; - } - - function augmentSyncLinkTracking() { - // 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); - Subsite::disable_subsite_filter($origDisableSubsiteFilter); - - if($candidatePage) { - $linkedPages[] = $candidatePage->ID; - } else { - $this->owner->HasBrokenLink = true; - } - } - } - } - - $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 - */ - function canCreate($member = null) { - // Typically called on a singleton, so we're not using the Subsite() relation - $subsite = Subsite::currentSubsite(); - if($subsite && $subsite->exists() && $subsite->PageTypeBlacklist) { - $blacklisted = explode(',', $subsite->PageTypeBlacklist); - // All subclasses need to be listed explicitly - if(in_array($this->owner->class, $blacklisted)) return false; - } - } + $origDisableSubsiteFilter = Subsite::$disable_subsite_filter; + Subsite::disable_subsite_filter(true); + $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 { + $this->owner->HasBrokenLink = true; + } + } + } + } + } + + $this->owner->CrossSubsiteLinkTracking()->setByIDList($linkedPages); + } + + /** + * Return a piece of text to keep DataObject cache keys appropriately specific + */ + public function cacheKeyComponent() + { + return 'subsite-'.Subsite::currentSubsiteID(); + } + + /** + * @param Member + * @return boolean|null + */ + public function canCreate($member = null) + { + // Typically called on a singleton, so we're not using the Subsite() relation + $subsite = Subsite::currentSubsite(); + if ($subsite && $subsite->exists() && $subsite->PageTypeBlacklist) { + $blacklisted = explode(',', $subsite->PageTypeBlacklist); + // All subclasses need to be listed explicitly + if (in_array($this->owner->class, $blacklisted)) { + return false; + } + } + } } diff --git a/code/extensions/SubsiteMenuExtension.php b/code/extensions/SubsiteMenuExtension.php index aab9af2..a4811d7 100644 --- a/code/extensions/SubsiteMenuExtension.php +++ b/code/extensions/SubsiteMenuExtension.php @@ -10,10 +10,10 @@ * Or you can include the subsiteCMSShowInMenu function in your admin class and have it return true */ -class SubsiteMenuExtension extends Extension{ - - public function subsiteCMSShowInMenu(){ - return true; - } - +class SubsiteMenuExtension extends Extension +{ + public function subsiteCMSShowInMenu() + { + return true; + } } diff --git a/code/forms/GridFieldSubsiteDetailForm.php b/code/forms/GridFieldSubsiteDetailForm.php index fee6244..ae50971 100644 --- a/code/forms/GridFieldSubsiteDetailForm.php +++ b/code/forms/GridFieldSubsiteDetailForm.php @@ -1,52 +1,55 @@ record->ID == 0) { + $templates = Subsite::get()->sort('Title'); + $templateArray = array(); + if ($templates) { + $templateArray = $templates->map('ID', 'Title'); + } - /** - * Builds an item edit form. The arguments to getCMSFields() are the popupController and - * popupFormName, however this is an experimental API and may change. - * - * @todo In the future, we will probably need to come up with a tigher object representing a partially - * complete controller with gaps for extra functionality. This, for example, would be a better way - * of letting Security/login put its log-in form inside a UI specified elsewhere. - * - * @return Form - * @see GridFieldDetailForm_ItemRequest::ItemEditForm() - */ - function ItemEditForm() { - $form=parent::ItemEditForm(); - - if($this->record->ID == 0) { - $templates = Subsite::get()->sort('Title'); - $templateArray = array(); - if($templates) { - $templateArray = $templates->map('ID', 'Title'); - } + $templateDropdown = new DropdownField('TemplateID', _t('Subsite.COPYSTRUCTURE', 'Copy structure from:'), $templateArray); + $templateDropdown->setEmptyString('(' . _t('Subsite.NOTEMPLATE', 'No template') . ')'); + $form->Fields()->addFieldToTab('Root.Configuration', $templateDropdown); + } + + return $form; + } + + public function doSave($data, $form) + { + $new_record = $this->record->ID == 0; + if ($new_record && isset($data['TemplateID']) && !empty($data['TemplateID'])) { + $template = Subsite::get()->byID(intval($data['TemplateID'])); + if ($template) { + $this->record = $template->duplicate(); + } + } - $templateDropdown = new DropdownField('TemplateID', _t('Subsite.COPYSTRUCTURE', 'Copy structure from:'), $templateArray); - $templateDropdown->setEmptyString('(' . _t('Subsite.NOTEMPLATE', 'No template') . ')'); - $form->Fields()->addFieldToTab('Root.Configuration', $templateDropdown); - } - - return $form; - } - - function doSave($data, $form) { - $new_record = $this->record->ID == 0; - if($new_record && isset($data['TemplateID']) && !empty($data['TemplateID'])) { - $template = Subsite::get()->byID(intval($data['TemplateID'])); - if($template) { - $this->record = $template->duplicate(); - } - } - - return parent::doSave($data, $form); - } + return parent::doSave($data, $form); + } } diff --git a/code/forms/SubsitesTreeDropdownField.php b/code/forms/SubsitesTreeDropdownField.php index 8584773..513c27c 100644 --- a/code/forms/SubsitesTreeDropdownField.php +++ b/code/forms/SubsitesTreeDropdownField.php @@ -5,40 +5,44 @@ * * @package subsites */ -class SubsitesTreeDropdownField extends TreeDropdownField { - - private static $allowed_actions = array( - 'tree' - ); - - protected $subsiteID = 0; - - protected $extraClasses = array('SubsitesTreeDropdownField'); - - function Field($properties = array()) { - $html = parent::Field($properties); - - Requirements::javascript('subsites/javascript/SubsitesTreeDropdownField.js'); - - return $html; - } - - function setSubsiteID($id) { - $this->subsiteID = $id; - } - - function getSubsiteID() { - return $this->subsiteID; - } - - function tree(SS_HTTPRequest $request) { - $oldSubsiteID = Session::get('SubsiteID'); - Session::set('SubsiteID', $this->subsiteID); - - $results = parent::tree($request); - - Session::set('SubsiteID', $oldSubsiteID); - - return $results; - } -} \ No newline at end of file +class SubsitesTreeDropdownField extends TreeDropdownField +{ + private static $allowed_actions = array( + 'tree' + ); + + protected $subsiteID = 0; + + protected $extraClasses = array('SubsitesTreeDropdownField'); + + public function Field($properties = array()) + { + $html = parent::Field($properties); + + Requirements::javascript('subsites/javascript/SubsitesTreeDropdownField.js'); + + return $html; + } + + public function setSubsiteID($id) + { + $this->subsiteID = $id; + } + + public function getSubsiteID() + { + return $this->subsiteID; + } + + public function tree(SS_HTTPRequest $request) + { + $oldSubsiteID = Session::get('SubsiteID'); + Session::set('SubsiteID', $this->subsiteID); + + $results = parent::tree($request); + + Session::set('SubsiteID', $oldSubsiteID); + + return $results; + } +} diff --git a/code/model/Subsite.php b/code/model/Subsite.php index e5f8182..01574c1 100644 --- a/code/model/Subsite.php +++ b/code/model/Subsite.php @@ -5,421 +5,485 @@ * * @package subsites */ -class Subsite extends DataObject { +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. + * + * @todo Remove flag once the Subsite CMS works without session state, + * similarly to the Translatable module. + */ + public static $use_session_subsiteid = false; - /** - * @var $use_session_subsiteid Boolean Set to TRUE when using the CMS and FALSE - * when browsing the frontend of a website. - * - * @todo Remove flag once the Subsite CMS works without session state, - * similarly to the Translatable module. - */ - public static $use_session_subsiteid = false; + /** + * @var boolean $disable_subsite_filter If enabled, bypasses the query decoration + * 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. + */ + public static $force_subsite = null; - /** - * @var boolean $disable_subsite_filter If enabled, bypasses the query decoration - * 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. - */ - public static $force_subsite = null; + /** + * + * @var boolean + */ + public static $write_hostmap = true; + + /** + * Memory cache of accessible sites + * + * @array + */ + private static $_cache_accessible_sites = array(); - /** - * - * @var boolean - */ - public static $write_hostmap = true; - - /** - * Memory cache of accessible sites - * - * @array - */ - private static $_cache_accessible_sites = array(); + /** + * Memory cache of subsite id for domains + * + * @var array + */ + private static $_cache_subsite_for_domain = array(); - /** - * Memory cache of subsite id for domains - * - * @var array - */ - private static $_cache_subsite_for_domain = array(); + /** + * @var array $allowed_themes Numeric array of all themes which are allowed to be selected for all subsites. + * Corresponds to subfolder names within the /themes folder. By default, all themes contained in this folder + * 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') + * in both TRUE or FALSE setting. + */ + public static $strict_subdomain_matching = false; - /** - * @var array $allowed_themes Numeric array of all themes which are allowed to be selected for all subsites. - * Corresponds to subfolder names within the /themes folder. By default, all themes contained in this folder - * 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') - * in both TRUE or FALSE setting. - */ - public static $strict_subdomain_matching = false; + /** + * @var boolean Respects the IsPublic flag when retrieving subsites + */ + public static $check_is_public = true; - /** - * @var boolean Respects the IsPublic flag when retrieving subsites - */ - public static $check_is_public = true; + /** + * 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. + * + * @uses ControllerSubsites->controllerAugmentInit() + * @return Subsite + */ + public static function currentSubsite() + { + // get_by_id handles caching so we don't have to + return DataObject::get_by_id('Subsite', self::currentSubsiteID()); + } - /** - * 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. - * - * @uses ControllerSubsites->controllerAugmentInit() - * @return Subsite - */ - public static function currentSubsite() { - // get_by_id handles caching so we don't have to - return DataObject::get_by_id('Subsite', self::currentSubsiteID()); - } + /** + * This function gets the current subsite ID from the session. It used in the backend so Ajax requests + * use the correct subsite. The frontend handles subsites differently. It calls getSubsiteIDForDomain + * directly from ModelAsController::getNestedController. Only gets Subsite instances which have their + * {@link IsPublic} flag set to TRUE. + * + * You can simulate subsite access without creating virtual hosts by appending ?SubsiteID= to the request. + * + * @todo Pass $request object from controller so we don't have to rely on $_GET + * + * @param boolean $cache + * @return int ID of the current subsite instance + */ + public static function currentSubsiteID() + { + $id = null; - /** - * This function gets the current subsite ID from the session. It used in the backend so Ajax requests - * use the correct subsite. The frontend handles subsites differently. It calls getSubsiteIDForDomain - * directly from ModelAsController::getNestedController. Only gets Subsite instances which have their - * {@link IsPublic} flag set to TRUE. - * - * You can simulate subsite access without creating virtual hosts by appending ?SubsiteID= to the request. - * - * @todo Pass $request object from controller so we don't have to rely on $_GET - * - * @param boolean $cache - * @return int ID of the current subsite instance - */ - public static function currentSubsiteID() { - $id = NULL; + if (isset($_GET['SubsiteID'])) { + $id = (int)$_GET['SubsiteID']; + } elseif (Subsite::$use_session_subsiteid) { + $id = Session::get('SubsiteID'); + } - if(isset($_GET['SubsiteID'])) { - $id = (int)$_GET['SubsiteID']; - } else if (Subsite::$use_session_subsiteid) { - $id = Session::get('SubsiteID'); - } + if ($id === null) { + $id = self::getSubsiteIDForDomain(); + } - if($id === NULL) { - $id = self::getSubsiteIDForDomain(); - } + 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. + * + * @param int|Subsite $subsite Either the ID of the subsite, or the subsite object itself + */ + public static function changeSubsite($subsite) + { + // Session subsite change only meaningful if the session is active. + // Otherwise we risk setting it to wrong value, e.g. if we rely on currentSubsiteID. + if (!Subsite::$use_session_subsiteid) { + return; + } - 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. - * - * @param int|Subsite $subsite Either the ID of the subsite, or the subsite object itself - */ - public static function changeSubsite($subsite) { - // Session subsite change only meaningful if the session is active. - // Otherwise we risk setting it to wrong value, e.g. if we rely on currentSubsiteID. - if (!Subsite::$use_session_subsiteid) return; + if (is_object($subsite)) { + $subsiteID = $subsite->ID; + } else { + $subsiteID = $subsite; + } - if(is_object($subsite)) $subsiteID = $subsite->ID; - else $subsiteID = $subsite; + Session::set('SubsiteID', (int)$subsiteID); - Session::set('SubsiteID', (int)$subsiteID); + // Set locale + if (is_object($subsite) && $subsite->Language != '') { + $locale = i18n::get_locale_from_lang($subsite->Language); + if ($locale) { + i18n::set_locale($locale); + } + } - // Set locale - if (is_object($subsite) && $subsite->Language != '') { - $locale = i18n::get_locale_from_lang($subsite->Language); - if($locale) { - i18n::set_locale($locale); - } - } + 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 + */ + public static function getSubsiteIDForDomain($host = null, $checkPermissions = true) + { + if ($host == null && isset($_SERVER['HTTP_HOST'])) { + $host = $_SERVER['HTTP_HOST']; + } - 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 - */ - public static function getSubsiteIDForDomain($host = null, $checkPermissions = true) { - if($host == null && isset($_SERVER['HTTP_HOST'])) { - $host = $_SERVER['HTTP_HOST']; - } + $matchingDomains = null; + $cacheKey = null; + if ($host) { + if (!self::$strict_subdomain_matching) { + $host = preg_replace('/^www\./', '', $host); + } - $matchingDomains = null; - $cacheKey = null; - if ($host) { - if(!self::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host); + $cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public)); + if (isset(self::$_cache_subsite_for_domain[$cacheKey])) { + return self::$_cache_subsite_for_domain[$cacheKey]; + } - $cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public)); - if(isset(self::$_cache_subsite_for_domain[$cacheKey])) return self::$_cache_subsite_for_domain[$cacheKey]; + $SQL_host = Convert::raw2sql($host); + $matchingDomains = DataObject::get( + "SubsiteDomain", + "'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')", + "\"IsPrimary\" DESC" + )->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1"); + } - $SQL_host = Convert::raw2sql($host); - $matchingDomains = DataObject::get( - "SubsiteDomain", - "'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')", - "\"IsPrimary\" DESC" - )->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1"); - } + if ($matchingDomains && $matchingDomains->Count()) { + $subsiteIDs = array_unique($matchingDomains->column('SubsiteID')); + $subsiteDomains = array_unique($matchingDomains->column('Domain')); + if (sizeof($subsiteIDs) > 1) { + throw new UnexpectedValueException(sprintf( + "Multiple subsites match on '%s': %s", + $host, + implode(',', $subsiteDomains) + )); + } - if($matchingDomains && $matchingDomains->Count()) { - $subsiteIDs = array_unique($matchingDomains->column('SubsiteID')); - $subsiteDomains = array_unique($matchingDomains->column('Domain')); - if(sizeof($subsiteIDs) > 1) { - throw new UnexpectedValueException(sprintf( - "Multiple subsites match on '%s': %s", - $host, - implode(',', $subsiteDomains) - )); - } + $subsiteID = $subsiteIDs[0]; + } elseif ($default = DataObject::get_one('Subsite', "\"DefaultSite\" = 1")) { + // Check for a 'default' subsite + $subsiteID = $default->ID; + } else { + // Default subsite id = 0, the main site + $subsiteID = 0; + } - $subsiteID = $subsiteIDs[0]; - } else if($default = DataObject::get_one('Subsite', "\"DefaultSite\" = 1")) { - // Check for a 'default' subsite - $subsiteID = $default->ID; - } else { - // Default subsite id = 0, the main site - $subsiteID = 0; - } + if ($cacheKey) { + self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID; + } - if ($cacheKey) { - self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID; - } + return $subsiteID; + } - return $subsiteID; - } + /** + * + * @param string $className + * @param string $filter + * @param string $sort + * @param string $join + * @param string $limit + * @return DataList + */ + public static function get_from_all_subsites($className, $filter = "", $sort = "", $join = "", $limit = "") + { + $result = DataObject::get($className, $filter, $sort, $join, $limit); + $result = $result->setDataQueryParam('Subsite.filter', false); + return $result; + } - /** - * - * @param string $className - * @param string $filter - * @param string $sort - * @param string $join - * @param string $limit - * @return DataList - */ - public static function get_from_all_subsites($className, $filter = "", $sort = "", $join = "", $limit = "") { - $result = DataObject::get($className, $filter, $sort, $join, $limit); - $result = $result->setDataQueryParam('Subsite.filter', false); - return $result; - } + /** + * Disable the sub-site filtering; queries will select from all subsites + */ + public static function disable_subsite_filter($disabled = true) + { + self::$disable_subsite_filter = $disabled; + } + + /** + * Flush caches on database reset + */ + public static function on_db_reset() + { + self::$_cache_accessible_sites = array(); + self::$_cache_subsite_for_domain = array(); + } + + /** + * Return all subsites, regardless of permissions (augmented with main site). + * + * @return SS_List List of {@link Subsite} objects (DataList or ArrayList). + */ + public static function all_sites($includeMainSite = true, $mainSiteTitle = "Main site") + { + $subsites = Subsite::get(); - /** - * Disable the sub-site filtering; queries will select from all subsites - */ - public static function disable_subsite_filter($disabled = true) { - self::$disable_subsite_filter = $disabled; - } - - /** - * Flush caches on database reset - */ - public static function on_db_reset() { - self::$_cache_accessible_sites = array(); - self::$_cache_subsite_for_domain = array(); - } - - /** - * Return all subsites, regardless of permissions (augmented with main site). - * - * @return SS_List List of {@link Subsite} objects (DataList or ArrayList). - */ - public static function all_sites($includeMainSite = true, $mainSiteTitle = "Main site") { - $subsites = Subsite::get(); + if ($includeMainSite) { + $subsites = $subsites->toArray(); - if($includeMainSite) { - $subsites = $subsites->toArray(); + $mainSite = new Subsite(); + $mainSite->Title = $mainSiteTitle; + array_unshift($subsites, $mainSite); - $mainSite = new Subsite(); - $mainSite->Title = $mainSiteTitle; - array_unshift($subsites, $mainSite); + $subsites = ArrayList::create($subsites); + } - $subsites = ArrayList::create($subsites); - } + return $subsites; + } - return $subsites; - } + /* + * Returns an ArrayList of the subsites accessible to the current user. + * It's enough for any section to be accessible for the site to be included. + * + * @return ArrayList of {@link Subsite} instances. + */ + public static function all_accessible_sites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) + { + // Rationalise member arguments + if (!$member) { + $member = Member::currentUser(); + } + if (!$member) { + return new ArrayList(); + } + if (!is_object($member)) { + $member = DataObject::get_by_id('Member', $member); + } - /* - * Returns an ArrayList of the subsites accessible to the current user. - * It's enough for any section to be accessible for the site to be included. - * - * @return ArrayList of {@link Subsite} instances. - */ - public static function all_accessible_sites($includeMainSite = true, $mainSiteTitle = "Main site", $member = null) { - // Rationalise member arguments - if(!$member) $member = Member::currentUser(); - if(!$member) return new ArrayList(); - if(!is_object($member)) $member = DataObject::get_by_id('Member', $member); + $subsites = new ArrayList(); - $subsites = new ArrayList(); + // Collect subsites for all sections. + $menu = CMSMenu::get_viewable_menu_items(); + foreach ($menu as $candidate) { + if ($candidate->controller) { + $accessibleSites = singleton($candidate->controller)->sectionSites( + $includeMainSite, + $mainSiteTitle, + $member + ); - // Collect subsites for all sections. - $menu = CMSMenu::get_viewable_menu_items(); - foreach($menu as $candidate) { - if ($candidate->controller) { - $accessibleSites = singleton($candidate->controller)->sectionSites( - $includeMainSite, - $mainSiteTitle, - $member - ); + // Replace existing keys so no one site appears twice. + $subsites->merge($accessibleSites); + } + } - // Replace existing keys so no one site appears twice. - $subsites->merge($accessibleSites); - } - } + $subsites->removeDuplicates(); - $subsites->removeDuplicates(); + return $subsites; + } - return $subsites; - } + /** + * Return the subsites that the current user can access by given permission. + * Sites will only be included if they have a Title. + * + * @param $permCode array|string Either a single permission code or an array of permission codes. + * @param $includeMainSite If true, the main site will be included if appropriate. + * @param $mainSiteTitle The label to give to the main site + * @param $member + * @return DataList of {@link Subsite} instances + */ + public static function accessible_sites($permCode, $includeMainSite = true, $mainSiteTitle = "Main site", $member = null) + { + // Rationalise member arguments + if (!$member) { + $member = Member::currentUser(); + } + if (!$member) { + return new ArrayList(); + } + if (!is_object($member)) { + $member = DataObject::get_by_id('Member', $member); + } - /** - * Return the subsites that the current user can access by given permission. - * Sites will only be included if they have a Title. - * - * @param $permCode array|string Either a single permission code or an array of permission codes. - * @param $includeMainSite If true, the main site will be included if appropriate. - * @param $mainSiteTitle The label to give to the main site - * @param $member - * @return DataList of {@link Subsite} instances - */ - public static function accessible_sites($permCode, $includeMainSite = true, $mainSiteTitle = "Main site", $member = null) { - // Rationalise member arguments - if(!$member) $member = Member::currentUser(); - if(!$member) return new ArrayList(); - if(!is_object($member)) $member = DataObject::get_by_id('Member', $member); + // 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])) { + return self::$_cache_accessible_sites[$cacheKey]; + } - // 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])) { - return self::$_cache_accessible_sites[$cacheKey]; - } + $subsites = DataList::create('Subsite') + ->where("\"Subsite\".\"Title\" != ''") + ->leftJoin('Group_Subsites', "\"Group_Subsites\".\"SubsiteID\" = \"Subsite\".\"ID\"") + ->innerJoin('Group', "\"Group\".\"ID\" = \"Group_Subsites\".\"GroupID\" OR \"Group\".\"AccessAllSubsites\" = 1") + ->innerJoin('Group_Members', "\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") + ->innerJoin('Permission', "\"Group\".\"ID\"=\"Permission\".\"GroupID\" AND \"Permission\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); - $subsites = DataList::create('Subsite') - ->where("\"Subsite\".\"Title\" != ''") - ->leftJoin('Group_Subsites', "\"Group_Subsites\".\"SubsiteID\" = \"Subsite\".\"ID\"") - ->innerJoin('Group', "\"Group\".\"ID\" = \"Group_Subsites\".\"GroupID\" OR \"Group\".\"AccessAllSubsites\" = 1") - ->innerJoin('Group_Members', "\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") - ->innerJoin('Permission', "\"Group\".\"ID\"=\"Permission\".\"GroupID\" AND \"Permission\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); + if (!$subsites) { + $subsites = new ArrayList(); + } - if(!$subsites) $subsites = new ArrayList(); + $rolesSubsites = DataList::create('Subsite') + ->where("\"Subsite\".\"Title\" != ''") + ->leftJoin('Group_Subsites', "\"Group_Subsites\".\"SubsiteID\" = \"Subsite\".\"ID\"") + ->innerJoin('Group', "\"Group\".\"ID\" = \"Group_Subsites\".\"GroupID\" OR \"Group\".\"AccessAllSubsites\" = 1") + ->innerJoin('Group_Members', "\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") + ->innerJoin('Group_Roles', "\"Group_Roles\".\"GroupID\"=\"Group\".\"ID\"") + ->innerJoin('PermissionRole', "\"Group_Roles\".\"PermissionRoleID\"=\"PermissionRole\".\"ID\"") + ->innerJoin('PermissionRoleCode', "\"PermissionRole\".\"ID\"=\"PermissionRoleCode\".\"RoleID\" AND \"PermissionRoleCode\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); - $rolesSubsites = DataList::create('Subsite') - ->where("\"Subsite\".\"Title\" != ''") - ->leftJoin('Group_Subsites', "\"Group_Subsites\".\"SubsiteID\" = \"Subsite\".\"ID\"") - ->innerJoin('Group', "\"Group\".\"ID\" = \"Group_Subsites\".\"GroupID\" OR \"Group\".\"AccessAllSubsites\" = 1") - ->innerJoin('Group_Members', "\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") - ->innerJoin('Group_Roles', "\"Group_Roles\".\"GroupID\"=\"Group\".\"ID\"") - ->innerJoin('PermissionRole', "\"Group_Roles\".\"PermissionRoleID\"=\"PermissionRole\".\"ID\"") - ->innerJoin('PermissionRoleCode', "\"PermissionRole\".\"ID\"=\"PermissionRoleCode\".\"RoleID\" AND \"PermissionRoleCode\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); + if (!$subsites && $rolesSubsites) { + return $rolesSubsites; + } - if(!$subsites && $rolesSubsites) return $rolesSubsites; + $subsites = new ArrayList($subsites->toArray()); - $subsites = new ArrayList($subsites->toArray()); + if ($rolesSubsites) { + foreach ($rolesSubsites as $subsite) { + if (!$subsites->find('ID', $subsite->ID)) { + $subsites->push($subsite); + } + } + } - if($rolesSubsites) foreach($rolesSubsites as $subsite) { - if(!$subsites->find('ID', $subsite->ID)) { - $subsites->push($subsite); - } - } + if ($includeMainSite) { + 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; - if($includeMainSite) { - 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 + * + * This is used primarily when using subsites in conjunction with StaticPublisher + * + * @param string $file - filepath of the host map to be written + * @return void + */ + 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(); + } + } + if ($subsite->DefaultSite) { + $hostmap['default'] = $subsite->domain(); + } + } + } + + $data = "domain map to subsites/host-map.php - * - * This is used primarily when using subsites in conjunction with StaticPublisher - * - * @param string $file - filepath of the host map to be written - * @return void - */ - 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(); - } - if ($subsite->DefaultSite) $hostmap['default'] = $subsite->domain(); - } - - $data = "ID; - - // Count this user's groups which can access the main site - $groupCount = DB::query(" + $SQLa_perm = Convert::raw2sql($permissionCodes); + $SQL_perms = join("','", $SQLa_perm); + $memberID = (int)$member->ID; + + // Count this user's groups which can access the main site + $groupCount = DB::query(" SELECT COUNT(\"Permission\".\"ID\") FROM \"Permission\" INNER JOIN \"Group\" ON \"Group\".\"ID\" = \"Permission\".\"GroupID\" AND \"Group\".\"AccessAllSubsites\" = 1 @@ -428,8 +492,8 @@ class Subsite extends DataObject { AND \"MemberID\" = {$memberID} ")->value(); - // Count this user's groups which have a role that can access the main site - $roleCount = DB::query(" + // Count this user's groups which have a role that can access the main site + $roleCount = DB::query(" SELECT COUNT(\"PermissionRoleCode\".\"ID\") FROM \"Group\" INNER JOIN \"Group_Members\" ON \"Group_Members\".\"GroupID\" = \"Group\".\"ID\" @@ -441,380 +505,398 @@ class Subsite extends DataObject { AND \"MemberID\" = {$memberID} ")->value(); - // There has to be at least one that allows access. - return ($groupCount + $roleCount > 0); - } - - /** - * - * @var array - */ - private static $db = array( - 'Title' => 'Varchar(255)', - 'RedirectURL' => 'Varchar(255)', - 'DefaultSite' => 'Boolean', - 'Theme' => 'Varchar', - 'Language' => 'Varchar(6)', + // There has to be at least one that allows access. + return ($groupCount + $roleCount > 0); + } + + /** + * + * @var array + */ + private static $db = array( + 'Title' => 'Varchar(255)', + 'RedirectURL' => 'Varchar(255)', + 'DefaultSite' => 'Boolean', + 'Theme' => 'Varchar', + 'Language' => 'Varchar(6)', - // 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', - ); + // 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', + ); - /** - * - * @var array - */ - private static $has_many = array( - 'Domains' => 'SubsiteDomain', - ); - - /** - * - * @var array - */ - private static $belongs_many_many = array( - "Groups" => "Group", - ); + /** + * + * @var array + */ + private static $has_many = array( + 'Domains' => 'SubsiteDomain', + ); + + /** + * + * @var array + */ + private static $belongs_many_many = array( + "Groups" => "Group", + ); - /** - * - * @var array - */ - private static $defaults = array( - 'IsPublic' => 1 - ); + /** + * + * @var array + */ + private static $defaults = array( + 'IsPublic' => 1 + ); - /** - * - * @var array - */ - private static $searchable_fields = array( - 'Title', - 'Domains.Domain', - 'IsPublic', - ); - - /** - * - * @var string - */ - private static $default_sort = "\"Title\" ASC"; - - /** - * @todo Possible security issue, don't grant edit permissions to everybody. - * @return boolean - */ - public function canEdit($member = false) { - return true; - } + /** + * + * @var array + */ + private static $searchable_fields = array( + 'Title', + 'Domains.Domain', + 'IsPublic', + ); + + /** + * + * @var string + */ + private static $default_sort = "\"Title\" ASC"; + + /** + * @todo Possible security issue, don't grant edit permissions to everybody. + * @return boolean + */ + public function canEdit($member = false) + { + return true; + } - /** - * 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(), - GridFieldConfig_RecordEditor::create(10) - ); - }else { - $domainTable = new LiteralField( - 'Domains', - '

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

' - ); - } - - $languageSelector = new DropdownField( - 'Language', - $this->fieldLabel('Language'), - i18n::get_common_locales() - ); - - $pageTypeMap = array(); - $pageTypes = SiteTree::page_type_classes(); - foreach($pageTypes as $pageType) { - $pageTypeMap[$pageType] = singleton($pageType)->i18n_singular_name(); - } - asort($pageTypeMap); + /** + * 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(), + GridFieldConfig_RecordEditor::create(10) + ); + } else { + $domainTable = new LiteralField( + 'Domains', + '

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

' + ); + } + + $languageSelector = new DropdownField( + 'Language', + $this->fieldLabel('Language'), + i18n::get_common_locales() + ); + + $pageTypeMap = array(); + $pageTypes = SiteTree::page_type_classes(); + foreach ($pageTypes as $pageType) { + $pageTypeMap[$pageType] = singleton($pageType)->i18n_singular_name(); + } + asort($pageTypeMap); - $fields = new FieldList( - $subsiteTabs = new TabSet('Root', - new Tab( - 'Configuration', - _t('Subsite.TabTitleConfig', 'Configuration'), - new HeaderField($this->getClassName() . ' configuration', 2), - new TextField('Title', $this->fieldLabel('Title'), $this->Title), - - new HeaderField( - _t('Subsite.DomainsHeadline',"Domains for this subsite") - ), - $domainTable, - $languageSelector, - // new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL), - new CheckboxField('DefaultSite', $this->fieldLabel('DefaultSite'), $this->DefaultSite), - new CheckboxField('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic), + $fields = new FieldList( + $subsiteTabs = new TabSet('Root', + new Tab( + 'Configuration', + _t('Subsite.TabTitleConfig', 'Configuration'), + new HeaderField($this->getClassName() . ' configuration', 2), + new TextField('Title', $this->fieldLabel('Title'), $this->Title), + + new HeaderField( + _t('Subsite.DomainsHeadline', "Domains for this subsite") + ), + $domainTable, + $languageSelector, + // new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL), + new CheckboxField('DefaultSite', $this->fieldLabel('DefaultSite'), $this->DefaultSite), + new CheckboxField('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic), - new DropdownField('Theme',$this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme), - - - new LiteralField( - 'PageTypeBlacklistToggle', - sprintf( - '', - _t('Subsite.PageTypeBlacklistField', 'Disallow page types?') - ) - ), - new CheckboxSetField( - 'PageTypeBlacklist', - false, - $pageTypeMap - ) - ) - ), - new HiddenField('ID', '', $this->ID), - new HiddenField('IsSubsite', '', 1) - ); + new DropdownField('Theme', $this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme), + + + new LiteralField( + 'PageTypeBlacklistToggle', + sprintf( + '', + _t('Subsite.PageTypeBlacklistField', 'Disallow page types?') + ) + ), + new CheckboxSetField( + 'PageTypeBlacklist', + false, + $pageTypeMap + ) + ) + ), + new HiddenField('ID', '', $this->ID), + new HiddenField('IsSubsite', '', 1) + ); - $subsiteTabs->addExtraClass('subsite-model'); + $subsiteTabs->addExtraClass('subsite-model'); - $this->extend('updateCMSFields', $fields); - return $fields; - } - - /** - * - * @param boolean $includerelations - * @return array - */ - public function fieldLabels($includerelations = true) { - $labels = parent::fieldLabels($includerelations); - $labels['Title'] = _t('Subsites.TitleFieldLabel', 'Subsite Name'); - $labels['RedirectURL'] = _t('Subsites.RedirectURLFieldLabel', 'Redirect URL'); - $labels['DefaultSite'] = _t('Subsites.DefaultSiteFieldLabel', 'Default site'); - $labels['Theme'] = _t('Subsites.ThemeFieldLabel', 'Theme'); - $labels['Language'] = _t('Subsites.LanguageFieldLabel', 'Language'); - $labels['IsPublic'] = _t('Subsites.IsPublicFieldLabel', 'Enable public access'); - $labels['PageTypeBlacklist'] = _t('Subsites.PageTypeBlacklistFieldLabel', 'Page Type Blacklist'); - $labels['Domains.Domain'] = _t('Subsites.DomainFieldLabel', 'Domain'); - $labels['PrimaryDomain'] = _t('Subsites.PrimaryDomainFieldLabel', 'Primary Domain'); + $this->extend('updateCMSFields', $fields); + return $fields; + } + + /** + * + * @param boolean $includerelations + * @return array + */ + public function fieldLabels($includerelations = true) + { + $labels = parent::fieldLabels($includerelations); + $labels['Title'] = _t('Subsites.TitleFieldLabel', 'Subsite Name'); + $labels['RedirectURL'] = _t('Subsites.RedirectURLFieldLabel', 'Redirect URL'); + $labels['DefaultSite'] = _t('Subsites.DefaultSiteFieldLabel', 'Default site'); + $labels['Theme'] = _t('Subsites.ThemeFieldLabel', 'Theme'); + $labels['Language'] = _t('Subsites.LanguageFieldLabel', 'Language'); + $labels['IsPublic'] = _t('Subsites.IsPublicFieldLabel', 'Enable public access'); + $labels['PageTypeBlacklist'] = _t('Subsites.PageTypeBlacklistFieldLabel', 'Page Type Blacklist'); + $labels['Domains.Domain'] = _t('Subsites.DomainFieldLabel', 'Domain'); + $labels['PrimaryDomain'] = _t('Subsites.PrimaryDomainFieldLabel', 'Primary Domain'); - return $labels; - } + return $labels; + } - /** - * - * @return array - */ - public function summaryFields() { - return array( - 'Title' => $this->fieldLabel('Title'), - 'PrimaryDomain' => $this->fieldLabel('PrimaryDomain'), - 'IsPublic' => _t('Subsite.IsPublicHeaderField','Active subsite'), - ); - } - - /** - * Return the themes that can be used with this subsite, as an array of themecode => description - * - * @return array - */ - public function allowedThemes() { - if($themes = $this->stat('allowed_themes')) { - return ArrayLib::valuekey($themes); - } else { - $themes = array(); - if(is_dir('../themes/')) { - foreach(scandir('../themes/') as $theme) { - if($theme[0] == '.') continue; - $theme = strtok($theme,'_'); - $themes[$theme] = $theme; - } - ksort($themes); - } - return $themes; - } - } + /** + * + * @return array + */ + public function summaryFields() + { + return array( + 'Title' => $this->fieldLabel('Title'), + 'PrimaryDomain' => $this->fieldLabel('PrimaryDomain'), + 'IsPublic' => _t('Subsite.IsPublicHeaderField', 'Active subsite'), + ); + } + + /** + * Return the themes that can be used with this subsite, as an array of themecode => description + * + * @return array + */ + public function allowedThemes() + { + if ($themes = $this->stat('allowed_themes')) { + return ArrayLib::valuekey($themes); + } else { + $themes = array(); + if (is_dir('../themes/')) { + foreach (scandir('../themes/') as $theme) { + if ($theme[0] == '.') { + continue; + } + $theme = strtok($theme, '_'); + $themes[$theme] = $theme; + } + ksort($themes); + } + return $themes; + } + } - /** - * @return string Current locale of the subsite - */ - public function getLanguage() { - if($this->getField('Language')) { - return $this->getField('Language'); - } else { - return i18n::get_locale(); - } - } + /** + * @return string Current locale of the subsite + */ + public function getLanguage() + { + if ($this->getField('Language')) { + return $this->getField('Language'); + } else { + return i18n::get_locale(); + } + } - /** - * - * @return ValidationResult - */ - public function validate() { - $result = parent::validate(); - if(!$this->Title) { - $result->error(_t('Subsite.ValidateTitle', 'Please add a "Title"')); - } - return $result; - } + /** + * + * @return ValidationResult + */ + public function validate() + { + $result = parent::validate(); + if (!$this->Title) { + $result->error(_t('Subsite.ValidateTitle', 'Please add a "Title"')); + } + return $result; + } - /** - * Whenever a Subsite is written, rewrite the hostmap - * - * @return void - */ - public function onAfterWrite() { - 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() { - if($this->ID) { - $domains = DataObject::get("SubsiteDomain", "\"SubsiteID\" = $this->ID", "\"IsPrimary\" DESC","", 1); - if($domains && $domains->Count()>0) { - $domain = $domains->First()->Domain; - // If there are wildcards in the primary domain (not recommended), make some - // educated guesses about what to replace them with: - $domain = preg_replace('/\.\*$/',".$_SERVER[HTTP_HOST]", $domain); - // Default to "subsite." prefix for first wildcard - // TODO Whats the significance of "subsite" in this context?! - $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() { - return $this->domain(); - } + /** + * Whenever a Subsite is written, rewrite the hostmap + * + * @return void + */ + public function onAfterWrite() + { + 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() + { + if ($this->ID) { + $domains = DataObject::get("SubsiteDomain", "\"SubsiteID\" = $this->ID", "\"IsPrimary\" DESC", "", 1); + if ($domains && $domains->Count()>0) { + $domain = $domains->First()->Domain; + // If there are wildcards in the primary domain (not recommended), make some + // educated guesses about what to replace them with: + $domain = preg_replace('/\.\*$/', ".$_SERVER[HTTP_HOST]", $domain); + // Default to "subsite." prefix for first wildcard + // TODO Whats the significance of "subsite" in this context?! + $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() + { + return $this->domain(); + } - /** - * - * @return string - */ - public function absoluteBaseURL() { - return "http://" . $this->domain() . Director::baseURL(); - } + /** + * + * @return string + */ + public function absoluteBaseURL() + { + return "http://" . $this->domain() . Director::baseURL(); + } - /** - * @todo getClassName is redundant, already stored as a database field? - */ - public function getClassName() { - return $this->class; - } + /** + * @todo getClassName is redundant, already stored as a database field? + */ + public function getClassName() + { + return $this->class; + } - /** - * Javascript admin action to duplicate this subsite - * - * @return string - javascript - */ - public function adminDuplicate() { - $newItem = $this->duplicate(); - $message = _t( - 'Subsite.CopyMessage', - 'Created a copy of {title}', - array('title' => Convert::raw2js($this->Title)) - ); - - return <<duplicate(); + $message = _t( + 'Subsite.CopyMessage', + 'Created a copy of {title}', + array('title' => Convert::raw2js($this->Title)) + ); + + return <<ID'); JS; - } + } - /** - * Make this subsite the current one - */ - public function activate() { - Subsite::changeSubsite($this); - } + /** + * Make this subsite the current one + */ + public function activate() + { + Subsite::changeSubsite($this); + } - /** - * - * @param array $permissionCodes - * @return DataList - */ - public function getMembersByPermission($permissionCodes = array('ADMIN')){ - if(!is_array($permissionCodes)) - user_error('Permissions must be passed to Subsite::getMembersByPermission as an array', E_USER_ERROR); - $SQL_permissionCodes = Convert::raw2sql($permissionCodes); + /** + * + * @param array $permissionCodes + * @return DataList + */ + public function getMembersByPermission($permissionCodes = array('ADMIN')) + { + if (!is_array($permissionCodes)) { + user_error('Permissions must be passed to Subsite::getMembersByPermission as an array', E_USER_ERROR); + } + $SQL_permissionCodes = Convert::raw2sql($permissionCodes); - $SQL_permissionCodes = join("','", $SQL_permissionCodes); + $SQL_permissionCodes = join("','", $SQL_permissionCodes); - return DataObject::get( - 'Member', - "\"Group\".\"SubsiteID\" = $this->ID AND \"Permission\".\"Code\" IN ('$SQL_permissionCodes')", - '', - "LEFT JOIN \"Group_Members\" ON \"Member\".\"ID\" = \"Group_Members\".\"MemberID\" + return DataObject::get( + '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\"" - ); - - } + ); + } - /** - * Duplicate this subsite - */ - public function duplicate($doWrite = true) { - $duplicate = parent::duplicate($doWrite); + /** + * Duplicate this subsite + */ + public function duplicate($doWrite = true) + { + $duplicate = parent::duplicate($doWrite); - $oldSubsiteID = Session::get('SubsiteID'); - self::changeSubsite($this->ID); + $oldSubsiteID = Session::get('SubsiteID'); + self::changeSubsite($this->ID); - /* - * Copy data from this object to the given subsite. Does this using an iterative depth-first search. - * This will make sure that the new parents on the new subsite are correct, and there are no funny - * issues with having to check whether or not the new parents have been added to the site tree - * when a page, etc, is duplicated - */ - $stack = array(array(0,0)); - while(count($stack) > 0) { - list($sourceParentID, $destParentID) = array_pop($stack); - $children = Versioned::get_by_stage('Page', 'Live', "\"ParentID\" = $sourceParentID", ''); + /* + * Copy data from this object to the given subsite. Does this using an iterative depth-first search. + * This will make sure that the new parents on the new subsite are correct, and there are no funny + * issues with having to check whether or not the new parents have been added to the site tree + * when a page, etc, is duplicated + */ + $stack = array(array(0,0)); + while (count($stack) > 0) { + list($sourceParentID, $destParentID) = array_pop($stack); + $children = Versioned::get_by_stage('Page', 'Live', "\"ParentID\" = $sourceParentID", ''); - 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'); - $childClone->publish('Stage', 'Live'); + if ($children) { + foreach ($children as $child) { + self::changeSubsite($duplicate->ID); //Change to destination subsite - self::changeSubsite($this->ID); //Change Back to this subsite + $childClone = $child->duplicateToSubsite($duplicate, false); + $childClone->ParentID = $destParentID; + $childClone->writeToStage('Stage'); + $childClone->publish('Stage', 'Live'); - array_push($stack, array($child->ID, $childClone->ID)); - } - } - } + self::changeSubsite($this->ID); //Change Back to this subsite - self::changeSubsite($oldSubsiteID); + array_push($stack, array($child->ID, $childClone->ID)); + } + } + } - return $duplicate; - } + self::changeSubsite($oldSubsiteID); + + return $duplicate; + } } diff --git a/code/model/SubsiteDomain.php b/code/model/SubsiteDomain.php index b6af634..11439e0 100644 --- a/code/model/SubsiteDomain.php +++ b/code/model/SubsiteDomain.php @@ -4,78 +4,82 @@ * @property text Domain domain name of this subsite. Do not include the URL scheme here * @property bool IsPrimary Is this the primary subdomain? */ -class SubsiteDomain extends DataObject { +class SubsiteDomain extends DataObject +{ + /** + * + * @var array + */ + private static $db = array( + "Domain" => "Varchar(255)", + "IsPrimary" => "Boolean", + ); - /** - * - * @var array - */ - private static $db = array( - "Domain" => "Varchar(255)", - "IsPrimary" => "Boolean", - ); + /** + * + * @var array + */ + private static $has_one = array( + "Subsite" => "Subsite", + ); - /** - * - * @var array - */ - private static $has_one = array( - "Subsite" => "Subsite", - ); + /** + * + * @var array + */ + private static $summary_fields=array( + 'Domain', + 'IsPrimary', + ); - /** - * - * @var array - */ - private static $summary_fields=array( - 'Domain', - 'IsPrimary', - ); + /** + * Whenever a Subsite Domain is written, rewrite the hostmap + * + * @return void + */ + public function onAfterWrite() + { + Subsite::writeHostMap(); + } + + /** + * + * @return \FieldList + */ + public function getCMSFields() + { + $fields = new FieldList( + new TextField('Domain', $this->fieldLabel('Domain'), null, 255), + new CheckboxField('IsPrimary', $this->fieldLabel('IsPrimary')) + ); - /** - * Whenever a Subsite Domain is written, rewrite the hostmap - * - * @return void - */ - public function onAfterWrite() { - Subsite::writeHostMap(); - } - - /** - * - * @return \FieldList - */ - public function getCMSFields() { - $fields = new FieldList( - new TextField('Domain', $this->fieldLabel('Domain'), null, 255), - new CheckboxField('IsPrimary', $this->fieldLabel('IsPrimary')) - ); + $this->extend('updateCMSFields', $fields); + return $fields; + } - $this->extend('updateCMSFields', $fields); - return $fields; - } + /** + * + * @param bool $includerelations + * @return array + */ + public function fieldLabels($includerelations = true) + { + $labels = parent::fieldLabels($includerelations); + $labels['Domain'] = _t('SubsiteDomain.DOMAIN', 'Domain'); + $labels['IsPrimary'] = _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain'); - /** - * - * @param bool $includerelations - * @return array - */ - public function fieldLabels($includerelations = true) { - $labels = parent::fieldLabels($includerelations); - $labels['Domain'] = _t('SubsiteDomain.DOMAIN', 'Domain'); - $labels['IsPrimary'] = _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain'); + return $labels; + } - return $labels; - } + /** + * Before writing the Subsite Domain, strip out any HTML the user has entered. + * @return void + */ + public function onBeforeWrite() + { + parent::onBeforeWrite(); - /** - * Before writing the Subsite Domain, strip out any HTML the user has entered. - * @return void - */ - public function onBeforeWrite() { - parent::onBeforeWrite(); - - //strip out any HTML to avoid XSS attacks - $this->Domain = Convert::html2raw($this->Domain); - } + //strip out any HTML to avoid XSS attacks + $this->Domain = Convert::html2raw($this->Domain); + } } diff --git a/code/tasks/SubsiteCopyPagesTask.php b/code/tasks/SubsiteCopyPagesTask.php index 8448bec..ceac417 100644 --- a/code/tasks/SubsiteCopyPagesTask.php +++ b/code/tasks/SubsiteCopyPagesTask.php @@ -6,62 +6,72 @@ * * Example: sake dev/tasks/SubsiteCopyPagesTask from= to= */ -class SubsiteCopyPagesTask extends BuildTask { +class SubsiteCopyPagesTask extends BuildTask +{ + protected $title = 'Copy pages to different subsite'; + + protected $description = ''; - protected $title = 'Copy pages to different subsite'; - - protected $description = ''; + public function run($request) + { + $subsiteFromId = $request->getVar('from'); + if (!is_numeric($subsiteFromId)) { + throw new InvalidArgumentException('Missing "from" parameter'); + } + $subsiteFrom = DataObject::get_by_id('Subsite', $subsiteFromId); + if (!$subsiteFrom) { + throw new InvalidArgumentException('Subsite not found'); + } - function run($request) { - $subsiteFromId = $request->getVar('from'); - if(!is_numeric($subsiteFromId)) throw new InvalidArgumentException('Missing "from" parameter'); - $subsiteFrom = DataObject::get_by_id('Subsite', $subsiteFromId); - if(!$subsiteFrom) throw new InvalidArgumentException('Subsite not found'); + $subsiteToId = $request->getVar('to'); + if (!is_numeric($subsiteToId)) { + throw new InvalidArgumentException('Missing "to" parameter'); + } + $subsiteTo = DataObject::get_by_id('Subsite', $subsiteToId); + if (!$subsiteTo) { + throw new InvalidArgumentException('Subsite not found'); + } - $subsiteToId = $request->getVar('to'); - if(!is_numeric($subsiteToId)) throw new InvalidArgumentException('Missing "to" parameter'); - $subsiteTo = DataObject::get_by_id('Subsite', $subsiteToId); - if(!$subsiteTo) throw new InvalidArgumentException('Subsite not found'); + $useVirtualPages = (bool)$request->getVar('virtual'); - $useVirtualPages = (bool)$request->getVar('virtual'); + Subsite::changeSubsite($subsiteFrom); - Subsite::changeSubsite($subsiteFrom); + // Copy data from this template to the given subsite. Does this using an iterative depth-first search. + // This will make sure that the new parents on the new subsite are correct, and there are no funny + // issues with having to check whether or not the new parents have been added to the site tree + // when a page, etc, is duplicated + $stack = array(array(0,0)); + while (count($stack) > 0) { + list($sourceParentID, $destParentID) = array_pop($stack); - // Copy data from this template to the given subsite. Does this using an iterative depth-first search. - // This will make sure that the new parents on the new subsite are correct, and there are no funny - // issues with having to check whether or not the new parents have been added to the site tree - // when a page, etc, is duplicated - $stack = array(array(0,0)); - while(count($stack) > 0) { - list($sourceParentID, $destParentID) = array_pop($stack); + $children = Versioned::get_by_stage('SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); - $children = Versioned::get_by_stage('SiteTree', 'Live', "\"ParentID\" = $sourceParentID", ''); + if ($children) { + foreach ($children as $child) { + if ($useVirtualPages) { + $childClone = new SubsitesVirtualPage(); + $childClone->writeToStage('Stage'); + $childClone->CopyContentFromID = $child->ID; + $childClone->SubsiteID = $subsiteTo->ID; + } else { + $childClone = $child->duplicateToSubsite($subsiteTo->ID, true); + } + + $childClone->ParentID = $destParentID; + $childClone->writeToStage('Stage'); + $childClone->publish('Stage', 'Live'); + array_push($stack, array($child->ID, $childClone->ID)); - if($children) { - foreach($children as $child) { - if($useVirtualPages) { - $childClone = new SubsitesVirtualPage(); - $childClone->writeToStage('Stage'); - $childClone->CopyContentFromID = $child->ID; - $childClone->SubsiteID = $subsiteTo->ID; - } else { - $childClone = $child->duplicateToSubsite($subsiteTo->ID, true); - } - - $childClone->ParentID = $destParentID; - $childClone->writeToStage('Stage'); - $childClone->publish('Stage', 'Live'); - array_push($stack, array($child->ID, $childClone->ID)); + $this->log(sprintf('Copied "%s" (#%d, %s)', $child->Title, $child->ID, $child->Link())); + } + } - $this->log(sprintf('Copied "%s" (#%d, %s)', $child->Title, $child->ID, $child->Link())); - } - } + unset($children); + } + } - unset($children); - } - } - - function log($msg) { - echo $msg . "\n"; - } -} \ No newline at end of file + public function log($msg) + { + echo $msg . "\n"; + } +} diff --git a/tests/BaseSubsiteTest.php b/tests/BaseSubsiteTest.php index de0940e..657857c 100644 --- a/tests/BaseSubsiteTest.php +++ b/tests/BaseSubsiteTest.php @@ -1,28 +1,30 @@ assertFalse(Subsite::$disable_subsite_filter); - } + return $obj; + } + /** + * Tests the initial state of disable_subsite_filter + */ + public function testDisableSubsiteFilter() + { + $this->assertFalse(Subsite::$disable_subsite_filter); + } } diff --git a/tests/FileSubsitesTest.php b/tests/FileSubsitesTest.php index 943e8cc..a465dee 100644 --- a/tests/FileSubsitesTest.php +++ b/tests/FileSubsitesTest.php @@ -1,76 +1,79 @@ assertTrue(is_array(singleton('FileSubsites')->extraStatics())); - $file = new File(); - $file->Name = 'FileTitle'; - $file->Title = 'FileTitle'; - $this->assertEquals(' * FileTitle', $file->alternateTreeTitle()); - $file->SubsiteID = $this->objFromFixture('Subsite', 'domaintest1')->ID; - $this->assertEquals('FileTitle', $file->getTreeTitle()); - $this->assertTrue(singleton('Folder')->getCMSFields() instanceof FieldList); - Subsite::changeSubsite(1); - $this->assertEquals($file->cacheKeyComponent(), 'subsite-1'); - } - - function testWritingSubsiteID() { - $this->objFromFixture('Member', 'admin')->logIn(); - - $subsite = $this->objFromFixture('Subsite', 'domaintest1'); - FileSubsites::$default_root_folders_global = true; - - Subsite::changeSubsite(0); - $file = new File(); - $file->write(); - $file->onAfterUpload(); - $this->assertEquals((int)$file->SubsiteID, 0); - - Subsite::changeSubsite($subsite->ID); - $this->assertTrue($file->canEdit()); - - $file = new File(); - $file->write(); - $this->assertEquals((int)$file->SubsiteID, 0); - $this->assertTrue($file->canEdit()); - - FileSubsites::$default_root_folders_global = false; - - Subsite::changeSubsite($subsite->ID); - $file = new File(); - $file->write(); - $this->assertEquals($file->SubsiteID, $subsite->ID); - - // Test inheriting from parent folder - $folder = new Folder(); - $folder->write(); - $this->assertEquals($folder->SubsiteID, $subsite->ID); - FileSubsites::$default_root_folders_global = true; - $file = new File(); - $file->ParentID = $folder->ID; - $file->onAfterUpload(); - $this->assertEquals($folder->SubsiteID, $file->SubsiteID); - } +class FileSubsitesTest extends BaseSubsiteTest +{ + public static $fixture_file = 'subsites/tests/SubsiteTest.yml'; + + public function testTrivialFeatures() + { + $this->assertTrue(is_array(singleton('FileSubsites')->extraStatics())); + $file = new File(); + $file->Name = 'FileTitle'; + $file->Title = 'FileTitle'; + $this->assertEquals(' * FileTitle', $file->alternateTreeTitle()); + $file->SubsiteID = $this->objFromFixture('Subsite', 'domaintest1')->ID; + $this->assertEquals('FileTitle', $file->getTreeTitle()); + $this->assertTrue(singleton('Folder')->getCMSFields() instanceof FieldList); + Subsite::changeSubsite(1); + $this->assertEquals($file->cacheKeyComponent(), 'subsite-1'); + } + + public function testWritingSubsiteID() + { + $this->objFromFixture('Member', 'admin')->logIn(); + + $subsite = $this->objFromFixture('Subsite', 'domaintest1'); + FileSubsites::$default_root_folders_global = true; + + Subsite::changeSubsite(0); + $file = new File(); + $file->write(); + $file->onAfterUpload(); + $this->assertEquals((int)$file->SubsiteID, 0); + + Subsite::changeSubsite($subsite->ID); + $this->assertTrue($file->canEdit()); + + $file = new File(); + $file->write(); + $this->assertEquals((int)$file->SubsiteID, 0); + $this->assertTrue($file->canEdit()); + + FileSubsites::$default_root_folders_global = false; + + Subsite::changeSubsite($subsite->ID); + $file = new File(); + $file->write(); + $this->assertEquals($file->SubsiteID, $subsite->ID); + + // Test inheriting from parent folder + $folder = new Folder(); + $folder->write(); + $this->assertEquals($folder->SubsiteID, $subsite->ID); + FileSubsites::$default_root_folders_global = true; + $file = new File(); + $file->ParentID = $folder->ID; + $file->onAfterUpload(); + $this->assertEquals($folder->SubsiteID, $file->SubsiteID); + } - function testSubsitesFolderDropdown() { - $this->objFromFixture('Member', 'admin')->logIn(); + public function testSubsitesFolderDropdown() + { + $this->objFromFixture('Member', 'admin')->logIn(); - $file = new Folder(); + $file = new Folder(); - $source = array_values($file->getCMSFields()->dataFieldByName('SubsiteID')->getSource()); - asort($source); + $source = array_values($file->getCMSFields()->dataFieldByName('SubsiteID')->getSource()); + asort($source); - $this->assertEquals(array( - 'Main site', - 'Template', - 'Subsite1 Template', - 'Subsite2 Template', - 'Test 1', - 'Test 2', - 'Test 3' - ), $source); - } - + $this->assertEquals(array( + 'Main site', + 'Template', + 'Subsite1 Template', + 'Subsite2 Template', + 'Test 1', + 'Test 2', + 'Test 3' + ), $source); + } } diff --git a/tests/GroupSubsitesTest.php b/tests/GroupSubsitesTest.php index 6ab1fec..d9a7feb 100644 --- a/tests/GroupSubsitesTest.php +++ b/tests/GroupSubsitesTest.php @@ -1,25 +1,28 @@ assertTrue(is_array(singleton('GroupSubsites')->extraStatics())); - $this->assertTrue(is_array(singleton('GroupSubsites')->providePermissions())); - $this->assertTrue(singleton('Group')->getCMSFields() instanceof FieldList); - } - - function testAlternateTreeTitle() { - $group = new Group(); - $group->Title = 'The A Team'; - $group->AccessAllSubsites = true; - $this->assertEquals($group->getTreeTitle(), 'The A Team (global group)'); - $group->AccessAllSubsites = false; - $group->write(); - $group->Subsites()->add($this->objFromFixture('Subsite', 'domaintest1')); - $group->Subsites()->add($this->objFromFixture('Subsite', 'domaintest2')); - $this->assertEquals($group->getTreeTitle(), 'The A Team (Test 1, Test 2)'); - } -} \ No newline at end of file +class GroupSubsitesTest extends BaseSubsiteTest +{ + public static $fixture_file = 'subsites/tests/SubsiteTest.yml'; + + protected $requireDefaultRecordsFrom = array('GroupSubsites'); + + public function testTrivialFeatures() + { + $this->assertTrue(is_array(singleton('GroupSubsites')->extraStatics())); + $this->assertTrue(is_array(singleton('GroupSubsites')->providePermissions())); + $this->assertTrue(singleton('Group')->getCMSFields() instanceof FieldList); + } + + public function testAlternateTreeTitle() + { + $group = new Group(); + $group->Title = 'The A Team'; + $group->AccessAllSubsites = true; + $this->assertEquals($group->getTreeTitle(), 'The A Team (global group)'); + $group->AccessAllSubsites = false; + $group->write(); + $group->Subsites()->add($this->objFromFixture('Subsite', 'domaintest1')); + $group->Subsites()->add($this->objFromFixture('Subsite', 'domaintest2')); + $this->assertEquals($group->getTreeTitle(), 'The A Team (Test 1, Test 2)'); + } +} diff --git a/tests/LeftAndMainSubsitesTest.php b/tests/LeftAndMainSubsitesTest.php index 0b2c6df..5a9603e 100644 --- a/tests/LeftAndMainSubsitesTest.php +++ b/tests/LeftAndMainSubsitesTest.php @@ -1,88 +1,90 @@ objFromFixture('Member', 'subsite1member'); + public function testSectionSites() + { + $member = $this->objFromFixture('Member', 'subsite1member'); - $cmsmain = singleton('CMSMain'); - $subsites = $cmsmain->sectionSites(true, "Main site", $member); - $this->assertDOSEquals(array( - array('Title' =>'Subsite1 Template') - ), $subsites, 'Lists member-accessible sites for the accessible controller.'); + $cmsmain = singleton('CMSMain'); + $subsites = $cmsmain->sectionSites(true, "Main site", $member); + $this->assertDOSEquals(array( + array('Title' =>'Subsite1 Template') + ), $subsites, 'Lists member-accessible sites for the accessible controller.'); - $assetadmin = singleton('AssetAdmin'); - $subsites = $assetadmin->sectionSites(true, "Main site", $member); - $this->assertDOSEquals(array(), $subsites, 'Does not list any sites for forbidden controller.'); + $assetadmin = singleton('AssetAdmin'); + $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('Member', 'editor'); - $cmsmain = singleton('CMSMain'); - $subsites = $cmsmain->sectionSites(true, "Main site", $member); - $this->assertDOSContains(array( - array('Title' =>'Main site') - ), $subsites, 'Includes the main site for members who can access all sites.'); - } + $cmsmain = singleton('CMSMain'); + $subsites = $cmsmain->sectionSites(true, "Main site", $member); + $this->assertDOSContains(array( + array('Title' =>'Main site') + ), $subsites, 'Includes the main site for members who can access all sites.'); + } - function testAccessChecksDontChangeCurrentSubsite() { - $admin = $this->objFromFixture("Member","admin"); - $this->loginAs($admin); - $ids = array(); - - $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); - $subsite2 = $this->objFromFixture('Subsite', 'domaintest2'); - $subsite3 = $this->objFromFixture('Subsite', 'domaintest3'); - - $ids[] = $subsite1->ID; - $ids[] = $subsite2->ID; - $ids[] = $subsite3->ID; - $ids[] = 0; - - // Enable session-based subsite tracking. - Subsite::$use_session_subsiteid = true; + public function testAccessChecksDontChangeCurrentSubsite() + { + $admin = $this->objFromFixture("Member", "admin"); + $this->loginAs($admin); + $ids = array(); + + $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); + $subsite2 = $this->objFromFixture('Subsite', 'domaintest2'); + $subsite3 = $this->objFromFixture('Subsite', 'domaintest3'); + + $ids[] = $subsite1->ID; + $ids[] = $subsite2->ID; + $ids[] = $subsite3->ID; + $ids[] = 0; + + // Enable session-based subsite tracking. + Subsite::$use_session_subsiteid = true; - foreach($ids as $id) { - Subsite::changeSubsite($id); - $this->assertEquals($id, Subsite::currentSubsiteID()); + foreach ($ids as $id) { + Subsite::changeSubsite($id); + $this->assertEquals($id, Subsite::currentSubsiteID()); - $left = new LeftAndMain(); - $this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '$id'"); - $this->assertEquals($id, Subsite::currentSubsiteID(), - "The current subsite has not been changed in the process of checking permissions for admin user."); - } - - } + $left = new LeftAndMain(); + $this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '$id'"); + $this->assertEquals($id, Subsite::currentSubsiteID(), + "The current subsite has not been changed in the process of checking permissions for admin user."); + } + } - function testShouldChangeSubsite() { - $l = new LeftAndMain(); - Config::inst()->nest(); + public function testShouldChangeSubsite() + { + $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('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('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(); - } + 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 612ac32..336ab36 100644 --- a/tests/SiteConfigSubsitesTest.php +++ b/tests/SiteConfigSubsitesTest.php @@ -1,38 +1,39 @@ objFromFixture('Subsite', 'domaintest1'); - $subsite2 = $this->objFromFixture('Subsite', 'domaintest2'); +class SiteConfigSubsitesTest extends BaseSubsiteTest +{ + public static $fixture_file = 'subsites/tests/SubsiteTest.yml'; + + public function testEachSubsiteHasAUniqueSiteConfig() + { + $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); + $subsite2 = $this->objFromFixture('Subsite', 'domaintest2'); - $this->assertTrue(is_array(singleton('SiteConfigSubsites')->extraStatics())); - - Subsite::changeSubsite(0); - $sc = SiteConfig::current_site_config(); - $sc->Title = 'RootSite'; - $sc->write(); - - Subsite::changeSubsite($subsite1->ID); - $sc = SiteConfig::current_site_config(); - $sc->Title = 'Subsite1'; - $sc->write(); - - Subsite::changeSubsite($subsite2->ID); - $sc = SiteConfig::current_site_config(); - $sc->Title = 'Subsite2'; - $sc->write(); - - Subsite::changeSubsite(0); - $this->assertEquals(SiteConfig::current_site_config()->Title, 'RootSite'); - Subsite::changeSubsite($subsite1->ID); - $this->assertEquals(SiteConfig::current_site_config()->Title, 'Subsite1'); - Subsite::changeSubsite($subsite2->ID); - $this->assertEquals(SiteConfig::current_site_config()->Title, 'Subsite2'); - - $keys = SiteConfig::current_site_config()->extend('cacheKeyComponent'); - $this->assertContains('subsite-' . $subsite2->ID, $keys); - } + $this->assertTrue(is_array(singleton('SiteConfigSubsites')->extraStatics())); + + Subsite::changeSubsite(0); + $sc = SiteConfig::current_site_config(); + $sc->Title = 'RootSite'; + $sc->write(); + + Subsite::changeSubsite($subsite1->ID); + $sc = SiteConfig::current_site_config(); + $sc->Title = 'Subsite1'; + $sc->write(); + + Subsite::changeSubsite($subsite2->ID); + $sc = SiteConfig::current_site_config(); + $sc->Title = 'Subsite2'; + $sc->write(); + + Subsite::changeSubsite(0); + $this->assertEquals(SiteConfig::current_site_config()->Title, 'RootSite'); + Subsite::changeSubsite($subsite1->ID); + $this->assertEquals(SiteConfig::current_site_config()->Title, 'Subsite1'); + Subsite::changeSubsite($subsite2->ID); + $this->assertEquals(SiteConfig::current_site_config()->Title, 'Subsite2'); + $keys = SiteConfig::current_site_config()->extend('cacheKeyComponent'); + $this->assertContains('subsite-' . $subsite2->ID, $keys); + } } diff --git a/tests/SiteTreeSubsitesTest.php b/tests/SiteTreeSubsitesTest.php index 1ea8202..f5edef4 100644 --- a/tests/SiteTreeSubsitesTest.php +++ b/tests/SiteTreeSubsitesTest.php @@ -1,203 +1,213 @@ array('Translatable') + ); + + public 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' + ); + } + + public function testBasicSanity() + { + $this->assertTrue(singleton('SiteTree')->getSiteConfig() instanceof SiteConfig); + // The following assert is breaking in Translatable. + $this->assertTrue(singleton('SiteTree')->getCMSFields() instanceof FieldList); + $this->assertTrue(singleton('SubsitesVirtualPage')->getCMSFields() instanceof FieldList); + $this->assertTrue(is_array(singleton('SiteTreeSubsites')->extraStatics())); + } + + public function testErrorPageLocations() + { + $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); + + Subsite::changeSubsite($subsite1->ID); + $path = ErrorPage::get_filepath_for_errorcode(500); + + $static_path = Config::inst()->get('ErrorPage', 'static_filepath'); + $expected_path = $static_path . '/error-500-'.$subsite1->domain().'.html'; + $this->assertEquals($expected_path, $path); + } + + public function testCanEditSiteTree() + { + $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( + $mainpage->canEdit(), + 'Members cant edit pages on the main site if they are not in a group allowing this' + ); + } + + /** + * Similar to {@link SubsitesVirtualPageTest->testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite()}. + */ + public function testTwoPagesWithSameURLOnDifferentSubsites() + { + // 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; + $p1->write(); - protected $illegalExtensions = array( - '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); - // The following assert is breaking in Translatable. - $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 = ErrorPage::get_filepath_for_errorcode(500); - - $static_path = Config::inst()->get('ErrorPage', 'static_filepath'); - $expected_path = $static_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'); - $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( - $mainpage->canEdit(), - 'Members cant edit pages on the main site if they are not in a group allowing this' - ); - } - - /** - * Similar to {@link SubsitesVirtualPageTest->testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite()}. - */ - function testTwoPagesWithSameURLOnDifferentSubsites() { - // 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; - $p1->write(); + $p2 = new SiteTree(); + $p2->Title = $p1->URLSegment = "test-page"; + $p2->SubsiteID = $s2->ID; + $p2->write(); - $p2 = new SiteTree(); - $p2->Title = $p1->URLSegment = "test-page"; - $p2->SubsiteID = $s2->ID; - $p2->write(); + // 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); - // 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); + Subsite::changeSubsite($s2); + $this->assertEquals($p2->ID, SiteTree::get_by_link('test-page')->ID); + } + + public function testPageTypesBlacklistInClassDropdown() + { + $editor = $this->objFromFixture('Member', 'editor'); + Session::set("loggedInAs", $editor->ID); + + $s1 = $this->objFromFixture('Subsite', 'domaintest1'); + $s2 = $this->objFromFixture('Subsite', 'domaintest2'); + $page = singleton('SiteTree'); + + $s1->PageTypeBlacklist = 'SiteTreeSubsitesTest_ClassA,ErrorPage'; + $s1->write(); + + Subsite::changeSubsite($s1); + $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); + + $this->assertArrayNotHasKey('ErrorPage', + $settingsFields + ); + $this->assertArrayNotHasKey('SiteTreeSubsitesTest_ClassA', + $settingsFields + ); + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', + $settingsFields + ); - Subsite::changeSubsite($s2); - $this->assertEquals($p2->ID, SiteTree::get_by_link('test-page')->ID); - } - - function testPageTypesBlacklistInClassDropdown() { - $editor = $this->objFromFixture('Member', 'editor'); - Session::set("loggedInAs", $editor->ID); - - $s1 = $this->objFromFixture('Subsite','domaintest1'); - $s2 = $this->objFromFixture('Subsite','domaintest2'); - $page = singleton('SiteTree'); - - $s1->PageTypeBlacklist = 'SiteTreeSubsitesTest_ClassA,ErrorPage'; - $s1->write(); - - Subsite::changeSubsite($s1); - $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); - - $this->assertArrayNotHasKey('ErrorPage', - $settingsFields - ); - $this->assertArrayNotHasKey('SiteTreeSubsitesTest_ClassA', - $settingsFields - ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', - $settingsFields - ); + Subsite::changeSubsite($s2); + $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); + $this->assertArrayHasKey('ErrorPage', + $settingsFields + ); + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassA', + $settingsFields + ); + $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', + $settingsFields + ); + } + + public function testPageTypesBlacklistInCMSMain() + { + $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($s2); - $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); - $this->assertArrayHasKey('ErrorPage', - $settingsFields - ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassA', - $settingsFields - ); - $this->assertArrayHasKey('SiteTreeSubsitesTest_ClassB', - $settingsFields - ); - } - - function testPageTypesBlacklistInCMSMain() { - $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('ErrorPage', $classes); + $this->assertContains('SiteTreeSubsitesTest_ClassA', $classes); + $this->assertNotContains('SiteTreeSubsitesTest_ClassB', $classes); - Subsite::changeSubsite($s1); - $hints = Convert::json2array($cmsmain->SiteTreeHints()); - $classes = $hints['Root']['disallowedChildren']; - $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('ErrorPage', $classes); - $this->assertNotContains('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('SiteTreeSubsitesTest_ClassA', $classes); + $this->assertNotContains('SiteTreeSubsitesTest_ClassB', $classes); + } } -class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly {} +class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly +{ +} -class SiteTreeSubsitesTest_ClassB extends SiteTree implements TestOnly {} +class SiteTreeSubsitesTest_ClassB extends SiteTree implements TestOnly +{ +} diff --git a/tests/SubsiteAdminFunctionalTest.php b/tests/SubsiteAdminFunctionalTest.php index 02f393f..16c626d 100644 --- a/tests/SubsiteAdminFunctionalTest.php +++ b/tests/SubsiteAdminFunctionalTest.php @@ -1,143 +1,150 @@ get($url); - while ($location = $response->getHeader('Location')) { - $response = $this->mainSession->followRedirection(); - } - echo $response->getHeader('Location'); + /** + * Helper: FunctionalTest is only able to follow redirection once, we want to go all the way. + */ + public function getAndFollowAll($url) + { + $response = $this->get($url); + while ($location = $response->getHeader('Location')) { + $response = $this->mainSession->followRedirection(); + } + echo $response->getHeader('Location'); - return $response; - } + return $response; + } - /** - * Anonymous user cannot access anything. - */ - function testAnonymousIsForbiddenAdminAccess() { - $response = $this->getAndFollowAll('admin/pages/?SubsiteID=0'); - $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed'); + /** + * Anonymous user cannot access anything. + */ + public function testAnonymousIsForbiddenAdminAccess() + { + $response = $this->getAndFollowAll('admin/pages/?SubsiteID=0'); + $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed'); - $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - $response = $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); - $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed'); + $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); + $response = $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); + $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed'); - $response = $this->getAndFollowAll('SubsiteXHRController'); - $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), - 'SubsiteXHRController is disallowed'); - } + $response = $this->getAndFollowAll('SubsiteXHRController'); + $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), + 'SubsiteXHRController is disallowed'); + } - /** - * Admin should be able to access all subsites and the main site - */ - function testAdminCanAccessAllSubsites() { - $member = $this->objFromFixture('Member', 'admin'); - Session::set("loggedInAs", $member->ID); - - $this->getAndFollowAll('admin/pages/?SubsiteID=0'); - $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); - $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); + /** + * Admin should be able to access all subsites and the main site + */ + public function testAdminCanAccessAllSubsites() + { + $member = $this->objFromFixture('Member', 'admin'); + Session::set("loggedInAs", $member->ID); + + $this->getAndFollowAll('admin/pages/?SubsiteID=0'); + $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); + $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); - $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access other subsite.'); - $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); + $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); + $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access other subsite.'); + $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); - $response = $this->getAndFollowAll('SubsiteXHRController'); - $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), - 'SubsiteXHRController is reachable'); - } + $response = $this->getAndFollowAll('SubsiteXHRController'); + $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), + 'SubsiteXHRController is reachable'); + } - function testAdminIsRedirectedToObjectsSubsite() { - $member = $this->objFromFixture('Member', 'admin'); - Session::set("loggedInAs", $member->ID); - - $mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage'); - $subsite1Home = $this->objFromFixture('Page', 'subsite1_home'); + public function testAdminIsRedirectedToObjectsSubsite() + { + $member = $this->objFromFixture('Member', 'admin'); + Session::set("loggedInAs", $member->ID); + + $mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage'); + $subsite1Home = $this->objFromFixture('Page', 'subsite1_home'); - Config::inst()->nest(); + Config::inst()->nest(); - 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('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); - 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'); - $this->assertRegExp("#^admin/pages.*#", $this->mainSession->lastUrl(), 'Lands on the correct section'); + 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'); + $this->assertRegExp("#^admin/pages.*#", $this->mainSession->lastUrl(), 'Lands on the correct section'); - $this->getAndFollowAll("admin/pages/edit/show/$mainSubsitePage->ID"); - $this->assertNotEquals(Subsite::currentSubsiteID(), $mainSubsitePage->SubsiteID, 'Loading a main-site object does not change the subsite if configured with treats_subsite_0_as_global'); - $this->assertRegExp("#^admin/pages.*#", $this->mainSession->lastUrl(), 'Lands on the correct section'); + $this->getAndFollowAll("admin/pages/edit/show/$mainSubsitePage->ID"); + $this->assertNotEquals(Subsite::currentSubsiteID(), $mainSubsitePage->SubsiteID, 'Loading a main-site object does not change the subsite if configured with treats_subsite_0_as_global'); + $this->assertRegExp("#^admin/pages.*#", $this->mainSession->lastUrl(), 'Lands on the correct section'); - Config::inst()->unnest(); - } + Config::inst()->unnest(); + } - /** - * User which has AccessAllSubsites set to 1 should be able to access all subsites and main site, - * even though he does not have the ADMIN permission. - */ - function testEditorCanAccessAllSubsites() { - $member = $this->objFromFixture('Member', 'editor'); - Session::set("loggedInAs", $member->ID); + /** + * User which has AccessAllSubsites set to 1 should be able to access all subsites and main site, + * even though he does not have the ADMIN permission. + */ + public function testEditorCanAccessAllSubsites() + { + $member = $this->objFromFixture('Member', 'editor'); + Session::set("loggedInAs", $member->ID); - $this->getAndFollowAll('admin/pages/?SubsiteID=0'); - $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); - $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); + $this->getAndFollowAll('admin/pages/?SubsiteID=0'); + $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); + $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); - $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access other subsite.'); - $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); + $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); + $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access other subsite.'); + $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); - $response = $this->getAndFollowAll('SubsiteXHRController'); - $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), - 'SubsiteXHRController is reachable'); - } + $response = $this->getAndFollowAll('SubsiteXHRController'); + $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), + 'SubsiteXHRController is reachable'); + } - /** - * 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'); - Session::set("loggedInAs", $member->ID); + /** + * Test a member who only has access to one subsite (subsite1) and only some sections (pages and security). + */ + public function testSubsiteAdmin() + { + $member = $this->objFromFixture('Member', 'subsite1member'); + Session::set("loggedInAs", $member->ID); - $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); + $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - // Check allowed URL. - $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access own subsite.'); - $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Can access permitted section.'); + // Check allowed URL. + $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Can access own subsite.'); + $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Can access permitted section.'); - // Check forbidden section in allowed subsite. - $this->getAndFollowAll("admin/assets/?SubsiteID={$subsite1->ID}"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected within subsite.'); - $this->assertNotRegExp('#^admin/assets/.*#', $this->mainSession->lastUrl(), - 'Is redirected away from forbidden section'); + // Check forbidden section in allowed subsite. + $this->getAndFollowAll("admin/assets/?SubsiteID={$subsite1->ID}"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected within subsite.'); + $this->assertNotRegExp('#^admin/assets/.*#', $this->mainSession->lastUrl(), + 'Is redirected away from forbidden section'); - // Check forbidden site, on a section that's allowed on another subsite - $this->getAndFollowAll("admin/pages/?SubsiteID=0"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to permitted subsite.'); + // Check forbidden site, on a section that's allowed on another subsite + $this->getAndFollowAll("admin/pages/?SubsiteID=0"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to permitted subsite.'); - // Check forbidden site, on a section that's not allowed on any other subsite - $this->getAndFollowAll("admin/assets/?SubsiteID=0"); - $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to first permitted subsite.'); - $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Is not denied access'); + // Check forbidden site, on a section that's not allowed on any other subsite + $this->getAndFollowAll("admin/assets/?SubsiteID=0"); + $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected to first permitted subsite.'); + $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Is not denied access'); - // Check the standalone XHR controller. - $response = $this->getAndFollowAll('SubsiteXHRController'); - $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), - 'SubsiteXHRController is reachable'); - } + // Check the standalone XHR controller. + $response = $this->getAndFollowAll('SubsiteXHRController'); + $this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), + 'SubsiteXHRController is reachable'); + } } diff --git a/tests/SubsiteAdminTest.php b/tests/SubsiteAdminTest.php index 3b9fb0f..a9f29d0 100644 --- a/tests/SubsiteAdminTest.php +++ b/tests/SubsiteAdminTest.php @@ -1,9 +1,11 @@ $this->idFromFixture('Member', 'admin') )); @@ -12,39 +14,38 @@ class SubsiteAdminTest extends BaseSubsiteTest { /** * Test generation of the view */ - function testBasicView() { - Subsite::$write_hostmap = false; - $subsite1ID = $this->objFromFixture('Subsite','domaintest1')->ID; + public function testBasicView() + { + Subsite::$write_hostmap = false; + $subsite1ID = $this->objFromFixture('Subsite', 'domaintest1')->ID; // Open the admin area logged in as admin $response1 = Director::test('admin/subsites/', null, $this->adminLoggedInSession()); // Confirm that this URL gets you the entire page, with the edit form loaded - $response2 = Director::test("admin/subsites/Subsite/EditForm/field/Subsite/item/$subsite1ID/edit", null, $this->adminLoggedInSession()); - $this->assertTrue(strpos($response2->getBody(), 'id="Form_ItemEditForm_ID"') !== false, "Testing Form_ItemEditForm_ID exists"); + $response2 = Director::test("admin/subsites/Subsite/EditForm/field/Subsite/item/$subsite1ID/edit", null, $this->adminLoggedInSession()); + $this->assertTrue(strpos($response2->getBody(), 'id="Form_ItemEditForm_ID"') !== false, "Testing Form_ItemEditForm_ID exists"); $this->assertTrue(strpos($response2->getBody(), ' exists"); } - - /** - * Test that the main-site user with ADMIN permissions can access all subsites, regardless - * of whether he is in a subsite-specific group or not. - */ - function testMainsiteAdminCanAccessAllSubsites() { - $member = $this->objFromFixture('Member', 'admin'); - Session::set("loggedInAs", $member->ID); - - $cmsMain = new CMSMain(); - foreach($cmsMain->Subsites() as $subsite) { - $ids[$subsite->ID] = true; - } + + /** + * Test that the main-site user with ADMIN permissions can access all subsites, regardless + * of whether he is in a subsite-specific group or not. + */ + public function testMainsiteAdminCanAccessAllSubsites() + { + $member = $this->objFromFixture('Member', 'admin'); + Session::set("loggedInAs", $member->ID); + + $cmsMain = new CMSMain(); + foreach ($cmsMain->Subsites() as $subsite) { + $ids[$subsite->ID] = true; + } - $this->assertArrayHasKey(0, $ids, "Main site accessible"); - $this->assertArrayHasKey($this->idFromFixture('Subsite','main'), $ids, "Site with no groups inaccesible"); - $this->assertArrayHasKey($this->idFromFixture('Subsite','subsite1'), $ids, "Subsite1 Template inaccessible"); - $this->assertArrayHasKey($this->idFromFixture('Subsite','subsite2'), $ids, "Subsite2 Template inaccessible"); - } - - + $this->assertArrayHasKey(0, $ids, "Main site accessible"); + $this->assertArrayHasKey($this->idFromFixture('Subsite', 'main'), $ids, "Site with no groups inaccesible"); + $this->assertArrayHasKey($this->idFromFixture('Subsite', 'subsite1'), $ids, "Subsite1 Template inaccessible"); + $this->assertArrayHasKey($this->idFromFixture('Subsite', 'subsite2'), $ids, "Subsite2 Template inaccessible"); + } } - diff --git a/tests/SubsiteTest.php b/tests/SubsiteTest.php index 16ee493..fd128e9 100644 --- a/tests/SubsiteTest.php +++ b/tests/SubsiteTest.php @@ -1,362 +1,380 @@ origStrictSubdomainMatching = Subsite::$strict_subdomain_matching; + Subsite::$strict_subdomain_matching = false; + } + + public function tearDown() + { + parent::tearDown(); + + Subsite::$strict_subdomain_matching = $this->origStrictSubdomainMatching; + } - static $fixture_file = 'subsites/tests/SubsiteTest.yml'; - - function setUp() { - parent::setUp(); - - $this->origStrictSubdomainMatching = Subsite::$strict_subdomain_matching; - Subsite::$strict_subdomain_matching = false; - } - - function tearDown() { - parent::tearDown(); - - Subsite::$strict_subdomain_matching = $this->origStrictSubdomainMatching; - } + /** + * Create a new subsite from the template and verify that all the template's pages are copied + */ + public function testSubsiteCreation() + { + Subsite::$write_hostmap = false; + + // Create the instance + $template = $this->objFromFixture('Subsite', 'main'); + + // Test that changeSubsite is working + Subsite::changeSubsite($template->ID); + $tmplStaff = $this->objFromFixture('Page', 'staff'); + $tmplHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'"); + + // Publish all the pages in the template, testing that DataObject::get only returns pages from the chosen subsite + $pages = DataObject::get("SiteTree"); + $totalPages = $pages->Count(); + foreach ($pages as $page) { + $this->assertEquals($template->ID, $page->SubsiteID); + $page->publish('Stage', 'Live'); + } - /** - * Create a new subsite from the template and verify that all the template's pages are copied - */ - function testSubsiteCreation() { - Subsite::$write_hostmap = false; - - // Create the instance - $template = $this->objFromFixture('Subsite', 'main'); - - // Test that changeSubsite is working - Subsite::changeSubsite($template->ID); - $tmplStaff = $this->objFromFixture('Page','staff'); - $tmplHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'"); - - // Publish all the pages in the template, testing that DataObject::get only returns pages from the chosen subsite - $pages = DataObject::get("SiteTree"); - $totalPages = $pages->Count(); - foreach($pages as $page) { - $this->assertEquals($template->ID, $page->SubsiteID); - $page->publish('Stage', 'Live'); - } + // Create a new site + $subsite = $template->duplicate(); + + // Check title + $this->assertEquals($subsite->Title, $template->Title); + + // Another test that changeSubsite is working + $subsite->activate(); + + $siteHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'"); + $this->assertNotEquals($siteHome, false, 'Home Page for subsite not found'); + $this->assertEquals($subsite->ID, $siteHome->SubsiteID, + 'createInstance() copies existing pages retaining the same URLSegment' + ); + + Subsite::changeSubsite(0); + } + + /** + * Confirm that domain lookup is working + */ + public function testDomainLookup() + { + // Clear existing fixtures + foreach (DataObject::get('Subsite') as $subsite) { + $subsite->delete(); + } + foreach (DataObject::get('SubsiteDomain') as $domain) { + $domain->delete(); + } + + // Much more expressive than YML in this case + $subsite1 = $this->createSubsiteWithDomains(array( + 'one.example.org' => true, + 'one.*' => false, + )); + $subsite2 = $this->createSubsiteWithDomains(array( + 'two.mysite.com' => true, + '*.mysite.com' => false, + 'subdomain.onmultiplesubsites.com' => false, + )); + $subsite3 = $this->createSubsiteWithDomains(array( + 'three.*' => true, // wildcards in primary domain are not recommended + 'subdomain.unique.com' => false, + '*.onmultiplesubsites.com' => false, + )); + + $this->assertEquals( + $subsite3->ID, + Subsite::getSubsiteIDForDomain('subdomain.unique.com'), + 'Full unique match' + ); + + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('one.example.org'), + 'Full match, doesn\'t complain about multiple matches within a single subsite' + ); + + $failed = false; + try { + Subsite::getSubsiteIDForDomain('subdomain.onmultiplesubsites.com'); + } catch (UnexpectedValueException $e) { + $failed = true; + } + $this->assertTrue( + $failed, + 'Fails on multiple matches with wildcard vs. www across multiple subsites' + ); + + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('one.unique.com'), + 'Fuzzy match suffixed with wildcard (rule "one.*")' + ); + + $this->assertEquals( + $subsite2->ID, + Subsite::getSubsiteIDForDomain('two.mysite.com'), + 'Matches correct subsite for rule' + ); + + $this->assertEquals( + $subsite2->ID, + Subsite::getSubsiteIDForDomain('other.mysite.com'), + 'Fuzzy match prefixed with wildcard (rule "*.mysite.com")' + ); - // Create a new site - $subsite = $template->duplicate(); - - // Check title - $this->assertEquals($subsite->Title, $template->Title); - - // Another test that changeSubsite is working - $subsite->activate(); - - $siteHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'"); - $this->assertNotEquals($siteHome, false, 'Home Page for subsite not found'); - $this->assertEquals($subsite->ID, $siteHome->SubsiteID, - 'createInstance() copies existing pages retaining the same URLSegment' - ); - - Subsite::changeSubsite(0); - } - - /** - * Confirm that domain lookup is working - */ - function testDomainLookup() { - // Clear existing fixtures - foreach(DataObject::get('Subsite') as $subsite) $subsite->delete(); - foreach(DataObject::get('SubsiteDomain') as $domain) $domain->delete(); - - // Much more expressive than YML in this case - $subsite1 = $this->createSubsiteWithDomains(array( - 'one.example.org' => true, - 'one.*' => false, - )); - $subsite2 = $this->createSubsiteWithDomains(array( - 'two.mysite.com' => true, - '*.mysite.com' => false, - 'subdomain.onmultiplesubsites.com' => false, - )); - $subsite3 = $this->createSubsiteWithDomains(array( - 'three.*' => true, // wildcards in primary domain are not recommended - 'subdomain.unique.com' => false, - '*.onmultiplesubsites.com' => false, - )); - - $this->assertEquals( - $subsite3->ID, - Subsite::getSubsiteIDForDomain('subdomain.unique.com'), - 'Full unique match' - ); - - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('one.example.org'), - 'Full match, doesn\'t complain about multiple matches within a single subsite' - ); - - $failed = false; - try { - Subsite::getSubsiteIDForDomain('subdomain.onmultiplesubsites.com'); - } catch(UnexpectedValueException $e) { - $failed = true; - } - $this->assertTrue( - $failed, - 'Fails on multiple matches with wildcard vs. www across multiple subsites' - ); - - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('one.unique.com'), - 'Fuzzy match suffixed with wildcard (rule "one.*")' - ); - - $this->assertEquals( - $subsite2->ID, - Subsite::getSubsiteIDForDomain('two.mysite.com'), - 'Matches correct subsite for rule' - ); - - $this->assertEquals( - $subsite2->ID, - Subsite::getSubsiteIDForDomain('other.mysite.com'), - 'Fuzzy match prefixed with wildcard (rule "*.mysite.com")' - ); + $this->assertEquals( + 0, + Subsite::getSubsiteIDForDomain('unknown.madeup.com'), + "Doesn't match unknown subsite" + ); + } + + public function testStrictSubdomainMatching() + { + // Clear existing fixtures + foreach (DataObject::get('Subsite') as $subsite) { + $subsite->delete(); + } + foreach (DataObject::get('SubsiteDomain') as $domain) { + $domain->delete(); + } + + // Much more expressive than YML in this case + $subsite1 = $this->createSubsiteWithDomains(array( + 'example.org' => true, + 'example.com' => false, + '*.wildcard.com' => false, + )); + $subsite2 = $this->createSubsiteWithDomains(array( + 'www.example.org' => true, + 'www.wildcard.com' => false, + )); - $this->assertEquals( - 0, - Subsite::getSubsiteIDForDomain('unknown.madeup.com'), - "Doesn't match unknown subsite" - ); - - } - - function testStrictSubdomainMatching() { - // Clear existing fixtures - foreach(DataObject::get('Subsite') as $subsite) $subsite->delete(); - foreach(DataObject::get('SubsiteDomain') as $domain) $domain->delete(); - - // Much more expressive than YML in this case - $subsite1 = $this->createSubsiteWithDomains(array( - 'example.org' => true, - 'example.com' => false, - '*.wildcard.com' => false, - )); - $subsite2 = $this->createSubsiteWithDomains(array( - 'www.example.org' => true, - 'www.wildcard.com' => false, - )); + Subsite::$strict_subdomain_matching = false; + + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('example.org'), + 'Exact matches without strict checking when not using www prefix' + ); + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('www.example.org'), + 'Matches without strict checking when using www prefix, still matching first domain regardless of www prefix (falling back to subsite primary key ordering)' + ); + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('www.example.com'), + 'Fuzzy matches without strict checking with www prefix' + ); + $this->assertEquals( + 0, + Subsite::getSubsiteIDForDomain('www.wildcard.com'), + 'Doesn\'t match www prefix without strict check, even if a wildcard subdomain is in place' + ); + + Subsite::$strict_subdomain_matching = true; + + $this->assertEquals( + $subsite1->ID, + Subsite::getSubsiteIDForDomain('example.org'), + 'Matches with strict checking when not using www prefix' + ); + $this->assertEquals( + $subsite2->ID, // not 1 + Subsite::getSubsiteIDForDomain('www.example.org'), + 'Matches with strict checking when using www prefix' + ); + $this->assertEquals( + 0, + Subsite::getSubsiteIDForDomain('www.example.com'), + 'Doesn\'t fuzzy match with strict checking when using www prefix' + ); + $failed = false; + try { + Subsite::getSubsiteIDForDomain('www.wildcard.com'); + } catch (UnexpectedValueException $e) { + $failed = true; + } + $this->assertTrue( + $failed, + 'Fails on multiple matches with strict checking and wildcard vs. www' + ); + } + + protected function createSubsiteWithDomains($domains) + { + $subsite = new Subsite(array( + 'Title' => 'My Subsite' + )); + $subsite->write(); + foreach ($domains as $domainStr => $isPrimary) { + $domain = new SubsiteDomain(array( + 'Domain' => $domainStr, + 'IsPrimary' => $isPrimary, + 'SubsiteID' => $subsite->ID + )); + $domain->write(); + } + + return $subsite; + } - Subsite::$strict_subdomain_matching = false; - - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('example.org'), - 'Exact matches without strict checking when not using www prefix' - ); - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('www.example.org'), - 'Matches without strict checking when using www prefix, still matching first domain regardless of www prefix (falling back to subsite primary key ordering)' - ); - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('www.example.com'), - 'Fuzzy matches without strict checking with www prefix' - ); - $this->assertEquals( - 0, - Subsite::getSubsiteIDForDomain('www.wildcard.com'), - 'Doesn\'t match www prefix without strict check, even if a wildcard subdomain is in place' - ); - - Subsite::$strict_subdomain_matching = true; - - $this->assertEquals( - $subsite1->ID, - Subsite::getSubsiteIDForDomain('example.org'), - 'Matches with strict checking when not using www prefix' - ); - $this->assertEquals( - $subsite2->ID, // not 1 - Subsite::getSubsiteIDForDomain('www.example.org'), - 'Matches with strict checking when using www prefix' - ); - $this->assertEquals( - 0, - Subsite::getSubsiteIDForDomain('www.example.com'), - 'Doesn\'t fuzzy match with strict checking when using www prefix' - ); - $failed = false; - try { - Subsite::getSubsiteIDForDomain('www.wildcard.com'); - } catch(UnexpectedValueException $e) { - $failed = true; - } - $this->assertTrue( - $failed, - 'Fails on multiple matches with strict checking and wildcard vs. www' - ); - - } - - protected function createSubsiteWithDomains($domains) { - $subsite = new Subsite(array( - 'Title' => 'My Subsite' - )); - $subsite->write(); - foreach($domains as $domainStr => $isPrimary) { - $domain = new SubsiteDomain(array( - 'Domain' => $domainStr, - 'IsPrimary' => $isPrimary, - 'SubsiteID' => $subsite->ID - )); - $domain->write(); - } - - return $subsite; - } + /** + * Test the Subsite->domain() method + */ + public function testDefaultDomain() + { + $this->assertEquals('one.example.org', + $this->objFromFixture('Subsite', 'domaintest1')->domain()); - /** - * Test the Subsite->domain() method - */ - function testDefaultDomain() { - $this->assertEquals('one.example.org', - $this->objFromFixture('Subsite','domaintest1')->domain()); + $this->assertEquals('two.mysite.com', + $this->objFromFixture('Subsite', 'domaintest2')->domain()); + + $originalHTTPHost = $_SERVER['HTTP_HOST']; + + $_SERVER['HTTP_HOST'] = "www.example.org"; + $this->assertEquals('three.example.org', + $this->objFromFixture('Subsite', 'domaintest3')->domain()); - $this->assertEquals('two.mysite.com', - $this->objFromFixture('Subsite','domaintest2')->domain()); - - $originalHTTPHost = $_SERVER['HTTP_HOST']; - - $_SERVER['HTTP_HOST'] = "www.example.org"; - $this->assertEquals('three.example.org', - $this->objFromFixture('Subsite','domaintest3')->domain()); + $_SERVER['HTTP_HOST'] = "mysite.example.org"; + $this->assertEquals('three.mysite.example.org', + $this->objFromFixture('Subsite', 'domaintest3')->domain()); - $_SERVER['HTTP_HOST'] = "mysite.example.org"; - $this->assertEquals('three.mysite.example.org', - $this->objFromFixture('Subsite','domaintest3')->domain()); + $this->assertEquals($_SERVER['HTTP_HOST'], singleton('Subsite')->PrimaryDomain); + $this->assertEquals('http://'.$_SERVER['HTTP_HOST'].Director::baseURL(), singleton('Subsite')->absoluteBaseURL()); - $this->assertEquals($_SERVER['HTTP_HOST'], singleton('Subsite')->PrimaryDomain); - $this->assertEquals('http://'.$_SERVER['HTTP_HOST'].Director::baseURL(), singleton('Subsite')->absoluteBaseURL()); + $_SERVER['HTTP_HOST'] = $originalHTTPHost; + } - $_SERVER['HTTP_HOST'] = $originalHTTPHost; - } + public function testAllSites() + { + $subsites = Subsite::all_sites(); + $this->assertDOSEquals(array( + array('Title' =>'Main site'), + array('Title' =>'Template'), + array('Title' =>'Subsite1 Template'), + array('Title' =>'Subsite2 Template'), + array('Title' =>'Test 1'), + array('Title' =>'Test 2'), + array('Title' =>'Test 3') + ), $subsites, 'Lists all subsites'); + } - function testAllSites() { - $subsites = Subsite::all_sites(); - $this->assertDOSEquals(array( - array('Title' =>'Main site'), - array('Title' =>'Template'), - array('Title' =>'Subsite1 Template'), - array('Title' =>'Subsite2 Template'), - array('Title' =>'Test 1'), - array('Title' =>'Test 2'), - array('Title' =>'Test 3') - ), $subsites, 'Lists all subsites'); - } + public function testAllAccessibleSites() + { + $member = $this->objFromFixture('Member', 'subsite1member'); - function testAllAccessibleSites() { - $member = $this->objFromFixture('Member', 'subsite1member'); + $subsites = Subsite::all_accessible_sites(true, 'Main site', $member); + $this->assertDOSEquals(array( + array('Title' =>'Subsite1 Template') + ), $subsites, 'Lists member-accessible sites.'); + } - $subsites = Subsite::all_accessible_sites(true, 'Main site', $member); - $this->assertDOSEquals(array( - array('Title' =>'Subsite1 Template') - ), $subsites, 'Lists member-accessible sites.'); - } + /** + * Test Subsite::accessible_sites() + */ + public function testAccessibleSites() + { + $member1Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, + $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'); - /** - * Test Subsite::accessible_sites() - */ - function testAccessibleSites() { - $member1Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $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('Member', 'admin')); + $adminSiteTitles = $adminSites->column("Title"); + sort($adminSiteTitles); + $this->assertEquals(array( + 'Subsite1 Template', + 'Subsite2 Template', + 'Template', + 'Test 1', + 'Test 2', + 'Test 3', + ), $adminSiteTitles); - $adminSites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('Member', 'admin')); - $adminSiteTitles = $adminSites->column("Title"); - sort($adminSiteTitles); - $this->assertEquals(array( - 'Subsite1 Template', - 'Subsite2 Template', - 'Template', - 'Test 1', - 'Test 2', - 'Test 3', - ), $adminSiteTitles); + $member2Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, + $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'); + } + + public function testhasMainSitePermission() + { + $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), + 'Default permissions granted for super-admin' + ); + $this->assertTrue( + Subsite::hasMainSitePermission($admin, array("ADMIN")), + 'ADMIN permissions granted for super-admin' + ); + $this->assertFalse( + Subsite::hasMainSitePermission($subsite1admin, array("ADMIN")), + 'ADMIN permissions (on main site) denied for subsite1 admin' + ); + $this->assertFalse( + Subsite::hasMainSitePermission($subsite1admin, array("CMS_ACCESS_CMSMain")), + 'CMS_ACCESS_CMSMain (on main site) denied for subsite1 admin' + ); + $this->assertFalse( + Subsite::hasMainSitePermission($allsubsitesauthor, array("ADMIN")), + 'ADMIN permissions (on main site) denied for CMS author with edit rights on all subsites' + ); + $this->assertTrue( + Subsite::hasMainSitePermission($allsubsitesauthor, array("CMS_ACCESS_CMSMain")), + 'CMS_ACCESS_CMSMain (on main site) granted for CMS author with edit rights on all subsites' + ); + $this->assertFalse( + Subsite::hasMainSitePermission($subsite1member, array("ADMIN")), + 'ADMIN (on main site) denied for subsite1 subsite1 cms author' + ); + $this->assertFalse( + Subsite::hasMainSitePermission($subsite1member, array("CMS_ACCESS_CMSMain")), + 'CMS_ACCESS_CMSMain (on main site) denied for subsite1 cms author' + ); + } - $member2Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $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('Member', 'admin'); - $subsite1member = $this->objFromFixture('Member', 'subsite1member'); - $subsite1admin = $this->objFromFixture('Member', 'subsite1admin'); - $allsubsitesauthor = $this->objFromFixture('Member', 'allsubsitesauthor'); - - $this->assertTrue( - Subsite::hasMainSitePermission($admin), - 'Default permissions granted for super-admin' - ); - $this->assertTrue( - Subsite::hasMainSitePermission($admin, array("ADMIN")), - 'ADMIN permissions granted for super-admin' - ); - $this->assertFalse( - Subsite::hasMainSitePermission($subsite1admin, array("ADMIN")), - 'ADMIN permissions (on main site) denied for subsite1 admin' - ); - $this->assertFalse( - Subsite::hasMainSitePermission($subsite1admin, array("CMS_ACCESS_CMSMain")), - 'CMS_ACCESS_CMSMain (on main site) denied for subsite1 admin' - ); - $this->assertFalse( - Subsite::hasMainSitePermission($allsubsitesauthor, array("ADMIN")), - 'ADMIN permissions (on main site) denied for CMS author with edit rights on all subsites' - ); - $this->assertTrue( - Subsite::hasMainSitePermission($allsubsitesauthor, array("CMS_ACCESS_CMSMain")), - 'CMS_ACCESS_CMSMain (on main site) granted for CMS author with edit rights on all subsites' - ); - $this->assertFalse( - Subsite::hasMainSitePermission($subsite1member, array("ADMIN")), - 'ADMIN (on main site) denied for subsite1 subsite1 cms author' - ); - $this->assertFalse( - Subsite::hasMainSitePermission($subsite1member, array("CMS_ACCESS_CMSMain")), - 'CMS_ACCESS_CMSMain (on main site) denied for subsite1 cms author' - ); - } - - function testDuplicateSubsite() { - // get subsite1 & create page - $subsite1 = $this->objFromFixture('Subsite','domaintest1'); - $subsite1->activate(); - $page1 = new Page(); - $page1->Title = 'MyAwesomePage'; - $page1->write(); - $page1->doPublish(); - $this->assertEquals($page1->SubsiteID, $subsite1->ID); - - // duplicate - $subsite2 = $subsite1->duplicate(); - $subsite2->activate(); - // change content on dupe - $page2 = DataObject::get_one('Page', "\"Title\" = 'MyAwesomePage'"); - $page2->Title = 'MyNewAwesomePage'; - $page2->write(); - $page2->doPublish(); - - // check change & check change has not affected subiste1 - $subsite1->activate(); - $this->assertEquals('MyAwesomePage', DataObject::get_by_id('Page', $page1->ID)->Title); - $subsite2->activate(); - $this->assertEquals('MyNewAwesomePage', DataObject::get_by_id('Page', $page2->ID)->Title); - } + public function testDuplicateSubsite() + { + // get subsite1 & create page + $subsite1 = $this->objFromFixture('Subsite', 'domaintest1'); + $subsite1->activate(); + $page1 = new Page(); + $page1->Title = 'MyAwesomePage'; + $page1->write(); + $page1->doPublish(); + $this->assertEquals($page1->SubsiteID, $subsite1->ID); + + // duplicate + $subsite2 = $subsite1->duplicate(); + $subsite2->activate(); + // change content on dupe + $page2 = DataObject::get_one('Page', "\"Title\" = 'MyAwesomePage'"); + $page2->Title = 'MyNewAwesomePage'; + $page2->write(); + $page2->doPublish(); + + // check change & check change has not affected subiste1 + $subsite1->activate(); + $this->assertEquals('MyAwesomePage', DataObject::get_by_id('Page', $page1->ID)->Title); + $subsite2->activate(); + $this->assertEquals('MyNewAwesomePage', DataObject::get_by_id('Page', $page2->ID)->Title); + } } diff --git a/tests/SubsitesVirtualPageTest.php b/tests/SubsitesVirtualPageTest.php index 1822b51..92f289b 100644 --- a/tests/SubsitesVirtualPageTest.php +++ b/tests/SubsitesVirtualPageTest.php @@ -1,276 +1,288 @@ logInWithPermission('ADMIN'); - - $fh = fopen(Director::baseFolder() . '/assets/testscript-test-file.pdf', "w"); - fwrite($fh, str_repeat('x',1000000)); - fclose($fh); - } +class SubsitesVirtualPageTest extends BaseSubsiteTest +{ + public static $fixture_file = array( + 'subsites/tests/SubsiteTest.yml', + 'subsites/tests/SubsitesVirtualPageTest.yml', + ); + + public function setUp() + { + parent::setUp(); + $this->logInWithPermission('ADMIN'); + + $fh = fopen(Director::baseFolder() . '/assets/testscript-test-file.pdf', "w"); + fwrite($fh, str_repeat('x', 1000000)); + fclose($fh); + } - function tearDown() { - parent::tearDown(); - $testFiles = array( - '/assets/testscript-test-file.pdf', - '/assets/renamed-test-file.pdf', - '/assets/renamed-test-file-second-time.pdf', - ); - foreach($testFiles as $file) { - if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file); - } - } - - // Attempt to bring main:linky to subsite2:linky - function testVirtualPageFromAnotherSubsite() { - Subsite::$write_hostmap = false; - - $subsite = $this->objFromFixture('Subsite', 'subsite2'); - - Subsite::changeSubsite($subsite->ID); - Subsite::$disable_subsite_filter = false; - - $linky = $this->objFromFixture('Page', 'linky'); - - $svp = new SubsitesVirtualPage(); - $svp->CopyContentFromID = $linky->ID; - $svp->SubsiteID = $subsite->ID; - $svp->URLSegment = 'linky'; - - $svp->write(); - - $this->assertEquals($svp->SubsiteID, $subsite->ID); - $this->assertEquals($svp->Title, $linky->Title); - } + public function tearDown() + { + parent::tearDown(); + $testFiles = array( + '/assets/testscript-test-file.pdf', + '/assets/renamed-test-file.pdf', + '/assets/renamed-test-file-second-time.pdf', + ); + foreach ($testFiles as $file) { + if (file_exists(Director::baseFolder().$file)) { + unlink(Director::baseFolder().$file); + } + } + } + + // Attempt to bring main:linky to subsite2:linky + public function testVirtualPageFromAnotherSubsite() + { + Subsite::$write_hostmap = false; + + $subsite = $this->objFromFixture('Subsite', 'subsite2'); + + Subsite::changeSubsite($subsite->ID); + Subsite::$disable_subsite_filter = false; + + $linky = $this->objFromFixture('Page', 'linky'); + + $svp = new SubsitesVirtualPage(); + $svp->CopyContentFromID = $linky->ID; + $svp->SubsiteID = $subsite->ID; + $svp->URLSegment = 'linky'; + + $svp->write(); + + $this->assertEquals($svp->SubsiteID, $subsite->ID); + $this->assertEquals($svp->Title, $linky->Title); + } - function testFileLinkRewritingOnVirtualPages() { - // File setup - $this->logInWithPermission('ADMIN'); - touch(Director::baseFolder() . '/assets/testscript-test-file.pdf'); + public function testFileLinkRewritingOnVirtualPages() + { + // File setup + $this->logInWithPermission('ADMIN'); + touch(Director::baseFolder() . '/assets/testscript-test-file.pdf'); - // Publish the source page - $page = $this->objFromFixture('SiteTree', 'page1'); - $this->assertTrue($page->doPublish()); + // Publish the source page + $page = $this->objFromFixture('SiteTree', 'page1'); + $this->assertTrue($page->doPublish()); - // Create a virtual page from it, and publish that - $svp = new SubsitesVirtualPage(); - $svp->CopyContentFromID = $page->ID; - $svp->write(); - $svp->doPublish(); - - // Rename the file - $file = $this->objFromFixture('File', 'file1'); - $file->Name = 'renamed-test-file.pdf'; - $file->write(); - - // Verify that the draft and publish virtual pages both have the corrected link - $this->assertContains('ID")->value()); - $this->assertContains('ID")->value()); + // Create a virtual page from it, and publish that + $svp = new SubsitesVirtualPage(); + $svp->CopyContentFromID = $page->ID; + $svp->write(); + $svp->doPublish(); + + // Rename the file + $file = $this->objFromFixture('File', 'file1'); + $file->Name = 'renamed-test-file.pdf'; + $file->write(); + + // Verify that the draft and publish virtual pages both have the corrected link + $this->assertContains('ID")->value()); + $this->assertContains('ID")->value()); - // File teardown - $testFiles = array( - '/assets/testscript-test-file.pdf', - '/assets/renamed-test-file.pdf', - ); - foreach($testFiles as $file) { - if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file); - } - } + // File teardown + $testFiles = array( + '/assets/testscript-test-file.pdf', + '/assets/renamed-test-file.pdf', + ); + foreach ($testFiles as $file) { + if (file_exists(Director::baseFolder().$file)) { + unlink(Director::baseFolder().$file); + } + } + } - function testSubsiteVirtualPagesArentInappropriatelyPublished() { - // Fixture - $p = new Page(); - $p->Content = "test content"; - $p->write(); - $vp = new SubsitesVirtualPage(); - $vp->CopyContentFromID = $p->ID; - $vp->write(); + public function testSubsiteVirtualPagesArentInappropriatelyPublished() + { + // Fixture + $p = new Page(); + $p->Content = "test content"; + $p->write(); + $vp = new SubsitesVirtualPage(); + $vp->CopyContentFromID = $p->ID; + $vp->write(); - // VP is oragne - $this->assertTrue($vp->IsAddedToStage); + // VP is oragne + $this->assertTrue($vp->IsAddedToStage); - // VP is still orange after we publish - $p->doPublish(); - $this->fixVersionNumberCache($vp); - $this->assertTrue($vp->IsAddedToStage); - - // A new VP created after P's initial construction - $vp2 = new SubsitesVirtualPage(); - $vp2->CopyContentFromID = $p->ID; - $vp2->write(); - $this->assertTrue($vp2->IsAddedToStage); - - // Also remains orange after a republish - $p->Content = "new content"; - $p->write(); - $p->doPublish(); - $this->fixVersionNumberCache($vp2); - $this->assertTrue($vp2->IsAddedToStage); - - // VP is now published - $vp->doPublish(); + // VP is still orange after we publish + $p->doPublish(); + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->IsAddedToStage); + + // A new VP created after P's initial construction + $vp2 = new SubsitesVirtualPage(); + $vp2->CopyContentFromID = $p->ID; + $vp2->write(); + $this->assertTrue($vp2->IsAddedToStage); + + // Also remains orange after a republish + $p->Content = "new content"; + $p->write(); + $p->doPublish(); + $this->fixVersionNumberCache($vp2); + $this->assertTrue($vp2->IsAddedToStage); + + // VP is now published + $vp->doPublish(); - $this->fixVersionNumberCache($vp); - $this->assertTrue($vp->ExistsOnLive); - $this->assertFalse($vp->IsModifiedOnStage); - - // P edited, VP and P both go green - $p->Content = "third content"; - $p->write(); + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->ExistsOnLive); + $this->assertFalse($vp->IsModifiedOnStage); + + // P edited, VP and P both go green + $p->Content = "third content"; + $p->write(); - $this->fixVersionNumberCache($vp, $p); - $this->assertTrue($p->IsModifiedOnStage); - $this->assertTrue($vp->IsModifiedOnStage); + $this->fixVersionNumberCache($vp, $p); + $this->assertTrue($p->IsModifiedOnStage); + $this->assertTrue($vp->IsModifiedOnStage); - // Publish, VP goes black - $p->doPublish(); - $this->fixVersionNumberCache($vp); - $this->assertTrue($vp->ExistsOnLive); - $this->assertFalse($vp->IsModifiedOnStage); - } - - /** - * This test ensures published Subsites Virtual Pages immediately reflect updates - * to their published target pages. Note - this has to happen when the virtual page - * is in a different subsite to the page you are editing and republishing, - * otherwise the test will pass falsely due to current subsite ID being the same. - */ - function testPublishedSubsiteVirtualPagesUpdateIfTargetPageUpdates() - { - // create page - $p = new Page(); - $p->Content = 'Content'; - $p->Title = 'Title'; - $p->writeToStage('Stage'); - $p->publish('Stage', 'Live'); - $this->assertTrue($p->ExistsOnLive); - - // change to subsite - $subsite = $this->objFromFixture('Subsite', 'subsite2'); - Subsite::changeSubsite($subsite->ID); - Subsite::$disable_subsite_filter = false; - - // create svp in subsite - $svp = new SubsitesVirtualPage(); - $svp->CopyContentFromID = $p->ID; - $svp->write(); - $svp->writeToStage('Stage'); - $svp->publish('Stage', 'Live'); - $this->assertEquals($svp->SubsiteID, $subsite->ID); - $this->assertTrue($svp->ExistsOnLive); - - // change back to original subsite ("Main site") - Subsite::changeSubsite(0); - - // update original page - $p->Title = 'New Title'; - // "save & publish" - $p->writeToStage('Stage'); - $p->publish('Stage', 'Live'); - $this->assertNotEquals($p->SubsiteID, $subsite->ID); - - // reload SVP from database - // can't use DO::get by id because caches. - $svpdb = $svp->get()->byID($svp->ID); - - // ensure title changed - $this->assertEquals($svpdb->Title, $p->Title); - } - - function testUnpublishingParentPageUnpublishesSubsiteVirtualPages() { - Config::inst()->update('StaticPublisher', 'disable_realtime', true); - - // Go to main site, get parent page - $subsite = $this->objFromFixture('Subsite', 'main'); - Subsite::changeSubsite($subsite->ID); - $page = $this->objFromFixture('Page', 'importantpage'); - - // Create two SVPs on other subsites - $subsite = $this->objFromFixture('Subsite', 'subsite1'); - Subsite::changeSubsite($subsite->ID); - $vp1 = new SubsitesVirtualPage(); - $vp1->CopyContentFromID = $page->ID; - $vp1->write(); - $vp1->doPublish(); - - $subsite = $this->objFromFixture('Subsite', 'subsite2'); - Subsite::changeSubsite($subsite->ID); - $vp2 = new SubsitesVirtualPage(); - $vp2->CopyContentFromID = $page->ID; - $vp2->write(); - $vp2->doPublish(); - - // Switch back to main site, unpublish source - $subsite = $this->objFromFixture('Subsite', 'main'); - Subsite::changeSubsite($subsite->ID); - $page = $this->objFromFixture('Page', 'importantpage'); - $page->doUnpublish(); - - Subsite::changeSubsite($vp1->SubsiteID); - $onLive = Versioned::get_one_by_stage('SubsitesVirtualPage', 'Live', "\"SiteTree_Live\".\"ID\" = ".$vp1->ID); - $this->assertNull($onLive, 'SVP has been removed from live'); - - $subsite = $this->objFromFixture('Subsite', 'subsite2'); - Subsite::changeSubsite($vp2->SubsiteID); - $onLive = Versioned::get_one_by_stage('SubsitesVirtualPage', 'Live', "\"SiteTree_Live\".\"ID\" = ".$vp2->ID); - $this->assertNull($onLive, 'SVP has been removed from live'); - } - - /** - * Similar to {@link SiteTreeSubsitesTest->testTwoPagesWithSameURLOnDifferentSubsites()} - * and {@link SiteTreeSubsitesTest->testPagesInDifferentSubsitesCanShareURLSegment()}. - */ - function testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite() { - Subsite::$write_hostmap = false; - $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); - $subsite2 = $this->objFromFixture('Subsite', 'subsite2'); - Subsite::changeSubsite($subsite1->ID); - - $subsite1Page = $this->objFromFixture('Page', 'subsite1_staff'); - $subsite1Page->URLSegment = 'staff'; - $subsite1Page->write(); - - // saving on subsite1, and linking to subsite1 - $subsite1Vp = new SubsitesVirtualPage(); - $subsite1Vp->CopyContentFromID = $subsite1Page->ID; - $subsite1Vp->SubsiteID = $subsite1->ID; - $subsite1Vp->write(); - $this->assertNotEquals( - $subsite1Vp->URLSegment, - $subsite1Page->URLSegment, - "Doesn't allow explicit URLSegment overrides when already existing in same subsite" - ); - - //Change to subsite 2 - Subsite::changeSubsite($subsite2->ID); + // Publish, VP goes black + $p->doPublish(); + $this->fixVersionNumberCache($vp); + $this->assertTrue($vp->ExistsOnLive); + $this->assertFalse($vp->IsModifiedOnStage); + } + + /** + * This test ensures published Subsites Virtual Pages immediately reflect updates + * to their published target pages. Note - this has to happen when the virtual page + * is in a different subsite to the page you are editing and republishing, + * otherwise the test will pass falsely due to current subsite ID being the same. + */ + public function testPublishedSubsiteVirtualPagesUpdateIfTargetPageUpdates() + { + // create page + $p = new Page(); + $p->Content = 'Content'; + $p->Title = 'Title'; + $p->writeToStage('Stage'); + $p->publish('Stage', 'Live'); + $this->assertTrue($p->ExistsOnLive); + + // change to subsite + $subsite = $this->objFromFixture('Subsite', 'subsite2'); + Subsite::changeSubsite($subsite->ID); + Subsite::$disable_subsite_filter = false; + + // create svp in subsite + $svp = new SubsitesVirtualPage(); + $svp->CopyContentFromID = $p->ID; + $svp->write(); + $svp->writeToStage('Stage'); + $svp->publish('Stage', 'Live'); + $this->assertEquals($svp->SubsiteID, $subsite->ID); + $this->assertTrue($svp->ExistsOnLive); + + // change back to original subsite ("Main site") + Subsite::changeSubsite(0); + + // update original page + $p->Title = 'New Title'; + // "save & publish" + $p->writeToStage('Stage'); + $p->publish('Stage', 'Live'); + $this->assertNotEquals($p->SubsiteID, $subsite->ID); + + // reload SVP from database + // can't use DO::get by id because caches. + $svpdb = $svp->get()->byID($svp->ID); + + // ensure title changed + $this->assertEquals($svpdb->Title, $p->Title); + } + + public function testUnpublishingParentPageUnpublishesSubsiteVirtualPages() + { + Config::inst()->update('StaticPublisher', 'disable_realtime', true); + + // Go to main site, get parent page + $subsite = $this->objFromFixture('Subsite', 'main'); + Subsite::changeSubsite($subsite->ID); + $page = $this->objFromFixture('Page', 'importantpage'); + + // Create two SVPs on other subsites + $subsite = $this->objFromFixture('Subsite', 'subsite1'); + Subsite::changeSubsite($subsite->ID); + $vp1 = new SubsitesVirtualPage(); + $vp1->CopyContentFromID = $page->ID; + $vp1->write(); + $vp1->doPublish(); + + $subsite = $this->objFromFixture('Subsite', 'subsite2'); + Subsite::changeSubsite($subsite->ID); + $vp2 = new SubsitesVirtualPage(); + $vp2->CopyContentFromID = $page->ID; + $vp2->write(); + $vp2->doPublish(); + + // Switch back to main site, unpublish source + $subsite = $this->objFromFixture('Subsite', 'main'); + Subsite::changeSubsite($subsite->ID); + $page = $this->objFromFixture('Page', 'importantpage'); + $page->doUnpublish(); + + Subsite::changeSubsite($vp1->SubsiteID); + $onLive = Versioned::get_one_by_stage('SubsitesVirtualPage', 'Live', "\"SiteTree_Live\".\"ID\" = ".$vp1->ID); + $this->assertNull($onLive, 'SVP has been removed from live'); + + $subsite = $this->objFromFixture('Subsite', 'subsite2'); + Subsite::changeSubsite($vp2->SubsiteID); + $onLive = Versioned::get_one_by_stage('SubsitesVirtualPage', 'Live', "\"SiteTree_Live\".\"ID\" = ".$vp2->ID); + $this->assertNull($onLive, 'SVP has been removed from live'); + } + + /** + * Similar to {@link SiteTreeSubsitesTest->testTwoPagesWithSameURLOnDifferentSubsites()} + * and {@link SiteTreeSubsitesTest->testPagesInDifferentSubsitesCanShareURLSegment()}. + */ + public function testSubsiteVirtualPageCanHaveSameUrlsegmentAsOtherSubsite() + { + Subsite::$write_hostmap = false; + $subsite1 = $this->objFromFixture('Subsite', 'subsite1'); + $subsite2 = $this->objFromFixture('Subsite', 'subsite2'); + Subsite::changeSubsite($subsite1->ID); + + $subsite1Page = $this->objFromFixture('Page', 'subsite1_staff'); + $subsite1Page->URLSegment = 'staff'; + $subsite1Page->write(); + + // saving on subsite1, and linking to subsite1 + $subsite1Vp = new SubsitesVirtualPage(); + $subsite1Vp->CopyContentFromID = $subsite1Page->ID; + $subsite1Vp->SubsiteID = $subsite1->ID; + $subsite1Vp->write(); + $this->assertNotEquals( + $subsite1Vp->URLSegment, + $subsite1Page->URLSegment, + "Doesn't allow explicit URLSegment overrides when already existing in same subsite" + ); + + //Change to subsite 2 + Subsite::changeSubsite($subsite2->ID); - // saving in subsite2 (which already has a page with URLSegment 'contact-us'), - // but linking to a page in subsite1 - $subsite2Vp = new SubsitesVirtualPage(); - $subsite2Vp->CopyContentFromID = $subsite1Page->ID; - $subsite2Vp->SubsiteID = $subsite2->ID; - $subsite2Vp->write(); - $this->assertEquals( - $subsite2Vp->URLSegment, - $subsite1Page->URLSegment, - "Does allow explicit URLSegment overrides when only existing in a different subsite" - ); - } - - function fixVersionNumberCache($page) { - $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)); - } - } + // saving in subsite2 (which already has a page with URLSegment 'contact-us'), + // but linking to a page in subsite1 + $subsite2Vp = new SubsitesVirtualPage(); + $subsite2Vp->CopyContentFromID = $subsite1Page->ID; + $subsite2Vp->SubsiteID = $subsite2->ID; + $subsite2Vp->write(); + $this->assertEquals( + $subsite2Vp->URLSegment, + $subsite1Page->URLSegment, + "Does allow explicit URLSegment overrides when only existing in a different subsite" + ); + } + public 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)); + } + } } diff --git a/tests/behat/features/bootstrap/Context/FeatureContext.php b/tests/behat/features/bootstrap/Context/FeatureContext.php index 1ac5c27..ae49f74 100644 --- a/tests/behat/features/bootstrap/Context/FeatureContext.php +++ b/tests/behat/features/bootstrap/Context/FeatureContext.php @@ -2,15 +2,17 @@ namespace Subsites\Test\Behaviour; -if(!class_exists('SilverStripe\BehatExtension\Context\SilverStripeContext')) return; +if (!class_exists('SilverStripe\BehatExtension\Context\SilverStripeContext')) { + return; +} -use SilverStripe\BehatExtension\Context\SilverStripeContext, - SilverStripe\BehatExtension\Context\BasicContext, - SilverStripe\BehatExtension\Context\LoginContext, - SilverStripe\BehatExtension\Context\FixtureContext, - SilverStripe\Framework\Test\Behaviour\CmsFormsContext, - SilverStripe\Framework\Test\Behaviour\CmsUiContext, - SilverStripe\Cms\Test\Behaviour; +use SilverStripe\BehatExtension\Context\SilverStripeContext; +use SilverStripe\BehatExtension\Context\BasicContext; +use SilverStripe\BehatExtension\Context\LoginContext; +use SilverStripe\BehatExtension\Context\FixtureContext; +use SilverStripe\Framework\Test\Behaviour\CmsFormsContext; +use SilverStripe\Framework\Test\Behaviour\CmsUiContext; +use SilverStripe\Cms\Test\Behaviour; // PHPUnit require_once 'PHPUnit/Autoload.php'; @@ -22,8 +24,8 @@ require_once 'PHPUnit/Framework/Assert/Functions.php'; * Context automatically loaded by Behat. * Uses subcontexts to extend functionality. */ -class FeatureContext extends SilverStripeContext { - +class FeatureContext extends SilverStripeContext +{ /** * @var FixtureFactory */ @@ -35,7 +37,8 @@ class FeatureContext extends SilverStripeContext { * * @param array $parameters context parameters (set them up through behat.yml) */ - public function __construct(array $parameters) { + public function __construct(array $parameters) + { parent::__construct($parameters); $this->useContext('BasicContext', new BasicContext($parameters)); @@ -50,41 +53,46 @@ class FeatureContext extends SilverStripeContext { // Use blueprints to set user name from identifier $factory = $fixtureContext->getFixtureFactory(); $blueprint = \Injector::inst()->create('FixtureBlueprint', 'Member'); - $blueprint->addCallback('beforeCreate', function($identifier, &$data, &$fixtures) { - if(!isset($data['FirstName'])) $data['FirstName'] = $identifier; + $blueprint->addCallback('beforeCreate', function ($identifier, &$data, &$fixtures) { + if (!isset($data['FirstName'])) { + $data['FirstName'] = $identifier; + } }); $factory->define('Member', $blueprint); // Auto-publish pages - foreach(\ClassInfo::subclassesFor('SiteTree') as $id => $class) { + foreach (\ClassInfo::subclassesFor('SiteTree') as $id => $class) { $blueprint = \Injector::inst()->create('FixtureBlueprint', $class); - $blueprint->addCallback('afterCreate', function($obj, $identifier, &$data, &$fixtures) { + $blueprint->addCallback('afterCreate', function ($obj, $identifier, &$data, &$fixtures) { $obj->publish('Stage', 'Live'); }); $factory->define($class, $blueprint); - } + } } - public function setMinkParameters(array $parameters) { + public function setMinkParameters(array $parameters) + { parent::setMinkParameters($parameters); - if(isset($parameters['files_path'])) { - $this->getSubcontext('FixtureContext')->setFilesPath($parameters['files_path']); + if (isset($parameters['files_path'])) { + $this->getSubcontext('FixtureContext')->setFilesPath($parameters['files_path']); } } /** * @return FixtureFactory */ - public function getFixtureFactory() { - if(!$this->fixtureFactory) { + public function getFixtureFactory() + { + if (!$this->fixtureFactory) { $this->fixtureFactory = \Injector::inst()->create('BehatFixtureFactory'); } return $this->fixtureFactory; } - public function setFixtureFactory(FixtureFactory $factory) { + public function setFixtureFactory(FixtureFactory $factory) + { $this->fixtureFactory = $factory; } From ce90c2124bf494172b4d7ab04a99021c8d5f8755 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 24 Nov 2015 17:15:08 +1300 Subject: [PATCH 04/38] API Add option to specify http / https on subsite domains --- .travis.yml | 2 + code/extensions/SiteTreeSubsites.php | 17 +- code/forms/WildcardDomainField.php | 43 ++++ code/model/Subsite.php | 50 ++-- code/model/SubsiteDomain.php | 156 +++++++++++- tests/FileSubsitesTest.php | 20 +- tests/SubsiteTest.php | 86 ++++++- tests/SubsiteTest.yml | 368 ++++++++++++++------------- tests/WildcardDomainFieldTest.php | 72 ++++++ 9 files changed, 588 insertions(+), 226 deletions(-) create mode 100644 code/forms/WildcardDomainField.php create mode 100644 tests/WildcardDomainFieldTest.php diff --git a/.travis.yml b/.travis.yml index 92baae9..1e03dd4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,8 @@ language: php +sudo: false + php: - 5.4 diff --git a/code/extensions/SiteTreeSubsites.php b/code/extensions/SiteTreeSubsites.php index 540f665..1ae8301 100644 --- a/code/extensions/SiteTreeSubsites.php +++ b/code/extensions/SiteTreeSubsites.php @@ -104,12 +104,17 @@ class SiteTreeSubsites extends DataExtension // replace readonly link prefix $subsite = $this->owner->Subsite(); $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) - ); + if ($subsite && $subsite->exists()) { + // Use baseurl from domain + $baseLink = $subsite->absoluteBaseURL(); + + // Add parent page if enabled + if($nested_urls_enabled && $this->owner->ParentID) { + $baseLink = Controller::join_links( + $baseLink, + $this->owner->Parent()->RelativeLink(true) + ); + } $urlsegment = $fields->dataFieldByName('URLSegment'); $urlsegment->setURLPrefix($baseLink); diff --git a/code/forms/WildcardDomainField.php b/code/forms/WildcardDomainField.php new file mode 100644 index 0000000..2a02d80 --- /dev/null +++ b/code/forms/WildcardDomainField.php @@ -0,0 +1,43 @@ +checkHostname($this->Value())) { + return true; + } + + $validator->validationError( + $this->getName(), + _t("DomainNameField.INVALID_DOMAIN", "Invalid domain name"), + "validation" + ); + return false; + } + + /** + * Check if the given hostname is valid. + * + * @param string $hostname + * @return bool True if this hostname is valid + */ + public function checkHostname($hostname) + { + return (bool)preg_match('/^([a-z0-9\*]+[\-\.])*([a-z0-9\*]+)$/', $hostname); + } + + public function Type() + { + return 'text wildcarddomain'; + } +} diff --git a/code/model/Subsite.php b/code/model/Subsite.php index 01574c1..ba8649f 100644 --- a/code/model/Subsite.php +++ b/code/model/Subsite.php @@ -758,26 +758,27 @@ class Subsite extends DataObject */ public function domain() { - if ($this->ID) { - $domains = DataObject::get("SubsiteDomain", "\"SubsiteID\" = $this->ID", "\"IsPrimary\" DESC", "", 1); - if ($domains && $domains->Count()>0) { - $domain = $domains->First()->Domain; - // If there are wildcards in the primary domain (not recommended), make some - // educated guesses about what to replace them with: - $domain = preg_replace('/\.\*$/', ".$_SERVER[HTTP_HOST]", $domain); - // Default to "subsite." prefix for first wildcard - // TODO Whats the significance of "subsite" in this context?! - $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']; + // Get best SubsiteDomain object + $domainObject = $this->getPrimarySubsiteDomain(); + if ($domainObject) { + return $domainObject->SubstitutedDomain; } + + // If there are no objects, default to the current hostname + return $_SERVER['HTTP_HOST']; + } + + /** + * Finds the primary {@see SubsiteDomain} object for this subsite + * + * @return SubsiteDomain + */ + public function getPrimarySubsiteDomain() + { + return $this + ->Domains() + ->sort('"IsPrimary" DESC') + ->first(); } /** @@ -790,12 +791,19 @@ class Subsite extends DataObject } /** - * + * Get the absolute URL for this subsite * @return string */ public function absoluteBaseURL() { - return "http://" . $this->domain() . Director::baseURL(); + // Get best SubsiteDomain object + $domainObject = $this->getPrimarySubsiteDomain(); + if ($domainObject) { + return $domainObject->absoluteBaseURL(); + } + + // Fall back to the current base url + return Director::absoluteBaseURL(); } /** diff --git a/code/model/SubsiteDomain.php b/code/model/SubsiteDomain.php index 11439e0..e976a1e 100644 --- a/code/model/SubsiteDomain.php +++ b/code/model/SubsiteDomain.php @@ -1,8 +1,12 @@ "Varchar(255)", + "Protocol" => "Enum('http,https,automatic','automatic')", "IsPrimary" => "Boolean", ); + /** + * Specifies that this subsite is http only + */ + const PROTOCOL_HTTP = 'http'; + + /** + * Specifies that this subsite is https only + */ + const PROTOCOL_HTTPS = 'https'; + + /** + * Specifies that this subsite supports both http and https + */ + const PROTOCOL_AUTOMATIC = 'automatic'; + + /** + * Get the descriptive title for this domain + * + * @return string + */ + public function getTitle() + { + return $this->Domain; + } + /** * * @var array @@ -24,14 +54,24 @@ class SubsiteDomain extends DataObject ); /** - * + * @config * @var array */ - private static $summary_fields=array( + private static $summary_fields = array( 'Domain', 'IsPrimary', ); + /** + * @config + * @var array + */ + private static $casting = array( + 'SubstitutedDomain' => 'Varchar', + 'FullProtocol' => 'Varchar', + 'AbsoluteLink' => 'Varchar', + ); + /** * Whenever a Subsite Domain is written, rewrite the hostmap * @@ -48,9 +88,29 @@ class SubsiteDomain extends DataObject */ public function getCMSFields() { + $protocols = array( + self::PROTOCOL_HTTP => _t('SubsiteDomain.PROTOCOL_HTTP', 'http://'), + self::PROTOCOL_HTTPS => _t('SubsiteDomain.PROTOCOL_HTTPS', 'https://'), + self::PROTOCOL_AUTOMATIC => _t('SubsiteDomain.PROTOCOL_AUTOMATIC', 'Automatic') + ); + $fields = new FieldList( - new TextField('Domain', $this->fieldLabel('Domain'), null, 255), - new CheckboxField('IsPrimary', $this->fieldLabel('IsPrimary')) + WildcardDomainField::create('Domain', $this->fieldLabel('Domain'), null, 255) + ->setDescription(_t( + 'SubsiteDomain.DOMAIN_DESCRIPTION', + 'Hostname of this subsite (exclude protocol). Allows wildcards (*).' + )), + OptionsetField::create('Protocol', $this->fieldLabel('Protocol'), $protocols) + ->setDescription(_t( + 'SubsiteDomain.PROTOCOL_DESCRIPTION', + 'When generating links to this subsite, use the selected protocol.
' . + 'Selecting \'Automatic\' means subsite links will default to the current protocol.' + )), + CheckboxField::create('IsPrimary', $this->fieldLabel('IsPrimary')) + ->setDescription(_t( + 'SubsiteDomain.PROTOCOL_DESCRIPTION', + 'Mark this as the default domain for this subsite' + )) ); $this->extend('updateCMSFields', $fields); @@ -66,20 +126,90 @@ class SubsiteDomain extends DataObject { $labels = parent::fieldLabels($includerelations); $labels['Domain'] = _t('SubsiteDomain.DOMAIN', 'Domain'); - $labels['IsPrimary'] = _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain'); + $labels['Protocol'] = _t('SubsiteDomain.Protocol', 'Protocol'); + $labels['IsPrimary'] = _t('SubsiteDomain.IS_PRIMARY', 'Is Primary Domain?'); return $labels; } /** - * Before writing the Subsite Domain, strip out any HTML the user has entered. - * @return void + * Get the link to this subsite + * + * @return string */ - public function onBeforeWrite() + public function Link() { - parent::onBeforeWrite(); + return $this->getFullProtocol() . $this->Domain; + } - //strip out any HTML to avoid XSS attacks - $this->Domain = Convert::html2raw($this->Domain); + /** + * Gets the full protocol (including ://) for this domain + * + * @return string + */ + public function getFullProtocol() + { + switch ($this->Protocol) { + case self::PROTOCOL_HTTPS: + { + return 'https://'; + } + case self::PROTOCOL_HTTP: + { + return 'http://'; + } + default: + { + return Director::protocol(); + } + } + } + + /** + * Retrieves domain name with wildcards substituted with actual values + * + * @todo Refactor domains into separate wildcards / primary domains + * + * @return string + */ + public function getSubstitutedDomain() + { + $currentHost = $_SERVER['HTTP_HOST']; + + // If there are wildcards in the primary domain (not recommended), make some + // educated guesses about what to replace them with: + $domain = preg_replace('/\.\*$/', ".{$currentHost}", $this->Domain); + + // Default to "subsite." prefix for first wildcard + // TODO Whats the significance of "subsite" in this context?! + $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; + } + + /** + * Get absolute link for this domain + * + * @return string + */ + public function getAbsoluteLink() + { + return $this->getFullProtocol() . $this->getSubstitutedDomain(); + } + + /** + * Get absolute baseURL for this domain + * + * @return string + */ + public function absoluteBaseURL() + { + return Controller::join_links( + $this->getAbsoluteLink(), + Director::baseURL() + ); } } diff --git a/tests/FileSubsitesTest.php b/tests/FileSubsitesTest.php index a465dee..1ab22f9 100644 --- a/tests/FileSubsitesTest.php +++ b/tests/FileSubsitesTest.php @@ -3,6 +3,18 @@ class FileSubsitesTest extends BaseSubsiteTest { public static $fixture_file = 'subsites/tests/SubsiteTest.yml'; + + /** + * Disable other file extensions + * + * @var array + */ + protected $illegalExtensions = array( + 'File' => array( + 'SecureFileExtension', + 'VersionedFileExtension' + ) + ); public function testTrivialFeatures() { @@ -68,12 +80,14 @@ class FileSubsitesTest extends BaseSubsiteTest $this->assertEquals(array( 'Main site', - 'Template', 'Subsite1 Template', 'Subsite2 Template', + 'Template', 'Test 1', 'Test 2', - 'Test 3' - ), $source); + 'Test 3', + 'Test Non-SSL', + 'Test SSL', + ), array_values($source)); } } diff --git a/tests/SubsiteTest.php b/tests/SubsiteTest.php index fd128e9..9add45f 100644 --- a/tests/SubsiteTest.php +++ b/tests/SubsiteTest.php @@ -3,20 +3,37 @@ class SubsiteTest extends BaseSubsiteTest { public static $fixture_file = 'subsites/tests/SubsiteTest.yml'; + + /** + * Original value of {@see SubSite::$strict_subdomain_matching} + * + * @var bool + */ + protected $origStrictSubdomainMatching = null; + + /** + * Original value of $_REQUEST + * + * @var array + */ + protected $origServer = array(); public function setUp() { parent::setUp(); + Config::inst()->update('Director', 'alternate_base_url', '/'); $this->origStrictSubdomainMatching = Subsite::$strict_subdomain_matching; + $this->origServer = $_SERVER; Subsite::$strict_subdomain_matching = false; } public function tearDown() { - parent::tearDown(); - + $_SERVER = $this->origServer; Subsite::$strict_subdomain_matching = $this->origStrictSubdomainMatching; + + parent::tearDown(); } /** @@ -238,9 +255,7 @@ class SubsiteTest extends BaseSubsiteTest $this->assertEquals('two.mysite.com', $this->objFromFixture('Subsite', 'domaintest2')->domain()); - - $originalHTTPHost = $_SERVER['HTTP_HOST']; - + $_SERVER['HTTP_HOST'] = "www.example.org"; $this->assertEquals('three.example.org', $this->objFromFixture('Subsite', 'domaintest3')->domain()); @@ -251,8 +266,51 @@ class SubsiteTest extends BaseSubsiteTest $this->assertEquals($_SERVER['HTTP_HOST'], singleton('Subsite')->PrimaryDomain); $this->assertEquals('http://'.$_SERVER['HTTP_HOST'].Director::baseURL(), singleton('Subsite')->absoluteBaseURL()); - - $_SERVER['HTTP_HOST'] = $originalHTTPHost; + } + + /** + * Tests that Subsite and SubsiteDomain both respect http protocol correctly + */ + public function testDomainProtocol() { + // domaintest2 has 'protocol' + $subsite2 = $this->objFromFixture('Subsite', 'domaintest2'); + $domain2a = $this->objFromFixture('SubsiteDomain', 'dt2a'); + $domain2b = $this->objFromFixture('SubsiteDomain', 'dt2b'); + + // domaintest4 is 'https' (primary only) + $subsite4 = $this->objFromFixture('Subsite', 'domaintest4'); + $domain4a = $this->objFromFixture('SubsiteDomain', 'dt4a'); + $domain4b = $this->objFromFixture('SubsiteDomain', 'dt4b'); // secondary domain is http only though + + // domaintest5 is 'http' + $subsite5 = $this->objFromFixture('Subsite', 'domaintest5'); + $domain5a = $this->objFromFixture('SubsiteDomain', 'dt5'); + + // Check protocol when current protocol is http:// + $_SERVER['HTTP_HOST'] = 'www.mysite.com'; + $_SERVER['HTTPS'] = ''; + + $this->assertEquals('http://two.mysite.com/', $subsite2->absoluteBaseURL()); + $this->assertEquals('http://two.mysite.com/', $domain2a->absoluteBaseURL()); + $this->assertEquals('http://subsite.mysite.com/', $domain2b->absoluteBaseURL()); + $this->assertEquals('https://www.primary.com/', $subsite4->absoluteBaseURL()); + $this->assertEquals('https://www.primary.com/', $domain4a->absoluteBaseURL()); + $this->assertEquals('http://www.secondary.com/', $domain4b->absoluteBaseURL()); + $this->assertEquals('http://www.tertiary.com/', $subsite5->absoluteBaseURL()); + $this->assertEquals('http://www.tertiary.com/', $domain5a->absoluteBaseURL()); + + // Check protocol when current protocol is https:// + $_SERVER['HTTP_HOST'] = 'www.mysite.com'; + $_SERVER['HTTPS'] = 'ON'; + + $this->assertEquals('https://two.mysite.com/', $subsite2->absoluteBaseURL()); + $this->assertEquals('https://two.mysite.com/', $domain2a->absoluteBaseURL()); + $this->assertEquals('https://subsite.mysite.com/', $domain2b->absoluteBaseURL()); + $this->assertEquals('https://www.primary.com/', $subsite4->absoluteBaseURL()); + $this->assertEquals('https://www.primary.com/', $domain4a->absoluteBaseURL()); + $this->assertEquals('http://www.secondary.com/', $domain4b->absoluteBaseURL()); + $this->assertEquals('http://www.tertiary.com/', $subsite5->absoluteBaseURL()); + $this->assertEquals('http://www.tertiary.com/', $domain5a->absoluteBaseURL()); } public function testAllSites() @@ -265,7 +323,9 @@ class SubsiteTest extends BaseSubsiteTest array('Title' =>'Subsite2 Template'), array('Title' =>'Test 1'), array('Title' =>'Test 2'), - array('Title' =>'Test 3') + array('Title' =>'Test 3'), + array('Title' => 'Test Non-SSL'), + array('Title' => 'Test SSL') ), $subsites, 'Lists all subsites'); } @@ -301,10 +361,14 @@ class SubsiteTest extends BaseSubsiteTest 'Test 1', 'Test 2', 'Test 3', - ), $adminSiteTitles); + 'Test Non-SSL', + 'Test SSL' + ), array_values($adminSiteTitles)); - $member2Sites = Subsite::accessible_sites("CMS_ACCESS_CMSMain", false, null, - $this->objFromFixture('Member', 'subsite1member2')); + $member2Sites = Subsite::accessible_sites( + "CMS_ACCESS_CMSMain", false, null, + $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'); diff --git a/tests/SubsiteTest.yml b/tests/SubsiteTest.yml index e4b0ef6..f888474 100644 --- a/tests/SubsiteTest.yml +++ b/tests/SubsiteTest.yml @@ -1,184 +1,208 @@ Subsite: - main: - Title: Template - subsite1: - Title: Subsite1 Template - subsite2: - Title: Subsite2 Template - domaintest1: - Title: Test 1 - domaintest2: - Title: Test 2 - domaintest3: - Title: Test 3 + main: + Title: Template + subsite1: + Title: Subsite1 Template + subsite2: + Title: Subsite2 Template + domaintest1: + Title: Test 1 + domaintest2: + Title: Test 2 + domaintest3: + Title: Test 3 + domaintest4: + Title: 'Test SSL' + domaintest5: + Title: 'Test Non-SSL' SubsiteDomain: - subsite1: - SubsiteID: =>Subsite.subsite1 - Domain: subsite1.* - subsite2: - SubsiteID: =>Subsite.subsite2 - Domain: subsite2.* - dt1a: - SubsiteID: =>Subsite.domaintest1 - Domain: one.example.org - IsPrimary: 1 - dt1b: - SubsiteID: =>Subsite.domaintest1 - Domain: one.* - dt2a: - SubsiteID: =>Subsite.domaintest2 - Domain: two.mysite.com - IsPrimary: 1 - dt2b: - SubsiteID: =>Subsite.domaintest2 - Domain: *.mysite.com - dt3: - SubsiteID: =>Subsite.domaintest3 - Domain: three.* - IsPrimary: 1 + subsite1: + SubsiteID: =>Subsite.subsite1 + Domain: subsite1.* + Protocol: automatic + subsite2: + SubsiteID: =>Subsite.subsite2 + Domain: subsite2.* + Protocol: automatic + dt1a: + SubsiteID: =>Subsite.domaintest1 + Domain: one.example.org + Protocol: automatic + IsPrimary: 1 + dt1b: + SubsiteID: =>Subsite.domaintest1 + Domain: one.* + Protocol: automatic + dt2a: + SubsiteID: =>Subsite.domaintest2 + Domain: two.mysite.com + Protocol: automatic + IsPrimary: 1 + dt2b: + SubsiteID: =>Subsite.domaintest2 + Domain: *.mysite.com + Protocol: automatic + dt3: + SubsiteID: =>Subsite.domaintest3 + Domain: three.* + Protocol: automatic + IsPrimary: 1 + dt4a: + SubsiteID: =>Subsite.domaintest4 + Domain: www.primary.com + Protocol: https + dt4b: + SubsiteID: =>Subsite.domaintest4 + Domain: www.secondary.com + Protocol: http + dt5: + SubsiteID: =>Subsite.domaintest5 + Domain: www.tertiary.com + Protocol: http + IsPrimary: 1 Page: - mainSubsitePage: - Title: MainSubsitePage - SubsiteID: 0 - home: - Title: Home - SubsiteID: =>Subsite.main - about: - Title: About - SubsiteID: =>Subsite.main - linky: - Title: Linky - SubsiteID: =>Subsite.main - staff: - Title: Staff - ParentID: =>Page.about - SubsiteID: =>Subsite.main - contact: - Title: Contact Us - SubsiteID: =>Subsite.main - importantpage: - Title: Important Page - SubsiteID: =>Subsite.main - subsite1_home: - Title: Home (Subsite 1) - SubsiteID: =>Subsite.subsite1 - subsite1_contactus: - Title: Contact Us (Subsite 1) - SubsiteID: =>Subsite.subsite1 - subsite1_staff: - Title: Staff - SubsiteID: =>Subsite.subsite1 - subsite2_home: - Title: Home (Subsite 2) - SubsiteID: =>Subsite.subsite2 - subsite2_contactus: - Title: Contact Us (Subsite 2) - SubsiteID: =>Subsite.subsite2 + mainSubsitePage: + Title: MainSubsitePage + SubsiteID: 0 + home: + Title: Home + SubsiteID: =>Subsite.main + about: + Title: About + SubsiteID: =>Subsite.main + linky: + Title: Linky + SubsiteID: =>Subsite.main + staff: + Title: Staff + ParentID: =>Page.about + SubsiteID: =>Subsite.main + contact: + Title: Contact Us + SubsiteID: =>Subsite.main + importantpage: + Title: Important Page + SubsiteID: =>Subsite.main + subsite1_home: + Title: Home (Subsite 1) + SubsiteID: =>Subsite.subsite1 + subsite1_contactus: + Title: Contact Us (Subsite 1) + SubsiteID: =>Subsite.subsite1 + subsite1_staff: + Title: Staff + SubsiteID: =>Subsite.subsite1 + subsite2_home: + Title: Home (Subsite 2) + SubsiteID: =>Subsite.subsite2 + subsite2_contactus: + Title: Contact Us (Subsite 2) + SubsiteID: =>Subsite.subsite2 PermissionRoleCode: - roleCode1: - Code: CMS_ACCESS_CMSMain + roleCode1: + Code: CMS_ACCESS_CMSMain PermissionRole: - role1: - Title: role1 - Codes: =>PermissionRoleCode.roleCode1 + role1: + Title: role1 + Codes: =>PermissionRoleCode.roleCode1 Group: - admin: - Title: Admin - Code: admin - AccessAllSubsites: 1 - editor: - Title: Editor - Code: editor - AccessAllSubsites: 1 - subsite1_group: - Title: subsite1_group - Code: subsite1_group - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite1 - subsite2_group: - Title: subsite2_group - Code: subsite2_group - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite2 - subsite1admins: - Title: subsite1admins - Code: subsite1admins - AccessAllSubsites: 0 - Subsites: =>Subsite.subsite1 - allsubsitesauthors: - Title: allsubsitesauthors - Code: allsubsitesauthors - AccessAllSubsites: 1 - subsite1_group_via_role: - Title: subsite1_group_via_role - Code: subsite1_group_via_role - AccessAllSubsites: 1 - Roles: =>PermissionRole.role1 + admin: + Title: Admin + Code: admin + AccessAllSubsites: 1 + editor: + Title: Editor + Code: editor + AccessAllSubsites: 1 + subsite1_group: + Title: subsite1_group + Code: subsite1_group + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite1 + subsite2_group: + Title: subsite2_group + Code: subsite2_group + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite2 + subsite1admins: + Title: subsite1admins + Code: subsite1admins + AccessAllSubsites: 0 + Subsites: =>Subsite.subsite1 + allsubsitesauthors: + Title: allsubsitesauthors + Code: allsubsitesauthors + AccessAllSubsites: 1 + subsite1_group_via_role: + Title: subsite1_group_via_role + Code: subsite1_group_via_role + AccessAllSubsites: 1 + Roles: =>PermissionRole.role1 Permission: - admin: - Code: ADMIN - GroupID: =>Group.admin - editor1: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.editor - editor2: - Code: SITETREE_VIEW_ALL - GroupID: =>Group.editor - editor3: - Code: VIEW_DRAFT_CONTENT - GroupID: =>Group.editor - accesscmsmain1: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1_group - accesscmsmain2: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite2_group - accesscmsmain3: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.subsite1admins - accesscmsmain4: - Code: CMS_ACCESS_CMSMain - GroupID: =>Group.allsubsitesauthors - securityaccess1: - Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite1_group - securityaccess2: - Code: CMS_ACCESS_SecurityAdmin - GroupID: =>Group.subsite2_group - adminsubsite1: - Code: ADMIN - GroupID: =>Group.subsite1admins + admin: + Code: ADMIN + GroupID: =>Group.admin + editor1: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.editor + editor2: + Code: SITETREE_VIEW_ALL + GroupID: =>Group.editor + editor3: + Code: VIEW_DRAFT_CONTENT + GroupID: =>Group.editor + accesscmsmain1: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite1_group + accesscmsmain2: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite2_group + accesscmsmain3: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.subsite1admins + accesscmsmain4: + Code: CMS_ACCESS_CMSMain + GroupID: =>Group.allsubsitesauthors + securityaccess1: + Code: CMS_ACCESS_SecurityAdmin + GroupID: =>Group.subsite1_group + securityaccess2: + Code: CMS_ACCESS_SecurityAdmin + GroupID: =>Group.subsite2_group + adminsubsite1: + Code: ADMIN + GroupID: =>Group.subsite1admins Member: - admin: - FirstName: Admin - Surname: User - Email: admin@test.com - Password: rangi - Groups: =>Group.admin - editor: - FirstName: Editor - Surname: User - Email: editor@test.com - Password: rangi - Groups: =>Group.editor - subsite1member: - Email: subsite1member@test.com - Groups: =>Group.subsite1_group - subsite2member: - Email: subsite2member@test.com - Groups: =>Group.subsite2_group - subsite1admin: - Email: subsite1admin@test.com - Groups: =>Group.subsite1admins - allsubsitesauthor: - Email: allsubsitesauthor@test.com - Groups: =>Group.allsubsitesauthors - subsite1member2: - Email: subsite1member2@test.com - Groups: =>Group.subsite1_group_via_role + admin: + FirstName: Admin + Surname: User + Email: admin@test.com + Password: rangi + Groups: =>Group.admin + editor: + FirstName: Editor + Surname: User + Email: editor@test.com + Password: rangi + Groups: =>Group.editor + subsite1member: + Email: subsite1member@test.com + Groups: =>Group.subsite1_group + subsite2member: + Email: subsite2member@test.com + Groups: =>Group.subsite2_group + subsite1admin: + Email: subsite1admin@test.com + Groups: =>Group.subsite1admins + allsubsitesauthor: + Email: allsubsitesauthor@test.com + Groups: =>Group.allsubsitesauthors + subsite1member2: + Email: subsite1member2@test.com + Groups: =>Group.subsite1_group_via_role SiteConfig: - config: - CanCreateTopLevelType: LoggedInUsers \ No newline at end of file + config: + CanCreateTopLevelType: LoggedInUsers diff --git a/tests/WildcardDomainFieldTest.php b/tests/WildcardDomainFieldTest.php new file mode 100644 index 0000000..8736144 --- /dev/null +++ b/tests/WildcardDomainFieldTest.php @@ -0,0 +1,72 @@ +assertTrue($field->checkHostname($domain), "Validate that {$domain} is a valid domain name"); + } + + /** + * Check that valid domains are accepted + * + * @dataProvider invalidDomains + */ + public function testInvalidDomains($domain) { + $field = new WildcardDomainField('DomainField'); + $this->assertFalse($field->checkHostname($domain), "Validate that {$domain} is an invalid domain name"); + } + + /** + * Check that valid domains are accepted + * + * @dataProvider validWildcards + */ + public function testValidWildcards($domain) { + $field = new WildcardDomainField('DomainField'); + $this->assertTrue($field->checkHostname($domain), "Validate that {$domain} is a valid domain wildcard"); + } + + public function validDomains() { + return array( + array('www.mysite.com'), + array('domain7'), + array('mysite.co.n-z'), + array('subdomain.my-site.com'), + array('subdomain.mysite') + ); + } + + public function invalidDomains() { + return array( + array('-mysite'), + array('.mysite'), + array('mys..ite'), + array('mysite-'), + array('mysite.'), + array('-mysite.*'), + array('.mysite.*'), + array('mys..ite.*'), + array('*.mysite-'), + array('*.mysite.') + ); + } + + public function validWildcards() { + return array( + array('*.mysite.com'), + array('mys*ite.com'), + array('*.my-site.*'), + array('*') + ); + } + +} From b4024c94bb1dd4d404c4aa2fd22e5f0cbedbc7eb Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 25 Nov 2015 11:48:01 +1300 Subject: [PATCH 05/38] Add changelog for 1.2.0 --- CHANGELOG.md | 4 ++++ composer.json | 7 +------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb77637..ea29ba9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [1.2.0] + +* API Add option to specify http / https on subsite domains + ## [1.1.0] * Changelog added. diff --git a/composer.json b/composer.json index 82e472b..09d67b8 100644 --- a/composer.json +++ b/composer.json @@ -16,10 +16,5 @@ }, "require-dev": { "phpunit/PHPUnit": "~3.7@stable" - }, - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - } + } } From 145b8e663330d294370f24f50ecde2b32a62cc66 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 25 Nov 2015 11:49:10 +1300 Subject: [PATCH 06/38] Remove alias from 1.1 branch --- composer.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/composer.json b/composer.json index 82e472b..9e8cd6b 100644 --- a/composer.json +++ b/composer.json @@ -16,10 +16,5 @@ }, "require-dev": { "phpunit/PHPUnit": "~3.7@stable" - }, - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } } } From 280562fb7ea57543a78db6367858cb609f0cf863 Mon Sep 17 00:00:00 2001 From: Mike Andrewartha Date: Thu, 10 Dec 2015 17:09:23 +1300 Subject: [PATCH 07/38] moved user content into userhelp folder, removed old user manual pdf, added index file, updated readme links --- README.md | 6 +- docs/en/introduction.md | 79 +----------------- docs/en/user_manual.pdf | Bin 276114 -> 0 bytes .../_images/copy-page-to-subsite.jpg | Bin .../_images/copy-structure.jpg | Bin .../_images/disallow-page-types-result.png | Bin .../_images/disallow-page-types.png | Bin .../_images/group-subsites-access.png | Bin .../_images/subsite-admin-security-group.png | Bin .../_images/subsite-configuration.jpg | Bin .../_images/subsites-dropdown.png | Bin .../_images/subsites-virtual-page.jpg | Bin .../{ => userguide}/_images/view-subsites.jpg | Bin docs/en/userguide/index.md | 48 +++++++++++ docs/en/{ => userguide}/set_up.md | 63 +++++++++----- docs/en/{ => userguide}/working_with.md | 6 +- 16 files changed, 99 insertions(+), 103 deletions(-) delete mode 100644 docs/en/user_manual.pdf rename docs/en/{ => userguide}/_images/copy-page-to-subsite.jpg (100%) rename docs/en/{ => userguide}/_images/copy-structure.jpg (100%) rename docs/en/{ => userguide}/_images/disallow-page-types-result.png (100%) rename docs/en/{ => userguide}/_images/disallow-page-types.png (100%) rename docs/en/{ => userguide}/_images/group-subsites-access.png (100%) rename docs/en/{ => userguide}/_images/subsite-admin-security-group.png (100%) rename docs/en/{ => userguide}/_images/subsite-configuration.jpg (100%) rename docs/en/{ => userguide}/_images/subsites-dropdown.png (100%) rename docs/en/{ => userguide}/_images/subsites-virtual-page.jpg (100%) rename docs/en/{ => userguide}/_images/view-subsites.jpg (100%) create mode 100644 docs/en/userguide/index.md rename docs/en/{ => userguide}/set_up.md (62%) rename docs/en/{ => userguide}/working_with.md (82%) diff --git a/README.md b/README.md index c1097b7..58a48fe 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ permissions" will imply that the person will likely be able to escalate his/her For user documentation please see: - 1. [Setting up subsites](docs/en/set_up.md) - 1. [Working with subsites](docs/en/working_with.md) + 1. [Setting up subsites](docs/en/userhelp/set_up.md) + 1. [Working with subsites](docs/en/userhelp/working_with.md) ## Features & limitations @@ -41,7 +41,7 @@ For user documentation please see: * Each subsite domain name has to be set up on the server first, and DNS records need to be updated as appropriate. * A subsite cannot use a different codebase as the main site, they are intrinsically tied - * However, you can remove page types from a subsite when creating the subsite - [see the setup documentation for further details](set_up.md) + * However, you can remove page types from a subsite when creating the subsite - [see the setup documentation for further details](docs/en/userhelp/set_up.md) * The only code a developer can edit between subsites is the theme * The separation between subsites in the CMS needs to be seen as cosmetic, and mostly applicable to the "Pages" and "Files" sections of the CMS. * All subsites run in the same process space and data set. Therefore if an outage affects one subsite it will affect all subsites, and if bad code or hardware corrupts one subsite's data, it's very likely that it has corrupted all subsite data. diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 07dbe98..24eabff 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,84 +1,9 @@ -## Introduction +# Subsites -Subsites is a module to allow you manage multiple related sites from a single CMS interface. - -When Subsites is installed your existing site is defined as the main site, you will be then be able to create related subsites under the main site. - -One of the benefits of subsites is that it is easy to copy pages between the subsites and you have access to all of -the assets across all of the subsites. - -Subsites is not for running unrelated websites on a single SilverStripe instance so if 2 sites have different vhosts -you will not be able to run them with Subsites on a single SilverStripe instance. - -With Subsites you can set up users to have access to all subsites or just a selection of subsites. - -## When to use the Subsites module - -* You have a clear parent/main website and a set of subsites associated with it. -* You have a group of simple, commonly themed websites -* Your websites contain some overlapping content, and you want to avoid the redundancy of making the same update to content that exists on multiple CMS installations. -* You have simple content websites that use the same templates and modules, and are managed by the same team, but have different themes. -* Content editing of the subsites is through the same team, so there is no problem around editors having access to all the files for each subsite, nor around having CMS admin(s) who control access to all the sites. - -## When to avoid the Subsites module - -* You have constraints on what content CMS editors can and cannot view between subsites. -* You have a business critical website, and adding complexity around changes and releases for subsites creates unwanted risk. -* There is a significant security risk around putting the websites into the same CMS installation. This could be the risk of content bleeding between sites, or the risk of an editor on one site gaining access to content on the other site. -* Websites that are distinct and use customised modules and/or bespoke code -* Websites that are owned by different business units and/or managed by different development and web teams. (not technical, it just organisational complexity). - -It is important to remember that the only unique trait each site can have is its theme (look and feel), whilst all the other building blocks of the site — the code, database, and modules — are shared. Therefore, one of the biggest drawbacks to using subsites is exposure to a single point of failure. If there is a bug in code that is only used on one subsite, it nevertheless affects all other subsites, because they share a codebase. Similarly, if the database becomes corrupt, all subsites are affected. Further, it is not possible to create or restore backups of any given subsite. Backups must represent and replace the entire collection of sites. - -## Access - -Access to certain subsites can be limited to administrators based on the groups they are in. -So for example if you had a couple of subsites you could create a group for each subsite and then specify that the -group had access to all subsites or just a specific subsites. -To access this functionality go to - - -Security -> Groups - -![alt text](_images/subsite-admin-security-group.png "Groups") - -Select the group you want to modify and then go to the Subsites tab - -You can also limit the page types that are available for a subsite (but not the main site). -This can be done via accessing the particular subsite you want to amend via the Subsite admin section, underneath the -Subsite theme will be a link called 'Disallow page types?' clicking on that link will display a list of checkboxes for -all of the page types which can be selected to disable that page type for the subsite you are editing. -This is useful when you create a content editor and you do not want them to be able to add certain page types. - -## Theme -A theme is group of templates, images and CSS for the look of a website. -When you are using Subsites you may have different themes installed for your site so you could apply different -themes for each subsite. - -## Page types -Page types refer to the type of pages that can be set up on a site. -A page type will have certain features and functionality some examples on SilverStripe would be 'Page', 'HomePage' -and 'ErrorPage' these all differ to each other in what they would be used for so you would use Page for any pages -underneath the HomePage. - - -You would only have one HomePage for your site and you may have some logic to only allow you to create one of these -pages, ErrorPage would only be used for error pages and would be designed to be very minimal to work in situations -where the site is experiencing difficulties like no DB access. - - -You can set up a Subsite to only work with certain page types so you may have a page type with a contact form for a -particular department so you may set up a new subsite and not allow that page type to be used on a particular subsite. -You will not be able to filter Page Types for the main site. - -## Assets -Assets are files that have been uploaded via the CMS. -It is suggested to use a naming convention for files designated to be used on a particular subsite or to create folders -for each subsite to help organise them. +[User guide](userguide/index.md) ## FAQ - ### How can I restrict a content author to a particular subsite? diff --git a/docs/en/user_manual.pdf b/docs/en/user_manual.pdf deleted file mode 100644 index 2a7e2583a3ffe0503a0f6b5f063bd2e3eca754ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276114 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 z 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 OK$Swr$ETpBNcTT22i05v diff --git a/docs/en/_images/copy-page-to-subsite.jpg b/docs/en/userguide/_images/copy-page-to-subsite.jpg similarity index 100% rename from docs/en/_images/copy-page-to-subsite.jpg rename to docs/en/userguide/_images/copy-page-to-subsite.jpg diff --git a/docs/en/_images/copy-structure.jpg b/docs/en/userguide/_images/copy-structure.jpg similarity index 100% rename from docs/en/_images/copy-structure.jpg rename to docs/en/userguide/_images/copy-structure.jpg diff --git a/docs/en/_images/disallow-page-types-result.png b/docs/en/userguide/_images/disallow-page-types-result.png similarity index 100% rename from docs/en/_images/disallow-page-types-result.png rename to docs/en/userguide/_images/disallow-page-types-result.png diff --git a/docs/en/_images/disallow-page-types.png b/docs/en/userguide/_images/disallow-page-types.png similarity index 100% rename from docs/en/_images/disallow-page-types.png rename to docs/en/userguide/_images/disallow-page-types.png diff --git a/docs/en/_images/group-subsites-access.png b/docs/en/userguide/_images/group-subsites-access.png similarity index 100% rename from docs/en/_images/group-subsites-access.png rename to docs/en/userguide/_images/group-subsites-access.png diff --git a/docs/en/_images/subsite-admin-security-group.png b/docs/en/userguide/_images/subsite-admin-security-group.png similarity index 100% rename from docs/en/_images/subsite-admin-security-group.png rename to docs/en/userguide/_images/subsite-admin-security-group.png diff --git a/docs/en/_images/subsite-configuration.jpg b/docs/en/userguide/_images/subsite-configuration.jpg similarity index 100% rename from docs/en/_images/subsite-configuration.jpg rename to docs/en/userguide/_images/subsite-configuration.jpg diff --git a/docs/en/_images/subsites-dropdown.png b/docs/en/userguide/_images/subsites-dropdown.png similarity index 100% rename from docs/en/_images/subsites-dropdown.png rename to docs/en/userguide/_images/subsites-dropdown.png diff --git a/docs/en/_images/subsites-virtual-page.jpg b/docs/en/userguide/_images/subsites-virtual-page.jpg similarity index 100% rename from docs/en/_images/subsites-virtual-page.jpg rename to docs/en/userguide/_images/subsites-virtual-page.jpg diff --git a/docs/en/_images/view-subsites.jpg b/docs/en/userguide/_images/view-subsites.jpg similarity index 100% rename from docs/en/_images/view-subsites.jpg rename to docs/en/userguide/_images/view-subsites.jpg diff --git a/docs/en/userguide/index.md b/docs/en/userguide/index.md new file mode 100644 index 0000000..7627044 --- /dev/null +++ b/docs/en/userguide/index.md @@ -0,0 +1,48 @@ +title: Working with multiple websites +summary: Setting up and editing multiple websites using SilverStripe + +# Working with multiple sites + +## In this section: + +* Understand subsites +* Learn how to create and delete subsites +* Learn how to manage subsite permissions +* Enable/Disable public access to subsites +* Learn how to create and use subsite templates +* Learn how to edit existing subsites +* Sharing content between the main site and subsites + +## Before we begin: + +* Make sure you have the SilverStripe [Subsites](http://addons.silverstripe.org/add-ons/silverstripe/subsites) module installed. +* Make sure you are in the "Subsites" section on the Navigation Tabs. +* Make sure you have full administrative rights on your site. + +## Understanding subsites + +Subsites is a module to allow you manage multiple related sites from a single CMS interface. Because all sites run on a single installation of SilverStripe, they can share users, content and assets. They can all use the same templates, or each use different ones. + +When Subsites is installed your existing site is defined as the main site, you will be then be able to create related subsites under the main site. + +So for example you may have an international presence and you want to create a subsite for a country where you do business which is geared just for that market. You could create a subsite for this and have all information related to that country kept under this subsite, you can also set up a subdomain for this site. + +One of the benefits of subsites is that it is easy to copy pages between the subsites and you have access to all of the assets across all of the subsites. + +Subsites is not for running unrelated websites on a single SilverStripe instance so if two sites have different vhosts you will not be able to run them with Subsites on a single SilverStripe instance. + +With Subsites you can set up users to have access to all subsites or just a selection of subsites. + +## Common subsite uses + +Subsites can be used for various different reasons here are some of the common ones: + +* Setting up a subsite for a small campaign so for example a clothing company may set up a summer or winter subsite to market just that season of clothing. +* Locking down a particular subsite you may create a particular department like recruitment who would have access to create and edit pages for their particular subsite but they would not be able to modify the main website. +* Running sub-domains on a single SilverStripe instance, with subsites if a sub-domain is pointing to the same instance and has been setup correctly you can manage this via a single CMS instance. +* Subsites can not be used to run multiple websites on a single instance. Subsites does not allow you to run multiple domains/vhosts on a single instance. + +## Documentation + +* [Set up](set_up.md) +* [Working with subsites](working_with.md) \ No newline at end of file diff --git a/docs/en/set_up.md b/docs/en/userguide/set_up.md similarity index 62% rename from docs/en/set_up.md rename to docs/en/userguide/set_up.md index 0fc8355..714d256 100644 --- a/docs/en/set_up.md +++ b/docs/en/userguide/set_up.md @@ -2,44 +2,42 @@ ## Creating subsites -To view, edit and create subsites, go to the *Subsite* section of the CMS. Click *Search* to view a list of all -existing subsites. +To view, edit and create subsites, go to the *Subsite* section of the CMS. Click *Search* to view a list of all existing subsites. ![View subsites](_images/view-subsites.jpg) -Click on a subsite name to edit its details. Click the red X to delete a subsite (you will be asked for confirmation.) -To create a new subsite, click *Add Subsite*. This opens the *Subsite configuration* subsection. +Click on a subsite name to edit its details. To create a new subsite, click *Add Subsite*. This opens the *Subsite configuration* subsection. + +## Deleting a subsite + +Click the red X to delete a subsite (you will be asked for confirmation.) + +## Subsite configuration ![Subsite configuration](_images/subsite-configuration.jpg) You can configure the following details for a subsite: * *Name of subsite:* This is the display name for the site in the CMS (not public-facing) - * *Domains for this subsite:* Lets you add one or more domains for this subsite, e.g., subsite.co.nz, subsite.org.nz, -subsite.com + * *Domains for this subsite:* Lets you add one or more domains for this subsite, e.g., subsite.co.nz, subsite.org.nz, subsite.com * *Language:* Sets the language for the subsite. This affects the spellchecker (not the CMS interface language) * *Default site:* If your site is accessed by a domain not listed in any subsites, this subsite is shown as default. * *Enable public access:* Enables/disables the subsite. Corresponds to the *Active Subsite* column. - * *Theme:* Shows the list of available themes that exist in the themes directory. The subsite will use the templates -and styles from the selected theme. - * *Disallow page types:* Lets you mark some page types to prevent being used within this subsite. - * *Copy structure from:* Gives you the option to select an existing subsite from which to copy pages and files (see - "Copying subsites" for more information about this) + * *Theme:* Shows the list of available themes that exist in the themes directory. The subsite will use the templates and styles from the selected theme. + * *Disallow page types:* Lets you mark some page types to prevent them being used within this subsite (but not the main site). Clicking on that link will display a list of checkboxes for all of the page types which can be selected to disable that page type for the subsite you are editing. This is useful when you create a content editor and you do not want them to be able to add certain page types. + * *Copy structure from:* Gives you the option to select an existing subsite from which to copy pages and files (see "Copying subsites" for more information about this) ## Roles When creating roles, you can assign the following subsite-specific permissions: - * *Access to 'Subsites' section:* Shows the *Subsite* section in the CMS, allowing you to manage subsites for your -site (ie, create, edit, view.) + * *Access to 'Subsites' section:* Shows the *Subsite* section in the CMS, allowing you to manage subsites for your site (ie, create, edit, view.) * *Manage subsites for groups:* Ability to limit the permissions for a group to one or more subsites. - * *Manage assets for subsites:* Ability to select the subsite to which an asset folder belongs (also requires access to -*Files* section) + * *Manage assets for subsites:* Ability to select the subsite to which an asset folder belongs (also requires access to *Files* section) ## Groups -Groups can have access to all sites, or to one or more specific subsites. If you have different staff in charge of each -subsite, you probably want to create a separate group for each subsite. +Groups can have access to all sites, or to one or more specific subsites. If you have different staff in charge of each subsite, you probably want to [create](#creating-groups) a separate group for each subsite. The dropdown in the upper left corner of the CMS indicates which subsite you are currently on. @@ -50,7 +48,19 @@ these subsites* to reveal a checklist of all available sites. ![Group subsites access](_images/group-subsites-access.png) +### Creating groups + +Access to certain subsites can be limited to administrators based on the groups they are in. +So for example if you had a couple of subsites you could create a group for each subsite and then specify that the group had access to all subsites or just a specific subsites. + +To access this functionality go to Security -> Groups + +![Creating Groups](_images/subsite-admin-security-group.png "Groups") + +Select the group you want to modify and then go to the Subsites tab + ## Copying subsites + Duplicating subsites can be useful if you want to create several subsites based on the same general site structure. You can set up a collection of pages, files, and images and use it as a template. When you create a new subsite, instead of starting from scratch you can copy it all from your existing subsite. This will copy all pages, files and images from that subsite into your new subsite. To create a new subsite template, create a new subsite described above under "Creating subsites" but don't add any domains. Add a name that will make it easy to see that it is a template. Select the new template from the subsites dropdown in the upper right and create the pages and add the files and images you'd like to become part of the @@ -60,7 +70,14 @@ When you create a new subsite, you can now choose to Copy structure from your te ![Copy subsite structure](_images/copy-structure.jpg) -## Disable particular page types from a subsite +## Page types +Page types refer to the type of pages that can be set up on a site. A page type will have certain features and functionality some examples on SilverStripe would be 'Page', 'HomePage' and 'ErrorPage' these all differ to each other in what they would be used for so you would use Page for any pages +underneath the HomePage. + +You would only have one HomePage for your site and you may have some logic to only allow you to create one of these pages, ErrorPage would only be used for error pages and would be designed to be very minimal to work in situations where the site is experiencing difficulties (like no database access). + +### Disable particular page types from a subsite + Sometimes, you will have two or more websites that are very similar, but have some small differences. For example, a head office and its 3 satellite offices may have 4 subsites, but only the head office site will have a "Company News" section on the site. In this instance, you can still use the subsites module, and use the 'Disallow page types' ability to remove certain page types from being created on subsites. 1. Create a new subsite as you normally would via the Subsites section in the CMS @@ -69,7 +86,7 @@ Sometimes, you will have two or more websites that are very similar, but have so 4. Select the page types that you wish to forbid from this subsite. 5. Click the Save button at the bottom of the section. -Note that this process is exactly the same when editing an existing subsite, you just select the subsite you want to remove page types from instead of creating a new subsite. +*Note:* This process is exactly the same when editing an existing subsite, you just select the subsite you want to remove page types from instead of creating a new subsite. Also you cannot not filter Page Types for the main site. ![Disallow page types screenshot](_images/disallow-page-types.png) @@ -79,4 +96,10 @@ Now, whenever someone wants to create a new page on the subsite (the 'London Bra The page type blacklist applies only to future pages, not existing ones. If an administrator blacklists a defined page type on a subsite, existing pages of that type will remain on the subsite. The administrator (or another user) can later change it to a type that is not blacklisted after the page is published; however, once a user does that, that "grandfathered" pagetype will no longer be available to the published page. -For example, say a subsite user publishes a new Company Page before it was forbidden by an administrator. Later, a user with full administrative rights decides to disallow Company Pages from being created on the subsite. This restriction will only apply to all future pages that are published, but not to existing Company Pages. The full administrator (or any user with sufficient publishing rights) will have to manually convert any published Company Pages on the subsite to that of another allowed type. \ No newline at end of file +For example, say a subsite user publishes a new Company Page before it was forbidden by an administrator. Later, a user with full administrative rights decides to disallow Company Pages from being created on the subsite. This restriction will only apply to all future pages that are published, but not to existing Company Pages. The full administrator (or any user with sufficient publishing rights) will have to manually convert any published Company Pages on the subsite to that of another allowed type. + +## Themes +A theme is group of templates, images and CSS for the look of a website. When you are using Subsites you may have different themes installed for your site so you could apply different themes for each subsite. + +## Assets +Assets are files that have been uploaded via the CMS. It is suggested to use a naming convention for files designated to be used on a particular subsite or to create folders for each subsite to help organise them. \ No newline at end of file diff --git a/docs/en/working_with.md b/docs/en/userguide/working_with.md similarity index 82% rename from docs/en/working_with.md rename to docs/en/userguide/working_with.md index 19e32ac..918489f 100644 --- a/docs/en/working_with.md +++ b/docs/en/userguide/working_with.md @@ -2,11 +2,11 @@ ## Managing content across subsites -Select a subsite from the dropdown in the upper left to display the content for that site in the site tree. +To edit a particular subsite, choose the subsite from the dropdown menu in the left-hand menu. ![Subsites dropdown](_images/subsites-dropdown.png) -## Subsites virtual pages +### Subsites virtual pages You can pull in the content from a page that resides on another subsite by creating a page of the type **Subsites Virtual Page**. Pick the subsite from which you want to pull the content, then select the page. As with regular virtual @@ -15,7 +15,7 @@ the original content changes. ![Subsites virtual page](_images/subsites-virtual-page.jpg) -## Duplicating pages from the main site +### Duplicating pages from the main site If you have an existing page on the main site that you would like to copy to a subsite, all you need to do is: From 598d45aca60c05fc042eb49309c628391803fbd3 Mon Sep 17 00:00:00 2001 From: ctx2002 Date: Mon, 25 Jan 2016 15:36:20 +1300 Subject: [PATCH 09/38] Subsite module does not picks up themes This PR fixed unable to create subsite problm. I was unable to create a subsite, because of no themes been shown in Theme dropdown menu. How to test: 1> Use composer to install a fresh copy of Silverstripe 3.2 2> Use composer to install subsite module. 3> Try to create a subsite. 4> No themes loaded into Theme dropdown menu. 5> Apply this PR. 6> fresh page / or dev/build, now, themes loaded into The dropdown menu. --- code/model/Subsite.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/model/Subsite.php b/code/model/Subsite.php index ba8649f..4efa5eb 100644 --- a/code/model/Subsite.php +++ b/code/model/Subsite.php @@ -700,8 +700,8 @@ class Subsite extends DataObject return ArrayLib::valuekey($themes); } else { $themes = array(); - if (is_dir('../themes/')) { - foreach (scandir('../themes/') as $theme) { + if (is_dir(THEMES_PATH)) { + foreach (scandir(THEMES_PATH) as $theme) { if ($theme[0] == '.') { continue; } From 8b049fd46c5288d05be42e063fed1bff2a799113 Mon Sep 17 00:00:00 2001 From: Ian Herbert Date: Wed, 27 Jan 2016 15:58:00 +1300 Subject: [PATCH 10/38] Update README.md Fixing broken links to userguide documentation. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 58a48fe..45d4661 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ permissions" will imply that the person will likely be able to escalate his/her For user documentation please see: - 1. [Setting up subsites](docs/en/userhelp/set_up.md) - 1. [Working with subsites](docs/en/userhelp/working_with.md) + 1. [Setting up subsites](docs/en/userguide/set_up.md) + 1. [Working with subsites](docs/en/userguide/working_with.md) ## Features & limitations From a1aba25708cca526cc6e2470ac1df1b2f195ebfb Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Wed, 3 Feb 2016 13:27:03 +1300 Subject: [PATCH 11/38] Update templates for 3.3 compatibility --- templates/LeftAndMain_Menu.ss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/LeftAndMain_Menu.ss b/templates/LeftAndMain_Menu.ss index 85c3c9f..548f3fb 100644 --- a/templates/LeftAndMain_Menu.ss +++ b/templates/LeftAndMain_Menu.ss @@ -8,10 +8,10 @@

- + - + - +
auto From 07d449fa2df4d96bb56745c98c8136f05fb143f1 Mon Sep 17 00:00:00 2001 From: Gorrie Date: Tue, 9 Feb 2016 16:09:21 +1300 Subject: [PATCH 16/38] Removed target attribute to match main template --- templates/LeftAndMain_Menu.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/LeftAndMain_Menu.ss b/templates/LeftAndMain_Menu.ss index 562f4aa..9eeec85 100644 --- a/templates/LeftAndMain_Menu.ss +++ b/templates/LeftAndMain_Menu.ss @@ -27,7 +27,7 @@
    <% loop $MainMenu %>

5 zVp8-LhSBcK;wVAxck?cz!lW*+5*Cse$@-)f7 zb$_aCMe`?+D5IlY>T@Ke$kI52UQli)U5q6a#M;3Mb_Ql~;Qqax_>hkL;05HMS{{LP zgMm9)X2Jegjx}Yn(Po;uB!saX8%X?`DHXMdb=W){Dc^Onp*10S_+GTG8aw|C5{xpg z4l0Hdj7olZoqFyju5_8nQY7-0nM1Wv7fiO}s{b zB=*umVy5`oW}nI%Xr4HrzPX}Ov2{IrNF}+tVX8MH<8PEg8^!tNffrNdoNiMPfJ+U~ z7>cvSGXZZvQ{`)7U9*e334Z)aW_+rWt6HzOmm>7IAG~@A`Ebb0ClSw+Z;yc@; zP`JU`_G?v6R_OO~c|0cWCU1j* ziSJlvzN5$htl7|H-l8;Ly&H6y6IF@zvd_uEJ!s|rsmtcLjds^h1H08CkHe$i7IGEp z{$-_Xn@%=!u|@Gx@(K<^6$3&QpsN;PYpcBND(bisedAFE@>tJ&8SU~)lniZUEHgAp zgS8XFF0B=#I+J6iim_ij@rO?R=w%iT@DQlDDk+7%Hwzq=W#o-3UuH+z+%^y z1?wJ*^}qsd7m zizVZm+dEY<`WN}N!M{=bJ(hRv}sPROb&c3*)(=C0gur8F`ThyQ4~7;3pF#FArh$X?Bo#l?ZmSWc!p zD}ti{q=8klFeu4$#4F!s5AA`mlAncRA}cD=Wz5c*U3sUnjN15f)T_#5f`j-YJhY49 z+Ug<6dW-6zXya1qfxTAZ6nJb2;zCOl;JE?H4AaI`@$If4)QVm2WVKmHs)%$g&$Q|gM`oE(gsqu-x4<< zOpP?)hidWkM6?q`v$CaPhSJ~zWD3eDVsA|l?P@yYzPG29To+2__xFtmp3wfcxXkA` zNal_)w${;C1bJ;+g(&0YUt6V3Lz{>vX2)ii$Cqr&4n>EWGVW6|qQ}MAs`G7mrRI)Z zN?ZWFF(wzO>>VdrZFEFIhnre?it8QOzg{_J=ee3R=2r*MzrU}a-&P_%w5^&f{%|!* z^hGQ_x?NcrB2_wXYi|9SZ2jA!ZGxrggqgNYS1cuoL$4K)Vhy}!1NN8uP$t?*W_ME5 z1MJ3PPZ>i&pge(*gjXrxy~nY;+)#n2***TT`tjFwq&BN(46=;VvKM9JO-~>)0ww{V z$)y~D=>Vei)drKsjot%G^wGrS7#7C`Qcox)hYo8H^2NH-qZZ;g1b`?xXdBUpF_G%1BJ*t(^FZOQH{ zbVUHS2Vmq|jw_6PcVBIA=C%<0+^QPk1e~oeaxJkoC=KwLTDufJjRXE5@CkGUGT07r zf@;90l~c@ny5t`8X>6$1=vM(kZ7`-LdZ;oWoS39MrT5E}*_1_8e>G4 zS_<*OocARE9_SV$YyC=JizW3A4~h@bDUp>(F$ioh0FG(>lec{g(ik8<)voKBXRly1y+P^w_(U}H{unuN3-&;mao=r zgc9Y7t=cE?-{S@b1`UymP)yjc@@ws>p4A>(RKEhWP4Z0IO)^Z%MII7dHM97m=i*Om ze$H|!NAKZ9dxOo{pO$voMI{aSKp%e5rZ3HeG}A@D?$ukpORt3iN(VWv30map90%EO zn~XDD_TuFXccDDr{ zAuA4-ZeV9OkzRl_1nt9iNmJne5tS()XY(_B&Vq7Gdo!~VHrFYhmFAo2MV7%n;ofI#l2=4DiUFi zgiY%k`G)V@o0YTMtq?KM@_Ydbk@esOgg704C>~okp+ljU7XeC$nSBSBqBmVGlASN>@GrgYe<3q7 z{$HugvLfnovZDY0sm%X1e}azok68Nmn4~Y6`JX{ObhQ7Ti1BwF@Jo^ZhsyZ>?cLXk z>9Fp{g%9|dr9UQN2c#1jlNT;+AB!_E0<5d5A$sk%(0sKD9^w!yZ`m{ML0jJbAj1{- z?ItoGgSHQ8n4!|nAeeRsQ`8als%L+9p0R0((9k#7bE5fxFek z;J5ZN0eIT>of}pfy(O9FwqF7tq(S$tV&%`q;{j@j+T6npRGz(e&62MEp)7due11os zM9sTq;?o$a3DSCb;Z18{+-L6vz=*lnc1PhwIq~PDPbYHqF4w9(=7ZUy^IYT#P@rv3 zC9>Dp_3_STX0+c9GARh2Q43s>vo;bWIB5hFtU%qFDFYA`5 ztGWNW=Q-}VY{@&(k%MU>Ut7LuKA&BV&97_0CV z=2tA9DmJx?A>jEb3;b;ftDPkbpx4mp(W3x6m&f=8Z-6d341X_$u)Tdg30<>C zT^;-e@(MS2jJ2gnw+bu~?9(CYXLmlE&5T?MmB#EBiwg-Sj7Q=;BF2srCyrr^i|QB~ z7L4GA=`SQ6!73%=~PfEaSc6l=G$Jj0}Sp5&`d<`j#HK{WL72vUBkoEX%>v#GIb{gGAF z#^;MUD`pbYwk^;;br=(T+12}AjcN1BY3a*p@0S%w>H__VUk(cM>eBc73YFcTM+zG+ zx*P4yE2Y)$4b44{*={P+ww*7V zWkcuW_MxY&5W#X&?&R0)AozrH;qpP%aIxN{a|hnMntmK<{GjkX=WC9 zFq2cP&5XN~J2qRn`OCTf)$I%HCjk?}&R zfnls$RdX{bb?W1dbwvL79`ogPdvdGw<=jYGkXe#br&HuF0=r5Cnv)$rEv-zuq53Bz z9W#&72N}+i?)z&_9Wz?)iC{ma0Gbbg{y@t0!}FK0oU6_rXwrKkf=B}b{iF|MJ@92D znlduj$XzSH+S~xvu5n4?F)L5NS}>05sKQvmO^Jm9E+L@jxs#oGUo1DXH_;m?=K_Pb z;ejy>kCNpankCwYmd<6wOV!=Xtl%Uj9yL2|=;)ujn$CS`4HK4|&7ET^VGM#=ar?2Z zIY=13gLFnSj|*9 zoRv6vLKgGFLE2LEQhd&|I}2k83T*Grw$(Q3i=js-<%jk{iYfW?4Z+*+Pnr7}&}SEN zy{)f=XX$r+*%fs%X=*#8)JBSjiZceX`%uxR+o290XiTEBBj%zc)M{Dy=bG7#sW7jS zwv%o2AhD-+_4CFkTdVsqd>QGz&_70((8}*SUUh@V)RB6_?V^*Zp$d)i9MY>k!$r+P zA#;A%J?BYsLg9IkDD1d=MCTDr8UsmPgDoa&<8M7$hhZsn*R;J?XCxf!OQMnbjgO=0 zJEUZZ)SM6W*=Outw=tlFB0L4eGTrpKH{NtJF9u_18bBN;;2p zh8byD&Z}hnz~87Gu=Be>>Xs#Uo)nKr!V7V7N_=iN(t^>7^vuVy@X%ggbZXAa`$ZJ8 zC18$!1nikVwULBE)7C*<$->yDdAClzx#OhOX%zdN5x_i)S{)lLzW0r7PU;Gvcd+;P zn=RR~ P5A*Si?<24U5a7+h&%ob_xp`m_jsbL&W8Pw8`G%{acdQR02t|qrDCT09 zdtzf@#lQJA;Sz)#oOz|Vfrd{7k3fI~J-ocX_ z`5qRKQ_ZhRQxDk$^#~me0hMeKs#;=st!ht22Q7mv4Wfi=^j&3etai8wLVojT#Kcjn zynFE3gc7CB?gmXtf)U6p%&!8aMiT&kxWeyyp5hi!YBH$!!BqC8?c@l~{KT>cD=Uo7 zOOC@N@-sFTIF`e~);8PB!i%ZnLBtE`ya)rEhX5YH1vm@Z3D~Xy`ieM(NMn9}ACdv@ z5f1rY1%Wp|m;!@)l((X5I-x(2ZEXfG20+E{w0h@AfA~fRJfI19f30dbSbm%gpSc`+ z9#-*6NA4|;^$|NdJ=D<-D#*BaYpJ}rZzK5S;HGmvV>6>nX~6rup@w!E_LN={ErkoS zhGtE}C`~^oU3>_L7J(2d)WXf$>OIqP)XZ}sS8@?sbHUxWS-*9&$*OsgtQQ2|<&DPN z$U5^d7LV!gqO>IpFb@pmUdRf#cWp$EhN1{!1#x7un_x;fME%zxv$~a8(?j5;MUjrli}*MJi?;DsFB@;{#&-l^krXn%p$Y5bfhJmd zq3CVyM!qSy0!fdwZcOEL%GRoLIp21V-J!x$33qhpsFdutf1&OY-!?bVHs=7bgc@v# zi&v+>XAI)z*Sa)7leHyJOlv_KY&1y93oHmOrLm@q*Qk#x%KRg~{~L%~kzo)7#rrM9DPyw(GF__WjC>akkbF z^zB>HHby9C`lbJq6M!3y2tAN=WdfcstUlPRP1f*H?CoLtiO_Epd`(V>c3VRT0l#Kp z8VJ-YcIY!m$9f0&-CQl-6fitC;yL>}Epbm#JmjrOIaZn+IXsmBeT`w~mBA6_=!&HU z%T*&p!jmGlgm}>C7z$fi;r?1pNW&3=eenT#(J)cZS;*shM{Rkz#NC_3cy-5{T~X^P z1Z0H0blzWO_}Z57Bh2At_MC+%Qt*4s1G7aVX(D64S;g!q*q|0G`6L02FsiI}6&vDD z58PXJ*8p6i5L=i-U2fSts5VEkcZC)xhom_+`{1s=V{lpQpjd!V zo7fgM-Z*CZ$qF}_`z^yaj<#@;dXV!34hcm9)sk8$G9y@icrcc8hjb5c&yDMb^Ly1h z(Xx{;0UC}2rg-C4)3qC505`{)%_wt9;q>=aR8$zx(`PW~_(cQb*m8q82lfVTdk+4T z+wFMYy#*mASFdk+=6zCAqS)^LI<4&{Sr;2=b^t!`j7nTgnc3$W>o6aosL?6&dZNvgU#;tYy3K=owj03|J<*X}k7lvbdkdFv1&u z3obmKlngR*y1#__H{1ehHh8kgd!F7|!geCP;MRM3+ zyYkm&c8{DeT|!#n6K2Ejf#Yj zb0x3^kYPH_VRc7o8ED8yFGXmDJ0vG3sneL+s=FuXLsQPa6YH~Yd&ZliV>f@!O$^3c z-F`lY&1iT0+$?L@>U>O+-(3s*DD>WVvmK}uX*%mTnO=UWvp7j!Yo>7Qn_A?)N2}x5 zfnRy2>cDz@W?og7=JR`j#@Uv93BruRT@&6(19fM@~7H!{NZQHARwQU=# zZQHhO+qP}nwr$%sUhn^jd)~e`_IdZii;Da(BW6}*WMx!k&M|&t@Og;jK-}fP;ajID z;b4DAd|Mnr^ZqtMH6)&&j?~?^`*Qudw5B=U<{nns;eEnKb3wbl#*OVkL6GQUUl8N1 zYT%!N%#b^iQ_-VUyNJ^S%2m3LI3^3f_b;u!7WNZBbW-?S+xhnwAK;^X;F<^~L8IF)}?Hb^eKzyYyIAntr8u!~aQ&iHq7 z$Zicc9Se~mfDu%Om_c7>=nlJ!E)20GXvzyCboYj?f%d?iRslh)1G`7XTXN2$<)auB0#4v%BTv6v3HRGmozS*Jqh zLN{1L5N`Me0w}gBx!X zo?Z-pjQKO0{+QA=4m`yD8Q`VHQ>|Y+dJ01k=4h8vACzf|Sy65>?c# zFGsBa9vHA}SE(!Z?GUJj1d}LkdlVS@J!ozH$e66EX(usllEu2)&4*uPZ{bKH65igI?!?C zH+__SA%QiO%Y`c;xRFNQX6vs8cluY$ohIT&%}a&$#XpV8DCt8kbkbwCt#OIS5^BB) z?_Y$z{9AnX74i3?H=RW*|Bi&4d%U%bb zW-np~7Z(O)tGE_(78TGznszHittp4I&64rnAwdRoF(I$=BUQtv4W^Dp*TB4K18NdW z3>eiy{Yb-G;o^ui%s|muZXYUaprcLpZwBE7|*7-d3ykTto5Y(MeK9v-E(2 z6Hyd1Q6MJ5N#AKez0Psml6e~S6i0k1XiZRzB^5F;hK0vP@_FhMmhbW9uwpyOW`$Cv z>SwXQ_=T#LSF~&LjpZFhVol zqT)6pO9%xAvQ_2jabbY^&v?L1Jh2m@&yK| zKm#`lrd1Aw1GZKQO7RQSw{d&6hixULnrQYcVgN4AD^tNJliWvu=x>j+Unb>Wu=f5Y zp65!auaxNA1J}y2JwzS59N@ghBNDwSI^h)aU@8SIb@Z~OA9)B;Z-ZCb%S>PCbPtKQ zBq{bs)3mxT=4RT4~v8k(1>k+>?cvgET8Bp{5MOu^He z756O|+F8QJWEi3k?tZlH9(be|5l0g|jnHB9KP`wPP=!R}P3vn|LpMm{wd;yE=!@7+ z> z%X>2|(ke}zVqdkF+fMFZ-g9#&Fnfj}!x(KaKsBM`blgVwMLIgdNbV-4NA@b~`R=(b z$L7IgJw4;R?_X5%ly|n}KS$t7*&juNy{{TPVpYE$U=L z#IZElPB%%53D^0A&}nUHG25^!yBio6+bzh=%~qE>$Q)M+7rjB;rg_Q{M)_%Qk~o_elRLaJJu2i&}4 z_2Rq>Qy;pS3uq@M6wS0eraLKwx0t3;X_BEbsz|)#Y$R^|yJ4kq^fxQ2QjO08)mzNqd1LtpIm1O&q zHXZPobvmTw0?OSv>H?6+@BzSSqQNj{F!r)=0>Tbqm@vxZyN3&Q(GRp-)%QaG!l59K zC}D)w9nCWm&RMzv2F~}wSY`dd*E1w$>SGX{EC7=N@#r=0Gvb_2K)kQx;D1lMmPu!M(d9JADe$cE%8GzQ=;Bn>*rJFJ_U4<^p+ zR(N2;VP}IfcffiKkFB-3e=D5jIG-_rZB~7IG6>2E8n&8RBsojfDiRvUI$g+3}>d??`xSHN)HHb$qySg}lYWkQ}D8~E&Q>L=6h zkw#K}{Nco0Xw1C3sUGrxG8uYA1(ui;!(_wk!2LDs2zMJsz8s|i!)A_UNo+-nT}^6c zU9k%k!CAROlEVO}D3tf8bVvBm7-V%7QAqof83}`+#eMvGRaJcp-cF`UlZN zW?pPl!)ZIw=ZDM~f75G4loRW=t-!hv$+?idQpE7X9RjFEaC(PAQ4L~@3_M9##FL32 zoigaV&z!|>|Nds=-mOAE zedf7afKs`@ya%#k8nYlc2UMnak|s*uRC)xa?FsY5~`5Bz(k+Lgn0|D@~64^{XQ6HpSk1d%WVH~Il^@P%-Dz+qwWm-2!M2czx$>6NcgjgK)YQLAePo%A9q;=W% zkYb4AqviMrnM>VpgW17gkShyMg^3HGd44N)(OTeWu6{d9;)8n$Wnvp`w5tbF3AT>} z$wWh>NVOrv4oTqYBY59nm4Ia&>=3Dr*9l@~R5z)-h_6v}8UrSOPm0eOa5|pZ$=|6y zWg80r#xoxdBu-UyC|Xg8{GRtkX-0sOqHf0+sz{syl%PaiXcV!_*F7Uem1v|OTnXb; z1-SO2M-edyN@pVp5<+HK>`f zabsQBQcsq(VJNMXzWQ{zic0E#%?@k9LrKQ+Xp_J(mQwHaqia?M)Vq}_diiMS!vtoX zHQ@Hot84v45m6=LAYZk$3_GkdR4pw)O#ucJb$Gtv&^nC|hD%b?PbCRBPNgSV;o+-| z^Q|flLVFN-lwLrHR7d4l7ukE+7sqr#XoW}z7pWW8eRClO$GBGmJtga7(33=5#2sr< z)+%)x%NN;Hu!=kKRv49-^pJ$!yO3|pEY3pR#G^n5)kMNgux2YfQtDL)f&KdcDb|oE z1bk}kCp-WQy&miP;QhmIJp!4lqaj~<^1)jjVf7VK8|ao_j^krg^|3%8!p)*gpp{D26`!xbnW6lNZ;;yYNjzdEl_CRl_Sn;O(Q=ddSz{_kg&y_3~f( zIv?bptZ@uSO?prGKuQ(%dIqmYRgO<`e&0fr`h$NI7YL@9N6+ ze}`TiZnk_Qzo(CCjfNgm<3qjtsf&Ex`9i4k`_?x2^%?d;D+c+3cGJyfZtDSar5s;8 zP+t(w-p5h9 zDn%?#*Q~sgS*yl-HwuYGjmAAZM#}*?l7q;OfIu#~+GjZKPf<*@-R32^zIODutVo^S zb+a~kek0Ja=7F)j=k4ot!h`|F_R(meaVJUS+5$<5D`>!ssunh?At&Zn0PQLjLP@Ng z$0#m>QcBE3s-8m0pQ@x6$;5XyLhkoH3mHLO%?AJ?AqKXsh-OX{r1)KmGtR+>Fx3@{w{dk$#8Yqk_^?*qshWIJ{6S-cO7xf*)HGm zL|k({va-8bYYb-nEjlFq^br810k_zYR(@0t(uKE#7(UGEZYpHzb(%E?R4APkM#zGu zxc`$F)$RH9n{1~ZghbUZ)og|WjA39$fZGKFrYL>~_y-GECE_sT+KI8O1Br~7UPj0) zkvItBHf7X6NH(tu!vbxor@pGdMHxr?^Y@I_?HrqU?<2Z8&_-2|(^8eN>$$Ei%;gvJ zh+(k&NMG$##Q0g!uP-hmJcR`T*m2e_6Gy%5yygjxi)S#Fy=}}D9Ba%oF}P`5DrvMF zMR|2js`aktHtN~;IVe-Z|$6p_CJf~|H+2&!>Ii` z?MF}l@3h~)MnC-m|B3da!=<8Uq5a|fey}t)R@(oK^%LTgR}fU9Q24o{cGNd9bdZ#% z;&zzqEo}XF&y#9@YWBM@> zFtO7A%>CI|fA(Qv!e#h5dq2HIKb0;Fxb$rQGSe{qG!@bRt1|4Tjfv@}+=YqxrvT<( z%~_C)^eniH40N~*KbRWRPqP%$&zR+(Ph$EZ=r`b6k*mpnKsI2zj?Q+P`!0xWr}h1e^d&hYn6e?(~FPaCJYtoQX;X+&u~ z`n*zuru#gTGwb(@=Ma`VhWX0uR@=c@e7bS>&`KVY%g~Dx*3D+sH^w{9&{xe9iaC3b zM&kbPSGtSQ#oBo?^{eUdzA?HvchvoFWy({PQj5iHql+=vi{WbZx;)3ZeNFG4FVr^g z!$+2iSsccy;ji!&Z>Phvr9=XuM?rM+R#ZsM?KYPehSt*P);puB`> zWny#89qbGC4M!qx|L)wb@v8o)dQR%wP7X9bM|0oRBX`l6QLI?qMmf!uDkz z1D72JPrHa%9eWc|t2&OhHBDEQ)r_kTzFa`c(G{_(#fIA5DB^Gbbm=%D?SPTT-|uVw zJOw4!uxnho)WnPIM7bzdbkc7Pq79d~m04SC%QUvwDbRUu9cH9utes&gPGmW^0ki=) zq7W-{PeYN|LWJ~{g-$~mxt$odCw!Ccxe*NKTH?xg>KRZ|yM`dy(6StWMEi~&7nyTWJT@EoYTnTC9P;nBWFhd4&pOIhJ%gXUZto@yupV6ugke6k`$k6N6N(c-bpd(#(xhB;-V&ngp=>$2Y%z9crSlcelIU=s~xSkFe}Z;;W}hFZB7kFm=VrliT!d z7p}Jp%#xwp5@$_<()3psRO6ob9qR~>W~+s#*A7<7o7W@hSiQc|v?W-=0c@VoPd|wY zk~G+R)_EWET&8(4IhqJ`lr`RUz-rydT#UdLWj{^7lYyg|8stC`$JQqe(Uz$IMC~`M z646SzhLoU(JJ+h-78#h^c_DHdOq${E!B-LeNMVHMMl>dI3sU0;pbV-k#z5GTN$bHX z9{ml}piXtTVu!uqm-&k_dcT1|4J+LBa!MFr8P_IE9wlr_W)>byKo|F7x_JUJi09LqdQyxDjE zq{?YbS)Kw`&VE%+{@=}4_|$o$eg>*_#H%S5;#K09l&iEBFDc`E144}PZt>{ z7YGD?XhfJn+6%aTFj>3QyLU3$B=7GhH1HX;ZPj_x+vhwBP^|V2&^z4Uxm`&|Nk-6x z*O%Pi>n%CU-%TGp3+wBCy9ei^9lM2S(KPwhakjGhF7#OlQN&{7fJ7LhysUEcRg_`o z3A}vMHzY%eFv?xekz3n;O4S~EYLmS??WWE^N~f1^nB2Qw^xpbz=j)OknVk!j8g6RO zDKv?gzF%x6p8}t)y)HTfx6RmWpZzrF{pfD@dERll2`5AwLeC5olRA94b2gxh;K|;sAl_7xOeyCTeV~IBk3~VFDWV@8ja#tt;j1Bj%^andX4MA zuEr&~WwWbjW|Gg#t2+Z~UKXtTTUYP?!BaYwr+^HsW=Wc&>%V9!*e(V)`zI!FS z$(vo(5$t)zP6tn=ZhyZogf57GddGXZ5xPac*QjQn8wAe7 zv#abS9q?zkpO?~n2kG!S#vCpD=J6+Ha&{))&6j(G_1q!e(XB=0dLR4EO_S7Zx@Q!d zyITuvM}PeA7BH-J)9!mDN=9TRG@s+c3nF7}_g-{oANx-|#F(SO~QzJq5qI@JCOc*gTMmpI_m!nrTwAEBvw( zBM6S9k3!)S-UADJ)e@hKP~~3aaz4ShVvGL!~B(RB1^GL%jLF38*fiP z3crS1lUY6vKNI7uVSPqud=`k+^#z6bgdQ7%bd*!r0#xTkS()5Hxq&cgLFXk+`oA#7 z1^MYVxwEC-hbt+g!D9S{ESd45kRpDE(Wb1+h{nJ@f|BrtNBqHpK7eHhy+EB28;+)- zfVi2K15<`kP%aVIepw9wf|Ak(_0tB-`a*G`@&8;HTlnDKkxSeT`#`apS3K4m0)mqK%x!iDJ)~ za>Ua@HG^&pTnbb`Z3`FdgQCZJr>^V~8VuU5Mszbfv! z_|C{vol@d`%IbZ&e?c}^piKT9Ya-CVw#3%Nj=Y4iiiL3giaMgDBhDMb8x#MAK$(gH zlK&?;4rHf5kpN?H9vuYd%yAa?)__qYp^)G~GC%4qG*7nDHbg2J#&+J2f6rkR-gOn8 z@9@!KHb(cMeZ6H4V+Cska|LAu$Au)Pz6om!)D-cu3pN{GlAXq&;AV8jfwmJ@1+@Z# z8Fbz6+>d>F%#QkEfYpf&Ik>-A#E~eaj`k0&e{GJ=-|aq|4Wy)$D-K|$vuln8i6>77 zdmIbS(=vzs+J=yaPRsnx@5DU(7695PFkPZk_Lu;ss8s*NFuS)aQ?uMAeT$1`(H<&-g$h%Ac4?HuMo1X3+I-v^)v z4S-?`Hp95SmG2&Ml0ABPvuRA@{QAk(sZw^&B8nr#VvUZa#RD^E$CibZ@)^Y|%nhcL za$}uqSds$~zy$(;VP~1*lMob#Sv>w*N?Np@JqqjxKE{b6A)xELY{cZjTd86*jd?r-XeGLQYG#_}*9s$FD_Vb*Gu7i{$(>U-{= z+A$d$Fl??6FVS_~Y6$a_Fv1JJ4to@ny+ESjlU$~IifhCWS&3r(35s)=4`Sn!1XXrx zZSuv(0x9^6HBt)*fz26~Q!|V3k3iJ@&Hcyxz?DA^xmg#wN~(K`X|sa`Ey_vG0I-@l zwP{z!Z*c;K0gEXW;6)4w0pmhHLpuORw*jJ*!=B%G(z@Ovo#ik(Gat{bk5x;f zuaT;wQLC+_J&P|6vfsDWJ0IN+Aa@GDnVol1?7-QFrt4Z7=b3f*=&2|%ekt{wE}W}j zYt#;^?vi6qIs@rrn3bv(PRXk;HkMW0h~%H{1V&j#Ib)0Y=Fj5gcyT95!0pI~Isph* z-WFJ6k;5@2xpH)-cdB=`cVONFp1NhC5rZVDnqgHdh;D&vUQGt2#Hc3S0e1I-TJT58 z7gv-XVB7FKo`WWCPqfxa9bcwuY+M{&T4lA$B$G=n^J|D9N4xU^!eaEZKv6lkqnG{` zK-`he6U<(q%keu<76lz0`t*e;FzcE0tZrZwXP|0LM!7ASf>tjNG2q-WhKyj4=&@Nj zB}rl|^g_(IzZu8*wlp>)?KY)2Ufy!Db{BI$rx;xbL#dbQe3m+EXz}M5EMdr(d-t~4 zUd|4B)xYmu#}WC>nh?1IMkQUfK+$S-_9P=p8iKoW6_6l^#Re_FKe=A~z}|1t91G?LML-k1! zOc=qBIFu{Sj>-r-Cu6wPs|{kKqGkxd39^I(Wb;4u}qYLE|W@WVIg^v<~g;SF}|+zKAJu z6!d^y3|r5yV-@`w(Aa(ANd%t;RY2qn+Fz&^ehFtrtdJexYf;=DFRd&6GNa4Eg_zma z_EJKu1;#R*V(lKH_mRO_@2~02)4NBb+r{L~H%pHcnA)pv!;i~VA47{{C$^hZJS+9b zql53lJRi-=-viCtcc+fdUX{9|(%0gi9aoPia9k~RPsA;#G4H1_@6B^|JX4s~c2jsA ze31x)iZf_l8EREaW!Pn7;;Ja=!)h3M0tHuW%0LkufRVVTrJ4?&`N=>{oo=Ew^gM_$ z51{fY_60V=m>k&Yg{#W3l{y2$1KI){!9PKs-lCu9F@D!0OCU&)g_IW#fkU`segi4c z@Sli2%~aE>Y({^a(^O&%!08bgHYJWH?{~`^b%yPzm#vos%iSy08Cj->V>2V7cM~;C zvv@?r>Xbg?>?UVAt;Mes6KXGiN)q!?B8&~4L{J0Nca3fO?=9$Wr-&jwjB<7n;vBwo z%k0g~c*Wd~l;b|qDUA4LTDQEF&+fmP6PjOu$xi%6Q)Dv7G-~wpD|5r9Wp^m<7hfGj^YCTzBm3U+QRTvT?eTWI;9KkH3m@rBIJ7J5r=Cwl*i-1$S|7zHnd zPy7V$x231j>O&PqHHNUZkvcE2r)OMF!4?mV>p+|3Y>%QSnzL0SWU#a@xBn#x&a*Eb zDuWrsfaT9ASDarEE<;j`wNAj~3&q%}O~g!?yT#U0K?fkI@Z$xL**NTb7UL>IG3lEz zkuO>_Id7<3qrOZz(!osdi^yRVzzVJe-W&`#I*3x!ja`JVtL8H)(=96!Lbx)p!_eg> zk+?xR>hK_;T7uB5QLu1*fdOnJKU3F^-4D=A5_7I)wiB}Epnw}5MU`aWIj*OMwGz1Y63{vhdKd~92CZxg7z z?hZVV$$e#Plvoe`5P#HZtHUMYGs0b>kwHn5R}x~O)xvbC~*VufSf zcKqXyrz0Rj2~DO6%E)|^M)H#WHKioOR@B-&tZPCTM!0)atUq74#^x2h>e_@DS!)oEQlAn zThQl1PD7laPbIPbUujTUox~XO9Z_I}4$5NUVme_2DPvrPbkl>|w2q;UrVd9}GsbGl zYGP~qt*;L6gHy_A54krGzzU5p!TSS~`@6clKJ9X&!;u%FV$@LCy`Zi<+pn%T+qqeM zyK3sw-z51EE~<3j+@;~Si*p{#XF-30qtldje|}6w?g+AaU<5-2bXHywfZ=faNIO}5 zGj!F|Nd#Tb#ID+IJEfZ`-JWh2giFcd(_N*`#>^4(kw9uw71^o zWT_Y$Wq6+4zOTNv*>PT$iXI1WGA1!ui?#|rqYQ6Q%imQ%hc8%^G4TYO-(M%Gvwm@_ zPB+z9R)EPjB-}FP;OAWdI;W}|T4C_EIo~`&utw4%ML5TeR1CCe>ydeqo2}$JiJkZr?dYk z!jTJ=X;qNv2D;VYAt%#s72ae;Bhg0n4!|8Bfg26~2(Uu^2fOyJw0^9ihCt}}pa!uyU4`sP!!(mk;t#( zP+nG2hVD>Sepx^YdzV=10@B>C#M_%>3`7&HH>a14XH9sn4_Y zXs-V5@#7n{ElEZsxuRy=XR|t7n#Qnx)KP*CySN465j$dU~oD_|koUzNc=ylx)~B0z}RL z2P=`%3yhaJOks;&e!5gHSxl~TPQOX}cmzdM;1;o;o}Il=~7}b{GOPWOTzIGZ&RYCDRlTBaBs_ zznvgGOX>h~ZsQ4VQ14A!fHneo$UP*8(g5%}NLh2CG=1_ZHvzZ}N{UQM=QC!KNTQml z3c*{s39~ylqO&pp5g)S%Vcv$U!g!kaKtyoDa%_6zsU!*2CTeD@PhUtJ4VxTu`s0Hu zSQm5@$buT=wD|CSbuf!d5 zI7~U&%b6UIPXCTg$eVoQfZab)7z_L1{@I5Y^Zx#IX#RvtenA%_1<|46W<$oNFDEl&nel=c*vK6_acBhZ}CqoNCn#U7L~uh%lqsH}8u1~Xb1Z8x zR;r9@{H`MI_PKBb4=nVrV1BU?*O!40?X@#xre}S=@(^GVEdi~d1w~4DATc42 z1%q8InGkSFC8pu#ArbW%$s#ZydBAli)_gvpcSo%0(vcm>Grg z8JWzmmSwY;aYH-){_u@ZY;QcXbFNfR(Cv~5;Y$;yv{`Nm>{_#_9*UGoE=x0qIbL%@ zvu0>H2i4v18K_ce*WLvgfp8{QPjpVuha}EhW@EMPmuMt7g1?Mc6}wS9Bj;z`D6(n`Q1G-ndJQ4ez9)YZ zhoZUr8zY_8sx3%%hECXlg9PZcmP<PL1y>1;yl3tA8ZVjGKEy*xVnCSmpI# zVRqfJP<83Gnt%CqN9Bl2$9l2ZLvp4(N_=DNY(_UnKaj2z zhf9(`dh{JY9U+F)P_8gR8K)>OmD%g(i3@_#W6W{l1~5}LSJc}Y^PXKu;@vk8!s7v@gJLyKC8P3lOwk?=Xh#SUa!BCi=IE03$O!u^!-!C0QOK%3t!+iR65(oJCu zmq-&Nmc)zCMGZ$C8q@cCjrp^1-uIH5DHk5^`ZWQGbdi1p?tZvxIs*Zj%2Vg*DJW2( zqvT@XqW5xCleRnlocOl%rf^^ogUAp6gLcNz!-{m^`TcLin}65LrqhmrjSWHu!t0AgeG>fsQ+n z-gw;_2ex~2ly4*8O|Xw%%*A0;RO^Ikx0+rfu|uv0+go`I#^;%6jtKYDzK;nHRalD8 zoZl!S4VoWWX9)ZCA-d2PSZ5sEry&BIj9{hN5ZFhO-Zel3bf<+WOyKWA010R@7#eV* zoOPmema;6P^2}sMUAh*=yL<89chG4!fnHP04S{vr`~>tlEO38acax#l3RS={%M?AW z(9;Kt2^TTjRohD7mqf5H$A*@l1(=RSXLJwAvmicO+wb28k<;QJgE(*Bi=+2!73ZtcjbKC&jO@z^{W_BNmW`%!8amPMZ z8i4?~`3I_(f7K8Oib0NI0r)V)o&Sny55|JrjiV*0#)|`}k%t42QXvRoR&%175LX2C zGoulp7(g?ip6+0izcoICwdRG8+}9W<e z>kUo^bgGUi6hrFig2++^XvJZHR)IMOO{R;=JXiEeZ8JS%fo*Zo3%jw_9`|-JvbH>o zB58kuMlsL)yqWYU75oir_^b`#?UrIcNzkm3K7~MfzAFuPY|Tki0z1h!M>tMF<*Q8G z-{~5}B0dQxh?kR6PEZ63mNIsqKMxqjPPL845aw0DhQJ9%0-TRzQr6|{K(i5i?D#tJ zKB0@na6-wWg<>69{X>6iiWH()Q6OL9{h=>|E-+fVOX#3XQdGP;%+#9d06ABn77K2I z)#Okho2(qOoYYJ&XWvBHoZlSZWNB}V<6HoC-Q_xfRlGOvm)w1_5mtc#n_4WA_3PEC z%U+lSAcMOhW}EujGI~HlPc}lXVo+UD{;-x$0##{pbh2-H{GN}R&W^@7clcA9gUj{T zhn|U$jC2|+RA_#F$-X$zIDN^&@#rSR*vm!|kB zg0$WK^nv4StnAr|`}JzVI5`whODl6SS4w(!UoSM3)&wE?@(2s~KYXcGfKl-gW2T8eOBUR+nl2*E0nP^Fr? z6jbiOZ3RmN?Tbn5cge%%;f6In|HljO8U7=+B*$lA(Pa!2!pJmRkr&h_v`us3Y4a!0 z>t>0~Rf&U`;W;5sfESieW&W>>ByvCivA6=|00^5Gp#oSDc>wg7G{7Dbj*)8sn-#u7 z;G8u0>W0a@3FFV>UEd7Ye4D@ANIl1=CA?1v?@!hMtYn=y0NHAEZ!k(o6U$<S__Z@*Q3A2=UPFB|xE3vh0%efNTW5Pu~)_o-bccgu}~+Lm_%ZnU|Y ztKl4@gSRmzawr6gr|=E|Fr5mSQb-{WfM%->0MMH$#DS z2;mC|#@>3|0!lGDHly_sQr=xdD)l`N{2 zHRSbC$M5+=iV)2S!(qiPyl`a1E=BU5ySe)=omtYiG8R?!lTZ2a{cWGFfxCic!7f9z+3Tj9i%gg2P@d>Hf>>(aii!gv5^R&lETb zKxW_W9L(T?rpPW?5ByOUq|B5-US23a2Bgkdg;R}La)}ZaH5|OZ0$T^5`&j50`SUE# zBaV07Ft-Q5%BGaf1DYUKN;>e508{I*a|I5o<-tpJ2!- zd>kR*Q~HuKFNvaE+$>x4>6qFjT}VuXg;Q+sM$A$_sL*Dy*nyj+ z4Ok<(VRk_GzZqjGJCCw_;lQv@<&&b{%vclDs+Q?rP@8acNG4?Jy-MH|V^4w4%s*I4 zXk!F^wZ%DtGUii&VUnN=?Kt`1rE;y8{efgHbn(c-cRp%k<4tmCR|Y z=~MzaU-&z1_G5I#a1VosgNldtg1dU)sMo5Zx2g9Vr4tBJh9`|)KPodp=yl_zl?Fiu zA$R1>)1YDbW@C0NZyjw5d!1gN-nVYC@9|z^vv=pm^q6XgRMagrD;S#Cj0Wz` ze^#(%2g&=Npi>(K1j{vfD8$ueZNlc1RKL>j_8D9o;wbUNQ0bZ?{01WIU{%rr+ZtvRXX5lAnaTX>eC;e_)#w50{?>*&5gGL#f39>YbCQH-dNlIr) z=PRZAEh!N@gS}g$$w>r6jFtNe?K(hhSzulvLkeugv^fg8YXxqkXUaQ+JISYKJbf1n zC*?f}&;N~g8vE`|qYUL^?>_CkJld8uIaz&nzP^0n4Wc&OrTG@G^O*P0_DkYJ@Ut$+ zhEwtvXy0r^$8OkVIvxo{RK?f%W&3LkKT0yrwHBxO2My-;-O>gV3o;e@)6SGKPRCc0 zWc$+h&a|qA=7-DeL34EBm4}YQIPzEVO@F0&H|U?U0LwoRT95U38>WK4H8lo|7FxD! zLot_)B4$NlQzBADvdE0$eBl7x$54GPbw|uY@*!$yJ%LF}mcY(o5CnPG$iDCxA;qL& zK?`qGz(@IrXKeQx0y8L|GUW_KiXnuhMPGqq>S((mQSb}!5gt6~kZTu4E<#u5>k}hD zt(j*dt%!XB&}IBbHMNpWdouBV@}?k1eW1j%FH>XdA#Bo0hT~v>M&ke!=jxz&_&bZ@ zp4>~i#EuDynl47Y3Z9}lW8NP2$8qeeCcItODWplP%eC_|uXr+f$R3Yw7e*DXfej75 z^S?}KK6HLCwZNlZQ; z;jon=m{Z~YGLweW@p#iQ+VdrNA=m>L&0b4stJ8X9@cQ#(P&t{qHUaJ%(agz%=@9S? z^esWUXIU$0G*~UxqW$_YOTyVRGT41@UO=H zKu1r|0+%V|W?1ELz~InFKT7 zq2P=EQ!E<|TeQA9(wzasrl7w^6ro;N+WMb&Hf>JGMgWH7yO+@JTUUmcZ7E}l{c5hc#5PMlEGwWJ*gwklJ^QI8 zv=}w)myq#Aq{?p4UA-?!wVN)zE|V_XGlKa;rOZa1t%DmzW`RbnrZn3aoD2GYXt$X* zD-fJSQ(Of|Fn)-l&n)^Y3yMlNxG0q7j( z{Q8g`G6e|9OJOL6AaW!0A&46SR?)`89DbR>@DMs~P4im3E*}27GDFc_kiZixa*&Kc z=K#qljR%RwoUQY@b`aHxfnZ!hKTZzGfrE24(^*q$nk?&|LYtqV6MzzbS7N;cMwpu4cs zT@c;arePQ><&`8w6>6SaQSExmDG?LzXwNimpMxfuzf76KV8l_tYhOEE+zY+)V7QVJ zJK9rN#C@^`C^b!!0KvMG@!imnOkt2NS;i+qfa5s|)2R%WP%NK1gB5#$<=5VqzTU4} z{?%R%&zGgT&Kk2ji1p^ike7o?MM>2t!@^#c_W;hEwWn3;?j-kyFbqo@GCau+$3nX10jhAqWgSayo0W#pgJHTWj${_ zo|EqdlESE2>qZ=6=U+F;dcBGp*+>h<$f${Ei>OQ} zjcAU@l{EBWBLOqG02wvrEMfE{QzN%?C-yoqmG2?n_61R6sRMBgoM_YN4QK@het-K6 zWU}D2!bJ2ukCG-VQ@K*l-d2)UnpC7Es2q~>@vC8=I0IF@9bjI_PPh~XWh27kzMhVFm$)(8} z$3c$)#MAh*8vbm(6d1LLJCy{@Do+44LmidL#4*FybvlB!Dh5ThAyCc z{o3td@TF;1xQqV2Kid0a^OdT(D(h)2{yWb8P*IR0y!+kb45zvo=kQV7y1lg0@sX;O z$D-BiE1`X#hq@ELA>(`eD1EB`Mg;NFY>r?V>ohq`O~RI){jkStNQ zBxYZ-@B5xTWH;Gr3=xG$DO<@d`;s-XWzCu`WU`a+i0q|>WckkYzCCZobG_epeSeK+ zesiC5?*D!6bIv`kYkt3>Zx<p-h_hCZw8IQ-D zsku~Z%uGy>o}hb~*1(FtkSMu-g`uOis7V zYQp>aqkUJ$WWNL+!%{4A)70Z|2nrv|_C_?{g!|w#`l~G3?PWB|?~YM0QXZaXp(yoH z=fYm8W+qSxP0(~2eK<&?%fEKmgxGjMT}Xu{P`qU8_(@}3<6=|yVWk(xjQI9*=onLP zj<{{a5umvjz7O{Y9#@e4mS~ul*CxwojxNu=vKX7&@%-+((^6C}v{Vd`(@>Rm$Gqh8 z7V*+>_Zz%)=ww;F@yzj>j^X)B3(Y^ViT4A#2yt*uszMm+{jbMs&2!KY9rF~SY5tKA z9!e`QitK`?8AV^8Uu+l1ouh7@YfFKuv zqV0D>D&IEVyWk|1Q;kguaU#t#hvH}}dHcV8O_JC&J(Y2*&6nFsN>w6*Q{wHtDF4ol zQQTPUtfJ*7ooT7>D|VW6LNfX`SJpb(A}Abr9}=$;H*#RJ6C38a3`CBT_pePMCrsbi`r9r=2 z@J?PS*?#szF;6o6CTsm@?@`<2vTq)_t({UTb!PixQf7&6!n%X|U`%JBQGBfJhw}e;GsKa8~mzyrg=N?)qE%3t1wyd@qxy?8!CTIPxjsq{$6)TeF} zM^+L~hCCWhgRtakJN}T=xh!vXssOATI*r=oq4ftHPe_y zgrCYwcfEP_Z6?Drk2QB%S?|`P=+))Y4KbW$IrVf^{Zt0dW1!AQM4=re-t3E$gDboL3`C#; z%9UnLT*lwN5`d;)|EuqzM~U<6AA&EBOimx&VWQvP_i8^SU*1wyCyMdC+x3>Hm$MIA zzDaG2gwWcDJxxdZppg~6!a91#%7iulx)*P=x|5es}bFu>Ee(xLNS$pEzw-C zqBqw3>>r|~Eq+b$LKcOf@WbpyX(}bBRz|;Ciu;AdF1*L*m)V{O<`3N`-ro`|9H3@x zwVJyVVjNqlF09$8x-k0r{F#^rJpG(}+xi`a=yQqD(`8;*I}0ji%F-KAbE#CRA9#da z1e(3sIf`Ng@@bX=Pd+AWmG)UOvW8?lQ9Lt|&8z5nlTu$-Pb6sjta-}L7iGU%H}Ur& zDy-TRLLpWcADeUY$UV3`k=Cmk+xcQ)D?O(#uIUs*(SDycLv(i7*p~A{_xs@*TRiUk z{mB~=FYlG~-M{Yp3SFo1y$)WceEy(>k8r}E=|i4JdEpF`4*}-%q*pK38ZO7wbW-R3hHB|u=paZv2kzK+>q zhkenPRj%g#67_Z(x0aGo-E|}l=#1E}7JX$U_F4o`yC3k-pr)L5NKHv;m@rpRns1bp zqtNf-em@DDeixLH1yz31;KSD9&HCu>ab{xlJr`mXjkkQN555+b;&S^bYm_lu{ak0% z8|8TYrD3-vYbD+NizOYdO1B+5*7Zj{SPLt8quz{PsY1E)ew%CWTd;mSwM|{px=L-~ z`*7SnNStvhX@|;0hfAQfqv#7p#6ltuu(?4hCs;lddDOAg+fR%6@qE}6{9dekw1&aY zKuC4MukRvemDcOB(E%X_y6;k@(M*HhO|Yie?%A&&sR;^ooq?He(dMQ#9}Nj?tJ#ra zc!iuKJ~$?{jX15OmagC1@LKbt6-o#$)=SW&7G(+Kce?6{i)*A+6H;yY(95aI$K39B zkfigZMfv@QF-L5`wxMkir*!^p!z^tU>J^Og?A^BOo)sZhp2b=$@v4hf`iAt zux=b)@824~UelN-HvetI!^kB?7muPCt)z_ba5-e`V52;%n54<>nw#{{V2ttf)%lPp zt@x7*i9K%Fge+_(v-|yn7ZpxwR>+6Gd{#k2FVd~YS}%L5(Mk91+!61Hqv>haiPHmJ z-rq~tqJ<4E+&6!by<ADgoAjxgmfO#upz2V*Je3;rm2P# z4a|i`}NaZSv-N;gLH7l_^K4E?paIX9RN_|ue8)`Lf~)D)h}JEKB?n*6A0L<_?Yc!P z*Cyx8=<|!6Gb8zZzEn~BUjEXl-k3QMDE`_JcGy}Y>%)efAj`2kI$?crz9lMol5t`3 zA;SGv`$pkn*`N56zIN&-+H8E1JlMvP##ya=-0yrd_>e0{Gpasg^N~;Z9^tNTt}F7BU1AsV&u#zuaDM_NJc>2?gyZ<%V8G2tStv#hMbH0*vZo}j@= znWoVcSzpncnJRV_b*BCl)MrgWBepsdX>ic8!RA|QK=$oM8pQxAnLDYl9*+)+#Aq%i zzn%hKORS*9^V>ft9MV!$UNFcSKy@f8PQ0H+QPU(hL=Y$3G0@1g?AihPGa{dcux_D& zlk<{4M0je<{fWGuUCdJ&oSVoRM7^ljY{!bt@-UMxPG_*EuXpQ-+4N>`xINhGd9;i?Ar=4de67CMnnWPG`mZi}u9E`uk&Q#GZ8;Kup zQlK<<2~wSevgurmZZ@ko>$z-9+wXNo*Q~|t!VOIq{^w7ho=pW`W}uB>WWfcTN`0#n zd9$3@1QpTW;P06U-m)yKk`k1p()4-yc83OY?Mt>GR~hRi8CR|y+T!lZ#-Z?~w29`? z^8AbkGMBWQt8yGShOLfVz0*8-SzozV>KwgH=mWDy6_G^rqfX7?A7MLRD|Zwg(po)s zq8Cj~H*5{&S6^!kOfXV?%CCx-WIj7Pt%x3d+sKD5zYwx>DNA+`Au3cCXIwBN$ z46j2~-IO}cb517B$V}gQ8NK6g(r$Kp4O2Nc9qR;P2s6~1JAFFPS@-1U??=1LWBVQQ z;SjdU4npD7E1{_UVlKg)Z1mC<#8Y#6xg{25^P5DDYLn?rn0Hlo-KF`=7~BK^XB}wWHd%DT{IU=ma~5`bW_X= z+N)1I`Zj}RqgZrsvG%;e2?0h^A|jrv<`v~Lr6Nb=Si7lj-cNaC41&5cYScsXy2`pU z8=l4H1jjw?ZD>4taA$zhE~4oUn?l`zoJRp)HOkHqLu3V5hRe?2k6fb7+>YH?-M`)6 zS8+ILBI$jm%jD>fn>h(BkV#dEHpA~bwL9Uw)t?5#tPV+<9G_*w9QuA7_g%iYK+Rb@ zMe9=4)MqaV&*Ie-UT<;A9jwatm!~s7_*izYhp%P1KHPV6o6~@4d@U#@>v(-2OG+~( zmE}IF6Q2FDmeNIdtpcUX8$)JPgDu*%@SButuZ8+zaz%DndQgXj__RAMCUQO_Zj2PI zYFl%i`ZjXcywjYDh_jk-K6T{oAk4DrfF6I074lW36pW{t=479Fj?WWWf3wtMJu5$F zs+J;OWr1(KKcFeG829ShSQ_lPveCOVC2DW3Bc!~;eEV?H0Y=V68Ap8Fg9J~hun4sj z`RsDGxMWm~!ci)H+kC~kb{Ed3izf%tSioMmS=e5@X|tA>lxNF5vTmUt_?Nn3aPYDFr-bsuC-Fx zIUMC!;d(0j^{`~p#(2+N!N@3IeRt~L)eTV$BO4}Hu+jn00 zc4R%jIv2uX(emE7TqTKWRLb!z-gK@YKK{X#iu54`PBzXKYSX`x`VPE${qoT3lOG`! zPb939?ekAEzIw8+;e}^N{}rv0(3+tB`%H_O1n+~Rt-a%Zx3;kHcRVPTj+HVy#5r6~ z?@~wzN12(AHUW-MiQMh`UAp1cVhja=61nHCOPb}&O}|mx3c6F~;a`;~YYa7F@SZr(gKX#>N7{Wp?Tv)0Qwi@rTL4lVN78BR=f#55mXv z$|ijBz1Cw*$9}G&_@8mHoci9ixw=`~^o-+H&BRvY{l>$J7engv5_v!58cP^Z4Omh= zk=E~Us5ulE%v8nHdT;8YjFX;uw#ihd{eVVwevZTP{6OA-h_kDio)q=td7_;; zVvrw|eEu^1@aX|{I5ygCSu|;CK+iv9UcmcBwfCjvwHuy6{ZA6Sx3-Ie7v318m_7K; zT>8PG^UX-_$eThLM}_K>&SyvT9n{{iq?e_b1rLOj(>U{t>?{4@py3eeV3^V+m+$~Z zT|nuK8WApybAZ2@?-fzXlS>FgF%+;A94t6lKv!_A;BJh&g{u|3?&pP(#~#m8x?0{1 z608RLY0=tAYnt-87K)|H#f;}&B-6THhbmclEf1`CDF%kgnTr4g6D+DoBLhx^&6`-?*Bcr%@;3+;U#>6h@QL*0oUB`!y=BoX z{S^|=+7&RP=$4A@<#6DS_s>elIS9qy=6{2UcR$y(HW?eYZat*V@ijj9z4zex8t8+of^`n2}? zWBDEZc|p1Qa`O6&c^$G3J(~|D$h>vEp;0l1_y*^O&cw2!Ij?SX z_X^!WaaEtQbTocg*CbHv&rnNM&gsIwsFPHa{>|;1_ouqE-x#6K5ur+wiZQ6u~BzLR>I0x z5B@MNc{QH2wk0*UxHBW+`0+{g&S4rICZT^~93k;C{L&Xkp<$5UavjiLy3{0CTpZ|S zcwGhR-n$7T{v$B{|DznipaA0tUiaKil8iYJFGm3WnO{^T2o&gvM4AFT0ue(1suQ3V z1bX;?{QN$zLG;Rv>FXTe%>Cpfs`Nj6qqPQX~t+Tpq- z{swpl7+tZoCU6U$r4yBr(N@2pX6tp`6>sClZ3-}Mux$PYz)Mj%ysagH)RVTQ{jZ+2 z@vb)R*0ulvD(Boq!73{A!MKb&p z6TAn5!S-Umc!>V=1qQ=n!C|p$41i(C^95j}jfvb21vV0LjKtGKj={m^x*J145g4-g z!4PODc^*Ju5H#udAYK27Ge}*sw!jXB0bAWJI~WABXO564(uTX+4ueFH#}onsp&}m_ z35F$`BNzjThahhY z>|o?$fMLnkJ_Ix+&v7UOfgo{r{plaL4+P-UBFCWQJ_9>A`CI~wbRh3)OBxp(kh?ID zYcO*E00!NY<1j1)aC?!p#bC+j9Lyw!e4Uf-jXZZrcBE2(bp6gXK(__9ojn+gJa?f8 z7?ym^kgz>=7zC2UlJ@5qATChyy@?cOP=xHV1HQnJdt!w_ljjC#iy{>)e~tmgfcldx zR#4yzC^E?Hpyc}jXuD@Fp;#mc>h8AS{6POhe@OEEnbej%R={V--u^Iq)+(?=lDORd zyf=WsP-Oc!DF*+L8*oq)leGmdlf?k+r-0#^%nktoq=9=e^81A$0P)_Qw$Q!zi$EdC z=K}^XP*?Bv4*_b|f57&R3o2Uj`v52Hp8X05jxF;3kbsttEMLHx3@1Og0EXVPuc2Y6 zJ#7KDC#Jv^Q1btMZv?z0&dC=4>jRJ;?uIR?fZ-O^b#*0hW5E=WsPa@?>|D7)$bUVT z2L+ip0$~jfNl-D_+E`jzA#5$NHYhk2W{a=_WjxddD@pgin}C{5Qj*S%0IIWJr4uML OK$Swr$ETpBNcTT22i05v diff --git a/docs/en/_images/copy-page-to-subsite.jpg b/docs/en/userguide/_images/copy-page-to-subsite.jpg similarity index 100% rename from docs/en/_images/copy-page-to-subsite.jpg rename to docs/en/userguide/_images/copy-page-to-subsite.jpg diff --git a/docs/en/_images/copy-structure.jpg b/docs/en/userguide/_images/copy-structure.jpg similarity index 100% rename from docs/en/_images/copy-structure.jpg rename to docs/en/userguide/_images/copy-structure.jpg diff --git a/docs/en/_images/disallow-page-types-result.png b/docs/en/userguide/_images/disallow-page-types-result.png similarity index 100% rename from docs/en/_images/disallow-page-types-result.png rename to docs/en/userguide/_images/disallow-page-types-result.png diff --git a/docs/en/_images/disallow-page-types.png b/docs/en/userguide/_images/disallow-page-types.png similarity index 100% rename from docs/en/_images/disallow-page-types.png rename to docs/en/userguide/_images/disallow-page-types.png diff --git a/docs/en/_images/group-subsites-access.png b/docs/en/userguide/_images/group-subsites-access.png similarity index 100% rename from docs/en/_images/group-subsites-access.png rename to docs/en/userguide/_images/group-subsites-access.png diff --git a/docs/en/_images/subsite-admin-security-group.png b/docs/en/userguide/_images/subsite-admin-security-group.png similarity index 100% rename from docs/en/_images/subsite-admin-security-group.png rename to docs/en/userguide/_images/subsite-admin-security-group.png diff --git a/docs/en/_images/subsite-configuration.jpg b/docs/en/userguide/_images/subsite-configuration.jpg similarity index 100% rename from docs/en/_images/subsite-configuration.jpg rename to docs/en/userguide/_images/subsite-configuration.jpg diff --git a/docs/en/_images/subsites-dropdown.png b/docs/en/userguide/_images/subsites-dropdown.png similarity index 100% rename from docs/en/_images/subsites-dropdown.png rename to docs/en/userguide/_images/subsites-dropdown.png diff --git a/docs/en/_images/subsites-virtual-page.jpg b/docs/en/userguide/_images/subsites-virtual-page.jpg similarity index 100% rename from docs/en/_images/subsites-virtual-page.jpg rename to docs/en/userguide/_images/subsites-virtual-page.jpg diff --git a/docs/en/_images/view-subsites.jpg b/docs/en/userguide/_images/view-subsites.jpg similarity index 100% rename from docs/en/_images/view-subsites.jpg rename to docs/en/userguide/_images/view-subsites.jpg diff --git a/docs/en/userguide/index.md b/docs/en/userguide/index.md new file mode 100644 index 0000000..7627044 --- /dev/null +++ b/docs/en/userguide/index.md @@ -0,0 +1,48 @@ +title: Working with multiple websites +summary: Setting up and editing multiple websites using SilverStripe + +# Working with multiple sites + +## In this section: + +* Understand subsites +* Learn how to create and delete subsites +* Learn how to manage subsite permissions +* Enable/Disable public access to subsites +* Learn how to create and use subsite templates +* Learn how to edit existing subsites +* Sharing content between the main site and subsites + +## Before we begin: + +* Make sure you have the SilverStripe [Subsites](http://addons.silverstripe.org/add-ons/silverstripe/subsites) module installed. +* Make sure you are in the "Subsites" section on the Navigation Tabs. +* Make sure you have full administrative rights on your site. + +## Understanding subsites + +Subsites is a module to allow you manage multiple related sites from a single CMS interface. Because all sites run on a single installation of SilverStripe, they can share users, content and assets. They can all use the same templates, or each use different ones. + +When Subsites is installed your existing site is defined as the main site, you will be then be able to create related subsites under the main site. + +So for example you may have an international presence and you want to create a subsite for a country where you do business which is geared just for that market. You could create a subsite for this and have all information related to that country kept under this subsite, you can also set up a subdomain for this site. + +One of the benefits of subsites is that it is easy to copy pages between the subsites and you have access to all of the assets across all of the subsites. + +Subsites is not for running unrelated websites on a single SilverStripe instance so if two sites have different vhosts you will not be able to run them with Subsites on a single SilverStripe instance. + +With Subsites you can set up users to have access to all subsites or just a selection of subsites. + +## Common subsite uses + +Subsites can be used for various different reasons here are some of the common ones: + +* Setting up a subsite for a small campaign so for example a clothing company may set up a summer or winter subsite to market just that season of clothing. +* Locking down a particular subsite you may create a particular department like recruitment who would have access to create and edit pages for their particular subsite but they would not be able to modify the main website. +* Running sub-domains on a single SilverStripe instance, with subsites if a sub-domain is pointing to the same instance and has been setup correctly you can manage this via a single CMS instance. +* Subsites can not be used to run multiple websites on a single instance. Subsites does not allow you to run multiple domains/vhosts on a single instance. + +## Documentation + +* [Set up](set_up.md) +* [Working with subsites](working_with.md) \ No newline at end of file diff --git a/docs/en/set_up.md b/docs/en/userguide/set_up.md similarity index 62% rename from docs/en/set_up.md rename to docs/en/userguide/set_up.md index 0fc8355..714d256 100644 --- a/docs/en/set_up.md +++ b/docs/en/userguide/set_up.md @@ -2,44 +2,42 @@ ## Creating subsites -To view, edit and create subsites, go to the *Subsite* section of the CMS. Click *Search* to view a list of all -existing subsites. +To view, edit and create subsites, go to the *Subsite* section of the CMS. Click *Search* to view a list of all existing subsites. ![View subsites](_images/view-subsites.jpg) -Click on a subsite name to edit its details. Click the red X to delete a subsite (you will be asked for confirmation.) -To create a new subsite, click *Add Subsite*. This opens the *Subsite configuration* subsection. +Click on a subsite name to edit its details. To create a new subsite, click *Add Subsite*. This opens the *Subsite configuration* subsection. + +## Deleting a subsite + +Click the red X to delete a subsite (you will be asked for confirmation.) + +## Subsite configuration ![Subsite configuration](_images/subsite-configuration.jpg) You can configure the following details for a subsite: * *Name of subsite:* This is the display name for the site in the CMS (not public-facing) - * *Domains for this subsite:* Lets you add one or more domains for this subsite, e.g., subsite.co.nz, subsite.org.nz, -subsite.com + * *Domains for this subsite:* Lets you add one or more domains for this subsite, e.g., subsite.co.nz, subsite.org.nz, subsite.com * *Language:* Sets the language for the subsite. This affects the spellchecker (not the CMS interface language) * *Default site:* If your site is accessed by a domain not listed in any subsites, this subsite is shown as default. * *Enable public access:* Enables/disables the subsite. Corresponds to the *Active Subsite* column. - * *Theme:* Shows the list of available themes that exist in the themes directory. The subsite will use the templates -and styles from the selected theme. - * *Disallow page types:* Lets you mark some page types to prevent being used within this subsite. - * *Copy structure from:* Gives you the option to select an existing subsite from which to copy pages and files (see - "Copying subsites" for more information about this) + * *Theme:* Shows the list of available themes that exist in the themes directory. The subsite will use the templates and styles from the selected theme. + * *Disallow page types:* Lets you mark some page types to prevent them being used within this subsite (but not the main site). Clicking on that link will display a list of checkboxes for all of the page types which can be selected to disable that page type for the subsite you are editing. This is useful when you create a content editor and you do not want them to be able to add certain page types. + * *Copy structure from:* Gives you the option to select an existing subsite from which to copy pages and files (see "Copying subsites" for more information about this) ## Roles When creating roles, you can assign the following subsite-specific permissions: - * *Access to 'Subsites' section:* Shows the *Subsite* section in the CMS, allowing you to manage subsites for your -site (ie, create, edit, view.) + * *Access to 'Subsites' section:* Shows the *Subsite* section in the CMS, allowing you to manage subsites for your site (ie, create, edit, view.) * *Manage subsites for groups:* Ability to limit the permissions for a group to one or more subsites. - * *Manage assets for subsites:* Ability to select the subsite to which an asset folder belongs (also requires access to -*Files* section) + * *Manage assets for subsites:* Ability to select the subsite to which an asset folder belongs (also requires access to *Files* section) ## Groups -Groups can have access to all sites, or to one or more specific subsites. If you have different staff in charge of each -subsite, you probably want to create a separate group for each subsite. +Groups can have access to all sites, or to one or more specific subsites. If you have different staff in charge of each subsite, you probably want to [create](#creating-groups) a separate group for each subsite. The dropdown in the upper left corner of the CMS indicates which subsite you are currently on. @@ -50,7 +48,19 @@ these subsites* to reveal a checklist of all available sites. ![Group subsites access](_images/group-subsites-access.png) +### Creating groups + +Access to certain subsites can be limited to administrators based on the groups they are in. +So for example if you had a couple of subsites you could create a group for each subsite and then specify that the group had access to all subsites or just a specific subsites. + +To access this functionality go to Security -> Groups + +![Creating Groups](_images/subsite-admin-security-group.png "Groups") + +Select the group you want to modify and then go to the Subsites tab + ## Copying subsites + Duplicating subsites can be useful if you want to create several subsites based on the same general site structure. You can set up a collection of pages, files, and images and use it as a template. When you create a new subsite, instead of starting from scratch you can copy it all from your existing subsite. This will copy all pages, files and images from that subsite into your new subsite. To create a new subsite template, create a new subsite described above under "Creating subsites" but don't add any domains. Add a name that will make it easy to see that it is a template. Select the new template from the subsites dropdown in the upper right and create the pages and add the files and images you'd like to become part of the @@ -60,7 +70,14 @@ When you create a new subsite, you can now choose to Copy structure from your te ![Copy subsite structure](_images/copy-structure.jpg) -## Disable particular page types from a subsite +## Page types +Page types refer to the type of pages that can be set up on a site. A page type will have certain features and functionality some examples on SilverStripe would be 'Page', 'HomePage' and 'ErrorPage' these all differ to each other in what they would be used for so you would use Page for any pages +underneath the HomePage. + +You would only have one HomePage for your site and you may have some logic to only allow you to create one of these pages, ErrorPage would only be used for error pages and would be designed to be very minimal to work in situations where the site is experiencing difficulties (like no database access). + +### Disable particular page types from a subsite + Sometimes, you will have two or more websites that are very similar, but have some small differences. For example, a head office and its 3 satellite offices may have 4 subsites, but only the head office site will have a "Company News" section on the site. In this instance, you can still use the subsites module, and use the 'Disallow page types' ability to remove certain page types from being created on subsites. 1. Create a new subsite as you normally would via the Subsites section in the CMS @@ -69,7 +86,7 @@ Sometimes, you will have two or more websites that are very similar, but have so 4. Select the page types that you wish to forbid from this subsite. 5. Click the Save button at the bottom of the section. -Note that this process is exactly the same when editing an existing subsite, you just select the subsite you want to remove page types from instead of creating a new subsite. +*Note:* This process is exactly the same when editing an existing subsite, you just select the subsite you want to remove page types from instead of creating a new subsite. Also you cannot not filter Page Types for the main site. ![Disallow page types screenshot](_images/disallow-page-types.png) @@ -79,4 +96,10 @@ Now, whenever someone wants to create a new page on the subsite (the 'London Bra The page type blacklist applies only to future pages, not existing ones. If an administrator blacklists a defined page type on a subsite, existing pages of that type will remain on the subsite. The administrator (or another user) can later change it to a type that is not blacklisted after the page is published; however, once a user does that, that "grandfathered" pagetype will no longer be available to the published page. -For example, say a subsite user publishes a new Company Page before it was forbidden by an administrator. Later, a user with full administrative rights decides to disallow Company Pages from being created on the subsite. This restriction will only apply to all future pages that are published, but not to existing Company Pages. The full administrator (or any user with sufficient publishing rights) will have to manually convert any published Company Pages on the subsite to that of another allowed type. \ No newline at end of file +For example, say a subsite user publishes a new Company Page before it was forbidden by an administrator. Later, a user with full administrative rights decides to disallow Company Pages from being created on the subsite. This restriction will only apply to all future pages that are published, but not to existing Company Pages. The full administrator (or any user with sufficient publishing rights) will have to manually convert any published Company Pages on the subsite to that of another allowed type. + +## Themes +A theme is group of templates, images and CSS for the look of a website. When you are using Subsites you may have different themes installed for your site so you could apply different themes for each subsite. + +## Assets +Assets are files that have been uploaded via the CMS. It is suggested to use a naming convention for files designated to be used on a particular subsite or to create folders for each subsite to help organise them. \ No newline at end of file diff --git a/docs/en/working_with.md b/docs/en/userguide/working_with.md similarity index 82% rename from docs/en/working_with.md rename to docs/en/userguide/working_with.md index 19e32ac..918489f 100644 --- a/docs/en/working_with.md +++ b/docs/en/userguide/working_with.md @@ -2,11 +2,11 @@ ## Managing content across subsites -Select a subsite from the dropdown in the upper left to display the content for that site in the site tree. +To edit a particular subsite, choose the subsite from the dropdown menu in the left-hand menu. ![Subsites dropdown](_images/subsites-dropdown.png) -## Subsites virtual pages +### Subsites virtual pages You can pull in the content from a page that resides on another subsite by creating a page of the type **Subsites Virtual Page**. Pick the subsite from which you want to pull the content, then select the page. As with regular virtual @@ -15,7 +15,7 @@ the original content changes. ![Subsites virtual page](_images/subsites-virtual-page.jpg) -## Duplicating pages from the main site +### Duplicating pages from the main site If you have an existing page on the main site that you would like to copy to a subsite, all you need to do is: From 3f3fa95e2cd3f7037bae52c62febf59b8efd9faf Mon Sep 17 00:00:00 2001 From: Mike Andrewartha Date: Thu, 10 Dec 2015 17:09:23 +1300 Subject: [PATCH 08/38] moved user content into userhelp folder, removed old user manual pdf, added index file, updated readme links --- README.md | 6 +- docs/en/introduction.md | 79 +----------------- docs/en/user_manual.pdf | Bin 276114 -> 0 bytes .../_images/copy-page-to-subsite.jpg | Bin .../_images/copy-structure.jpg | Bin .../_images/disallow-page-types-result.png | Bin .../_images/disallow-page-types.png | Bin .../_images/group-subsites-access.png | Bin .../_images/subsite-admin-security-group.png | Bin .../_images/subsite-configuration.jpg | Bin .../_images/subsites-dropdown.png | Bin .../_images/subsites-virtual-page.jpg | Bin .../{ => userguide}/_images/view-subsites.jpg | Bin docs/en/userguide/index.md | 48 +++++++++++ docs/en/{ => userguide}/set_up.md | 63 +++++++++----- docs/en/{ => userguide}/working_with.md | 6 +- 16 files changed, 99 insertions(+), 103 deletions(-) delete mode 100644 docs/en/user_manual.pdf rename docs/en/{ => userguide}/_images/copy-page-to-subsite.jpg (100%) rename docs/en/{ => userguide}/_images/copy-structure.jpg (100%) rename docs/en/{ => userguide}/_images/disallow-page-types-result.png (100%) rename docs/en/{ => userguide}/_images/disallow-page-types.png (100%) rename docs/en/{ => userguide}/_images/group-subsites-access.png (100%) rename docs/en/{ => userguide}/_images/subsite-admin-security-group.png (100%) rename docs/en/{ => userguide}/_images/subsite-configuration.jpg (100%) rename docs/en/{ => userguide}/_images/subsites-dropdown.png (100%) rename docs/en/{ => userguide}/_images/subsites-virtual-page.jpg (100%) rename docs/en/{ => userguide}/_images/view-subsites.jpg (100%) create mode 100644 docs/en/userguide/index.md rename docs/en/{ => userguide}/set_up.md (62%) rename docs/en/{ => userguide}/working_with.md (82%) diff --git a/README.md b/README.md index c1097b7..58a48fe 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ permissions" will imply that the person will likely be able to escalate his/her For user documentation please see: - 1. [Setting up subsites](docs/en/set_up.md) - 1. [Working with subsites](docs/en/working_with.md) + 1. [Setting up subsites](docs/en/userhelp/set_up.md) + 1. [Working with subsites](docs/en/userhelp/working_with.md) ## Features & limitations @@ -41,7 +41,7 @@ For user documentation please see: * Each subsite domain name has to be set up on the server first, and DNS records need to be updated as appropriate. * A subsite cannot use a different codebase as the main site, they are intrinsically tied - * However, you can remove page types from a subsite when creating the subsite - [see the setup documentation for further details](set_up.md) + * However, you can remove page types from a subsite when creating the subsite - [see the setup documentation for further details](docs/en/userhelp/set_up.md) * The only code a developer can edit between subsites is the theme * The separation between subsites in the CMS needs to be seen as cosmetic, and mostly applicable to the "Pages" and "Files" sections of the CMS. * All subsites run in the same process space and data set. Therefore if an outage affects one subsite it will affect all subsites, and if bad code or hardware corrupts one subsite's data, it's very likely that it has corrupted all subsite data. diff --git a/docs/en/introduction.md b/docs/en/introduction.md index 07dbe98..24eabff 100644 --- a/docs/en/introduction.md +++ b/docs/en/introduction.md @@ -1,84 +1,9 @@ -## Introduction +# Subsites -Subsites is a module to allow you manage multiple related sites from a single CMS interface. - -When Subsites is installed your existing site is defined as the main site, you will be then be able to create related subsites under the main site. - -One of the benefits of subsites is that it is easy to copy pages between the subsites and you have access to all of -the assets across all of the subsites. - -Subsites is not for running unrelated websites on a single SilverStripe instance so if 2 sites have different vhosts -you will not be able to run them with Subsites on a single SilverStripe instance. - -With Subsites you can set up users to have access to all subsites or just a selection of subsites. - -## When to use the Subsites module - -* You have a clear parent/main website and a set of subsites associated with it. -* You have a group of simple, commonly themed websites -* Your websites contain some overlapping content, and you want to avoid the redundancy of making the same update to content that exists on multiple CMS installations. -* You have simple content websites that use the same templates and modules, and are managed by the same team, but have different themes. -* Content editing of the subsites is through the same team, so there is no problem around editors having access to all the files for each subsite, nor around having CMS admin(s) who control access to all the sites. - -## When to avoid the Subsites module - -* You have constraints on what content CMS editors can and cannot view between subsites. -* You have a business critical website, and adding complexity around changes and releases for subsites creates unwanted risk. -* There is a significant security risk around putting the websites into the same CMS installation. This could be the risk of content bleeding between sites, or the risk of an editor on one site gaining access to content on the other site. -* Websites that are distinct and use customised modules and/or bespoke code -* Websites that are owned by different business units and/or managed by different development and web teams. (not technical, it just organisational complexity). - -It is important to remember that the only unique trait each site can have is its theme (look and feel), whilst all the other building blocks of the site — the code, database, and modules — are shared. Therefore, one of the biggest drawbacks to using subsites is exposure to a single point of failure. If there is a bug in code that is only used on one subsite, it nevertheless affects all other subsites, because they share a codebase. Similarly, if the database becomes corrupt, all subsites are affected. Further, it is not possible to create or restore backups of any given subsite. Backups must represent and replace the entire collection of sites. - -## Access - -Access to certain subsites can be limited to administrators based on the groups they are in. -So for example if you had a couple of subsites you could create a group for each subsite and then specify that the -group had access to all subsites or just a specific subsites. -To access this functionality go to - - -Security -> Groups - -![alt text](_images/subsite-admin-security-group.png "Groups") - -Select the group you want to modify and then go to the Subsites tab - -You can also limit the page types that are available for a subsite (but not the main site). -This can be done via accessing the particular subsite you want to amend via the Subsite admin section, underneath the -Subsite theme will be a link called 'Disallow page types?' clicking on that link will display a list of checkboxes for -all of the page types which can be selected to disable that page type for the subsite you are editing. -This is useful when you create a content editor and you do not want them to be able to add certain page types. - -## Theme -A theme is group of templates, images and CSS for the look of a website. -When you are using Subsites you may have different themes installed for your site so you could apply different -themes for each subsite. - -## Page types -Page types refer to the type of pages that can be set up on a site. -A page type will have certain features and functionality some examples on SilverStripe would be 'Page', 'HomePage' -and 'ErrorPage' these all differ to each other in what they would be used for so you would use Page for any pages -underneath the HomePage. - - -You would only have one HomePage for your site and you may have some logic to only allow you to create one of these -pages, ErrorPage would only be used for error pages and would be designed to be very minimal to work in situations -where the site is experiencing difficulties like no DB access. - - -You can set up a Subsite to only work with certain page types so you may have a page type with a contact form for a -particular department so you may set up a new subsite and not allow that page type to be used on a particular subsite. -You will not be able to filter Page Types for the main site. - -## Assets -Assets are files that have been uploaded via the CMS. -It is suggested to use a naming convention for files designated to be used on a particular subsite or to create folders -for each subsite to help organise them. +[User guide](userguide/index.md) ## FAQ - ### How can I restrict a content author to a particular subsite? diff --git a/docs/en/user_manual.pdf b/docs/en/user_manual.pdf deleted file mode 100644 index 2a7e2583a3ffe0503a0f6b5f063bd2e3eca754ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276114 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 z 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